From a0cfbdec6c61e4632895119f431febd4e4b1cc7d Mon Sep 17 00:00:00 2001 From: Emre Ekinci <83828886+ekincixyz@users.noreply.github.com> Date: Mon, 20 May 2024 15:43:50 +0100 Subject: [PATCH 01/56] Update README.md updated features --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1cefde3c..8070d7cc 100644 --- a/README.md +++ b/README.md @@ -77,14 +77,13 @@ cargo install trident-cli Simplifies the testing process by automatically creating templates for fuzz and integration tests for programs written using the [Anchor Framework](https://project-serum.github.io/anchor/). ### Dynamic Data Generation -Increases coverage with random instruction data and pseudo-random accounts for unpredictable fuzz test scenarios. +Increases test coverage with random instruction data and pseudo-random accounts for unpredictable fuzz test scenarios. ### Custom Instruction Sequences Provides the flexibility to design specific sequences of instructions to meet particular testing needs or to focus on particular aspects of program behavior during fuzz testing. ### Invariant Checks -Allows for custom pre- and post-execution invariants checks to spot vulnerabilities and unwanted behaviors. - +Allows for custom invariants checks to spot vulnerabilities and unwanted behaviors.
## Community From 592b114415c5b37db0597163e28d880513ecda4b Mon Sep 17 00:00:00 2001 From: lukacan Date: Mon, 20 May 2024 16:45:09 +0200 Subject: [PATCH 02/56] =?UTF-8?q?=F0=9F=93=9D=20update=20urls=20in=20readm?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- documentation/mkdocs.yml | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8070d7cc..2bb5a532 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,10 @@ ## Documentation -For documentation and guides, visit [ackee.xyz/trident/docs](https://ackee.xyz/trident/docs/latest/). +For documentation and guides, visit [ackee.xyz/trident/docs](https://ackee.xyz/trident/docs/). ## Prerequisites -Check [Supported versions](https://ackee.xyz/trident/docs/latest/home/home-installation/) section for further details. +Check [Supported versions](https://ackee.xyz/trident/docs/home/home-installation/#supported-versions) section for further details. - Install [Rust](https://www.rust-lang.org/tools/install) - Install [Solana tool suite](https://docs.solana.com/cli/install-solana-cli-tools) - Install [Anchor](https://www.anchor-lang.com/docs/installation) @@ -74,7 +74,7 @@ cargo install trident-cli ## Features ### Automated Test Generation -Simplifies the testing process by automatically creating templates for fuzz and integration tests for programs written using the [Anchor Framework](https://project-serum.github.io/anchor/). +Simplifies the testing process by automatically creating templates for fuzz and integration tests for programs written using the [Anchor Framework](https://www.anchor-lang.com/). ### Dynamic Data Generation Increases test coverage with random instruction data and pseudo-random accounts for unpredictable fuzz test scenarios. diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index a7fd179e..720bd68d 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -119,6 +119,8 @@ markdown_extensions: anchor_linenums: true line_spans: __span pygments_lang_class: true + - toc: + permalink: "#" - pymdownx.inlinehilite - pymdownx.snippets - pymdownx.superfences From 3cd3bd919457bf0674da007d37bb8feebb6581c9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Mon, 20 May 2024 18:22:59 +0200 Subject: [PATCH 03/56] =?UTF-8?q?=F0=9F=93=8C=20bump=20crate=20versions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ README.md | 1 - crates/client/Cargo.toml | 11 +++++++---- crates/client/derive/display_ix/Cargo.toml | 4 ++++ crates/client/derive/fuzz_deserialize/Cargo.toml | 3 +++ crates/client/derive/fuzz_test_executor/Cargo.toml | 3 +++ 6 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd18c0ed..0d0222f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [Unreleased] + +## [0.6.0] - 2024-05-20 ### Added - feat/anchor 0.30.0 support ([#148](https://github.com/Ackee-Blockchain/trident/pull/148)) - fix/allow to process duplicate transactions ([#147](https://github.com/Ackee-Blockchain/trident/pull/147)) diff --git a/README.md b/README.md index 2bb5a532..4b48b165 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,6 @@ Test Escrow and Turnstile -


diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index a7150246..6ae6cea2 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -23,14 +23,17 @@ pretty_assertions = "1.1.0" macrotest = "1.0.9" [dependencies] -trident-derive-displayix = { path = "./derive/display_ix" } -trident-derive-fuzz-deserialize = { path = "./derive/fuzz_deserialize" } -trident-derive-fuzz-test-executor = { path = "./derive/fuzz_test_executor" } +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 } # 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-lang = { version = ">=0.29.0", features = [ + "idl-build", + "init-if-needed", +] } anchor-syn = { version = ">=0.29.0" } solana-sdk = { workspace = true } solana-cli-output = { workspace = true } diff --git a/crates/client/derive/display_ix/Cargo.toml b/crates/client/derive/display_ix/Cargo.toml index 4d73e4d4..a8bf1c66 100644 --- a/crates/client/derive/display_ix/Cargo.toml +++ b/crates/client/derive/display_ix/Cargo.toml @@ -3,6 +3,10 @@ name = "trident-derive-displayix" version = "0.0.1" rust-version = "1.60" edition = "2021" +license-file = "../../../../LICENSE" +readme = "../../../../README.md" +description = "trident-derive-displayix" + [lib] proc-macro = true diff --git a/crates/client/derive/fuzz_deserialize/Cargo.toml b/crates/client/derive/fuzz_deserialize/Cargo.toml index 8b088212..fe882895 100644 --- a/crates/client/derive/fuzz_deserialize/Cargo.toml +++ b/crates/client/derive/fuzz_deserialize/Cargo.toml @@ -3,6 +3,9 @@ name = "trident-derive-fuzz-deserialize" version = "0.0.1" rust-version = "1.60" edition = "2021" +license-file = "../../../../LICENSE" +readme = "../../../../README.md" +description = "trident-derive-fuzz-deserialize" [lib] proc-macro = true diff --git a/crates/client/derive/fuzz_test_executor/Cargo.toml b/crates/client/derive/fuzz_test_executor/Cargo.toml index f2830e33..aabecf6c 100644 --- a/crates/client/derive/fuzz_test_executor/Cargo.toml +++ b/crates/client/derive/fuzz_test_executor/Cargo.toml @@ -3,6 +3,9 @@ name = "trident-derive-fuzz-test-executor" version = "0.0.1" rust-version = "1.60" edition = "2021" +license-file = "../../../../LICENSE" +readme = "../../../../README.md" +description = "trident-derive-fuzz-test-executor" [lib] proc-macro = true From 2edc2bfcc26c99916dfa5b594835c65f7e9ba79f Mon Sep 17 00:00:00 2001 From: Emre Ekinci <83828886+ekincixyz@users.noreply.github.com> Date: Mon, 20 May 2024 19:23:45 +0100 Subject: [PATCH 04/56] Update README.md added break --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 4b48b165..635aa7b0 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,8 @@ Provides the flexibility to design specific sequences of instructions to meet pa ### Invariant Checks Allows for custom invariants checks to spot vulnerabilities and unwanted behaviors. +

+
## Community From 055e295cc310fb6d56c6840624e2695cc7607cad Mon Sep 17 00:00:00 2001 From: lukacan Date: Mon, 20 May 2024 21:06:59 +0200 Subject: [PATCH 05/56] =?UTF-8?q?=F0=9F=9A=91=EF=B8=8F=20update=20docs=20b?= =?UTF-8?q?efore=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documentation/docs/index.md | 41 ++++++------------------------------- 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/documentation/docs/index.md b/documentation/docs/index.md index ba69b5ca..8bf0794b 100644 --- a/documentation/docs/index.md +++ b/documentation/docs/index.md @@ -1,40 +1,11 @@ -
- Trident Logo -
- - # {{ config.site_name }} +Trident is a Rust-based framework to fuzz and integration test Solana programs to help you ship secure code. -developed by [Ackee Blockchain](https://ackeeblockchain.com) - -Trident is a Rust-based testing framework providing several convenient developer tools for testing Solana programs written in [Anchor](https://www.anchor-lang.com/). - -- **{{ config.site_name }} fuzz** - property-based and stateful testing; -- **{{ config.site_name }} test** - run your integration tests on a local validator; -- {{ config.site_name }} explorer - exploring ledger changes. - - Currently, not in active development - -## Roadmap - -- [x] Q1/22 {{ config.site_name }} announcement at Solana Hacker House Prague. - - [x] {{ config.site_name }} client available for testing. -- [x] Q2/22 {{ config.site_name }} explorer available. -- [x] Q2/22 {{ config.site_name }} client and explorer introduced at Solana Hacker House Barcelona. -- [X] Q3/23 {{ config.site_name }} fuzz introduced at Solana Hacker House Berlin. -- [X] Q1/24 {{ config.site_name }} ProgramTest client implemented for fuzz tests. -- [X] Q1/24 {{ config.site_name }} Fuzz support for all Anchor Account types. -- [X] Q1/24 {{ config.site_name }} Support for Anchor 0.30.0. -- [ ] Q2/24 {{ config.site_name }} Light-Client for fuzz tests. - - -## Awards - -**Marinade Community Prize** - winner of the [Marinade grant](https://solana.blog/riptide-hackathon-winners/) for the 2022 Solana Riptide Hackathon. +# Features +- **Automated Test Generation**: Simplifies the testing process by automatically creating templates for fuzz and integration tests for programs written using the Anchor Framework. -## University and investment partners +- **Dynamic Data Generation**: Increases test coverage with random instruction data and pseudo-random accounts for unpredictable fuzz test scenarios. -- [The Solana Foundation](https://solana.org/) -- [Czech Technical University in Prague](https://www.cvut.cz/en) -- [Ackee](https://www.ackee.cz/) -- [Rockaway Blockchain Fund](https://rbf.capital/) +- **Custom Instruction Sequences**: Provides the flexibility to design specific sequences of instructions to meet particular testing needs or to focus on particular aspects of program behavior during fuzz testing. +Invariant Checks: Allows for custom invariants checks to spot vulnerabilities and unwanted behaviors. From f7f2ae2c77dc139dcb0c1582d27e36a32ce40b9e Mon Sep 17 00:00:00 2001 From: lukacan Date: Tue, 21 May 2024 11:05:10 +0200 Subject: [PATCH 06/56] =?UTF-8?q?=F0=9F=93=9D=20fix=20discord=20link?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 635aa7b0..ef254973 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@

- + Chat From aa57e8967b157fb485565e1ab8f928d0adcc75f3 Mon Sep 17 00:00:00 2001 From: andrej Date: Tue, 21 May 2024 15:52:34 +0200 Subject: [PATCH 07/56] =?UTF-8?q?=F0=9F=93=9D=20(add=20mike):=20Add=20mike?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-documentation.yaml | 5 +++-- documentation/docs/overrides/main.html | 8 ++++++++ documentation/mkdocs.yml | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 documentation/docs/overrides/main.html diff --git a/.github/workflows/build-documentation.yaml b/.github/workflows/build-documentation.yaml index 15f69d12..eb643047 100644 --- a/.github/workflows/build-documentation.yaml +++ b/.github/workflows/build-documentation.yaml @@ -4,6 +4,7 @@ on: workflow_dispatch: push: branches: + - develop - master jobs: @@ -21,9 +22,9 @@ jobs: - name: Build documentation working-directory: ./documentation run: | - git config --global user.email "trident@ackeeblockchain.com" + git config --global user.email "trident@ackee.xyz" git config --global user.name "Trident bot" - mike deploy -b documentation latest + mike deploy -b documentation dev - name: Checkout documentation branch run: git checkout -f documentation - name: Push documentation diff --git a/documentation/docs/overrides/main.html b/documentation/docs/overrides/main.html new file mode 100644 index 00000000..033fa3c1 --- /dev/null +++ b/documentation/docs/overrides/main.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block outdated %} +You're not viewing the latest version. + + Click here to go to latest. + +{% endblock %} diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index 720bd68d..b82b3edb 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -98,6 +98,8 @@ extra: link: https://discord.gg/x7qXXnGCsa - icon: fontawesome/brands/twitter link: https://twitter.com/ackeeblockchain + version: + provider: mike # https://www.mkdocs.org/user-guide/configuration/#plugins plugins: From 18a057f112e3e2ae58228c58b7b7b3dbb3148f0b Mon Sep 17 00:00:00 2001 From: lukacan Date: Tue, 21 May 2024 22:07:21 +0200 Subject: [PATCH 08/56] =?UTF-8?q?=F0=9F=93=9D=20remove=20changelog=20from?= =?UTF-8?q?=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- documentation/docs/home/changelog/0-2-0.md | 7 ---- documentation/docs/home/changelog/0-3-0.md | 11 ------ documentation/docs/home/changelog/0-4-1.md | 10 ----- documentation/docs/home/changelog/0-5-0.md | 9 ----- documentation/docs/home/changelog/0-6-0.md | 43 ---------------------- documentation/docs/home/changelog/index.md | 9 ----- documentation/mkdocs.yml | 9 ----- 7 files changed, 98 deletions(-) delete mode 100644 documentation/docs/home/changelog/0-2-0.md delete mode 100644 documentation/docs/home/changelog/0-3-0.md delete mode 100644 documentation/docs/home/changelog/0-4-1.md delete mode 100644 documentation/docs/home/changelog/0-5-0.md delete mode 100644 documentation/docs/home/changelog/0-6-0.md delete mode 100644 documentation/docs/home/changelog/index.md diff --git a/documentation/docs/home/changelog/0-2-0.md b/documentation/docs/home/changelog/0-2-0.md deleted file mode 100644 index 3dfc6cdf..00000000 --- a/documentation/docs/home/changelog/0-2-0.md +++ /dev/null @@ -1,7 +0,0 @@ -# v[0.2.0] - -## Date -- 2022-07-27 - -## Added -- Trident is now configurable. This requires the `Trident.toml` file to exist in the project's root directory - without this file, the execution will fail. To solve this re-run the `trident init` or just create an empty `Trident.toml` file in the project's root directory. diff --git a/documentation/docs/home/changelog/0-3-0.md b/documentation/docs/home/changelog/0-3-0.md deleted file mode 100644 index 98183824..00000000 --- a/documentation/docs/home/changelog/0-3-0.md +++ /dev/null @@ -1,11 +0,0 @@ -# v[0.3.0] - -## Date -- 2022-09-23 - -## Changed -- Upgrade Solana (`~1.10`) and Anchor framework (`~0.25`) versions - -## Added -- Custom Solana RPC error reporter. If the Solana RPC error is thrown, the error code, message and data (logs) are reported to the output. -- Custom imports in the `.program_client`. The user is able to import custom types and structures into the program client. The import part of the code would not be re-generated. diff --git a/documentation/docs/home/changelog/0-4-1.md b/documentation/docs/home/changelog/0-4-1.md deleted file mode 100644 index c6fa9686..00000000 --- a/documentation/docs/home/changelog/0-4-1.md +++ /dev/null @@ -1,10 +0,0 @@ -# v[0.4.1] - -## Date -- 2023-08-21 - -## Changed -- Upgrade Solana (`=1.16.6`) and Anchor framework (`=0.28.0`) versions. -## Fixed -- Implemented Anchor Client logic was not able to work with a newer version of Anchor. Fixed with `async_rpc` and `async` feature. -- Trident init IDL Parse Error on a newer version of Rust, fixed with updated `accounts` token. diff --git a/documentation/docs/home/changelog/0-5-0.md b/documentation/docs/home/changelog/0-5-0.md deleted file mode 100644 index 0e6f99a9..00000000 --- a/documentation/docs/home/changelog/0-5-0.md +++ /dev/null @@ -1,9 +0,0 @@ -# v[0.5.0] - -## Date -- 2023-08-28 - -## Added -- cli: Added trident subcommand `fuzz` to run and debug fuzz tests using honggfuzz-rs. -- cli: Added trident `--skip-fuzzer` option for `init` subcommand to skip generation of fuzz test templates. -- client: Added new Cargo feature `fuzzing` that enables optional dependencies related to fuzz testing. diff --git a/documentation/docs/home/changelog/0-6-0.md b/documentation/docs/home/changelog/0-6-0.md deleted file mode 100644 index 62fcf76d..00000000 --- a/documentation/docs/home/changelog/0-6-0.md +++ /dev/null @@ -1,43 +0,0 @@ -# v[0.6.0] - -## Date -- 2024-05-20 - -## Added -- feat/anchor 0.30.0 support ([#148](https://github.com/Ackee-Blockchain/trident/pull/148)) -- fix/allow to process duplicate transactions ([#147](https://github.com/Ackee-Blockchain/trident/pull/147)) -- feat/possibility to implement custom transaction error handling ([#145](https://github.com/Ackee-Blockchain/trident/pull/145)) -- feat/support of automatically obtaining fully qualified paths of Data Accounts Custom types for `accounts_snapshots.rs` ([#141](https://github.com/Ackee-Blockchain/trident/pull/141)) -- feat/allow direct accounts manipulation and storage ([#142](https://github.com/Ackee-Blockchain/trident/pull/142)) -- feat/support of non-corresponding instruction and context names ([#130](https://github.com/Ackee-Blockchain/trident/pull/130)) -- feat/refactored and improved program flow during init and build, added activity indicator ([#129](https://github.com/Ackee-Blockchain/trident/pull/129)) -- feat/allow solana versions up to v1.17.* and pin Rust 1.77 nightly compiler ([#128](https://github.com/Ackee-Blockchain/trident/pull/128)) -- feat/new init command option to initialize fuzz or poc tests only ([#124](https://github.com/Ackee-Blockchain/trident/pull/124)) -- feat/debug-mode detailed output ([#125](https://github.com/Ackee-Blockchain/trident/pull/125)) -- feat/anchor 0.29.0 support ([#121](https://github.com/Ackee-Blockchain/trident/pull/121)) -- doc/add help comment + update documentation ([#120](https://github.com/Ackee-Blockchain/trident/pull/120)) -- feat/fuzzer error handling ([#118](https://github.com/Ackee-Blockchain/trident/pull/118)) -- feat/convert fuzz Pubkey to AccountId ([#116](https://github.com/Ackee-Blockchain/trident/pull/116)) -- feat/additional anchor types ([#115](https://github.com/Ackee-Blockchain/trident/pull/115)) -- feat/import ToAccountInfo trait in fuzzing prelude ([#113](https://github.com/Ackee-Blockchain/trident/pull/113)) -- test/added code generation and macros tests ([#112](https://github.com/Ackee-Blockchain/trident/pull/112)) -- feat/fuzzer framework core, macros, helpers, templates, and examples. ([#111](https://github.com/Ackee-Blockchain/trident/pull/111)) -- feat/improved trident-tests folder structure for PoC and Fuzz Tests ([#109](https://github.com/Ackee-Blockchain/trident/pull/109)) -- feat/support for additional fuzzer parameters in Trident.toml config file ([#107](https://github.com/Ackee-Blockchain/trident/pull/107)) -- feat/posibility to pass params to the fuzzer via Trident.toml config file ([#106](https://github.com/Ackee-Blockchain/trident/pull/106)) -- feat/client now reads by default keypair from default location ([#105](https://github.com/Ackee-Blockchain/trident/pull/105)) -- feat/added new --exit-code option to return corresponding exit code based on fuzz test result ([#104](https://github.com/Ackee-Blockchain/trident/pull/104)) -- feat/removed/updated deprecated functions, removed allow deprecated macros ([#103](https://github.com/Ackee-Blockchain/trident/pull/103)) -- feat/added new function to read keypair file generated by Anchor ([#102](https://github.com/Ackee-Blockchain/trident/pull/102)) -- feat/clean command ([#101](https://github.com/Ackee-Blockchain/trident/pull/101)) -- feat/improved program_client generated code ([#100](https://github.com/Ackee-Blockchain/trident/pull/100)) -- feat/automatically add hfuzz_target to .gitignore file ([#99](https://github.com/Ackee-Blockchain/trident/pull/99)) -- feat/support for dynamic templates. ([#98](https://github.com/Ackee-Blockchain/trident/pull/98)) - -## Fixed -- fix/refactored fuzz test executor error handling ([#127](https://github.com/Ackee-Blockchain/trident/pull/127)) -- fix/warn user on composite accounts and continue fuzz test generation ([#133](https://github.com/Ackee-Blockchain/trident/pull/133)) -- fix/progress bar loop lock release ([#132](https://github.com/Ackee-Blockchain/trident/pull/132)) -- fix/fixed fuzz test generation with init-if-needed Anchor feature ([#131](https://github.com/Ackee-Blockchain/trident/pull/131)) -- fix/program client custom types ([#117](https://github.com/Ackee-Blockchain/trident/pull/117)) -- fix/check fuzz test name collision by checking the name against HashSet ([#114](https://github.com/Ackee-Blockchain/trident/pull/114)) diff --git a/documentation/docs/home/changelog/index.md b/documentation/docs/home/changelog/index.md deleted file mode 100644 index c4b241bf..00000000 --- a/documentation/docs/home/changelog/index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this section. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) (SemVer). - -**Note**: Version 0 of Semantic Versioning is handled differently from version 1 and above. The minor version will be -incremented upon a breaking change and the patch version will be incremented for features. diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index b82b3edb..deaf6728 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -14,15 +14,6 @@ nav: - Contributing: home/CONTRIBUTING.md - License: home/LICENSE.md - Code of conduct: home/CODE_OF_CONDUCT.md - - Changelog: - # index page for changelog - - home/changelog/index.md - - home/changelog/0-6-0.md - - home/changelog/0-5-0.md - - home/changelog/0-4-1.md - - home/changelog/0-3-0.md - - home/changelog/0-2-0.md - - Fuzz Tests: - Introduction: fuzzing/fuzzing-introduction.md - Initialization: From 2533d24e0e5040bbebbdb241548b5d957fdcdc50 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 22 May 2024 12:08:20 +0200 Subject: [PATCH 09/56] =?UTF-8?q?=F0=9F=93=9D=20update=20documentation=20s?= =?UTF-8?q?tructure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-documentation.yaml | 6 +- CHANGELOG.md | 2 +- documentation/docs/CHANGELOG.md | 1 + .../fuzzing/fuzzing-current-limitations.md | 2 + .../docs/fuzzing/fuzzing-examples.md | 2 + .../docs/fuzzing/fuzzing-introduction.md | 4 +- .../docs/fuzzing/fuzzing-lifecycle.md | 2 + .../docs/fuzzing/fuzzing-run-debug.md | 2 + documentation/docs/home/CODE_OF_CONDUCT.md | 35 -------- documentation/docs/home/CONTRIBUTING.md | 77 ----------------- documentation/docs/home/LICENSE.md | 21 ----- documentation/docs/home/home-installation.md | 2 + documentation/docs/index.md | 3 +- .../docs/integration-tests/poc-examples.md | 2 + .../integration-tests/poc-introduction.md | 2 +- documentation/docs/overrides/main.html | 8 -- documentation/docs/stylesheets/extra.css | 26 +++--- documentation/mkdocs.yml | 82 +++++++++---------- 18 files changed, 77 insertions(+), 202 deletions(-) create mode 120000 documentation/docs/CHANGELOG.md delete mode 100644 documentation/docs/home/CODE_OF_CONDUCT.md delete mode 100644 documentation/docs/home/CONTRIBUTING.md delete mode 100644 documentation/docs/home/LICENSE.md delete mode 100644 documentation/docs/overrides/main.html diff --git a/.github/workflows/build-documentation.yaml b/.github/workflows/build-documentation.yaml index eb643047..3290408f 100644 --- a/.github/workflows/build-documentation.yaml +++ b/.github/workflows/build-documentation.yaml @@ -12,10 +12,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Set up Python + with: + ssh-key: ${{ secrets.DOCUMENTATION_DEPLOY_KEY }} + - name: Set up Python 3.10 uses: actions/setup-python@v4 with: - python-version: '3.10' + python-version: "3.10" - uses: ./.github/actions/setup-documentation/ - name: Fetch documentation branch run: git fetch origin documentation:documentation --depth=1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d0222f3..c7c0f080 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 **Note**: Version 0 of Semantic Versioning is handled differently from version 1 and above. The minor version will be incremented upon a breaking change and the patch version will be incremented for features. -## [Unreleased] +## [dev] - Unreleased ## [0.6.0] - 2024-05-20 ### Added diff --git a/documentation/docs/CHANGELOG.md b/documentation/docs/CHANGELOG.md new file mode 120000 index 00000000..699cc9e7 --- /dev/null +++ b/documentation/docs/CHANGELOG.md @@ -0,0 +1 @@ +../../CHANGELOG.md \ No newline at end of file diff --git a/documentation/docs/fuzzing/fuzzing-current-limitations.md b/documentation/docs/fuzzing/fuzzing-current-limitations.md index dcfda550..5f3ae35b 100644 --- a/documentation/docs/fuzzing/fuzzing-current-limitations.md +++ b/documentation/docs/fuzzing/fuzzing-current-limitations.md @@ -1,3 +1,5 @@ +# Current limitations + 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. diff --git a/documentation/docs/fuzzing/fuzzing-examples.md b/documentation/docs/fuzzing/fuzzing-examples.md index cdef7cb6..8ad0b018 100644 --- a/documentation/docs/fuzzing/fuzzing-examples.md +++ b/documentation/docs/fuzzing/fuzzing-examples.md @@ -1,3 +1,5 @@ +# Fuzzing Examples + ### Hello World! Example - [hello_world](https://github.com/Ackee-Blockchain/trident/tree/master/examples/fuzz-tests/hello_world) diff --git a/documentation/docs/fuzzing/fuzzing-introduction.md b/documentation/docs/fuzzing/fuzzing-introduction.md index 6cf6dbd1..76a1da8a 100644 --- a/documentation/docs/fuzzing/fuzzing-introduction.md +++ b/documentation/docs/fuzzing/fuzzing-introduction.md @@ -1,8 +1,8 @@ -# Fuzzing +# Introduction Fuzzing is a software testing technique that involves providing invalid, unexpected, or random data as inputs to a computer program. The aim is to uncover bugs and vulnerabilities that might not be detected with conventional testing strategies. -# Introduction +# {{ config.site_name }} The `{{ config.site_name }}` testing framework equips developers with tools to efficiently develop fuzz tests for Anchor-based programs. It streamlines the fuzz testing process through automation and comprehensive support: diff --git a/documentation/docs/fuzzing/fuzzing-lifecycle.md b/documentation/docs/fuzzing/fuzzing-lifecycle.md index 0d32fd9b..490fd5a4 100644 --- a/documentation/docs/fuzzing/fuzzing-lifecycle.md +++ b/documentation/docs/fuzzing/fuzzing-lifecycle.md @@ -1,3 +1,5 @@ +# Fuzz Test Lifecycle + In the sequence diagram below you can see a simplified fuzz test lifecycle. Some diagram states are labeled with emojis: diff --git a/documentation/docs/fuzzing/fuzzing-run-debug.md b/documentation/docs/fuzzing/fuzzing-run-debug.md index 5ba69644..f2072e47 100644 --- a/documentation/docs/fuzzing/fuzzing-run-debug.md +++ b/documentation/docs/fuzzing/fuzzing-run-debug.md @@ -1,3 +1,5 @@ +# Run and Debug + ## Run Once you have finished the implementation of the Fuzz Test, you can run the Test as follows: diff --git a/documentation/docs/home/CODE_OF_CONDUCT.md b/documentation/docs/home/CODE_OF_CONDUCT.md deleted file mode 100644 index dfe57394..00000000 --- a/documentation/docs/home/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,35 +0,0 @@ -# Code of Conduct - -Our company values guide us in our day-to-day interactions and decision-making. Our open source projects are no exception. Trust, respect, and collaboration are core values, and we believe they should live and breathe within our projects. Our community welcomes participants from around the world with different experiences, unique perspectives, and great ideas to share. - -## Our Pledge - -In the interest of the fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -- Using welcoming and inclusive language -- Being respectful of differing viewpoints and experiences -- Gracefully accepting constructive criticism -- Attempting collaboration before conflict -- Focusing on what is best for the community -- Showing empathy towards other community members - -Examples of **unacceptable** behavior by participants include: - -- Violence, threats of violence, or inciting others to commit self-harm -- The use of sexualized language or imagery and unwelcome sexual attention or advances -- Trolling, intentionally spreading misinformation, insulting / derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or electronic address, without explicit permission -- Abuse of the reporting process to intentionally harass or exclude others -- Advocating for or encouraging any of the above behavior -- Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, comment, or reject any commits, issues, and other contributions that are not aligned to this Code of Conduct or temporarily or permanently ban any contributor for inappropriate, threatening, offensive, or harmful behaviour. diff --git a/documentation/docs/home/CONTRIBUTING.md b/documentation/docs/home/CONTRIBUTING.md deleted file mode 100644 index 3ec6cfda..00000000 --- a/documentation/docs/home/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ -# Contributing - -Welcome and thank you for considering contributing to {{ config.site_name }} open source! - -Reading and following these guidelines will help us make the contribution process easy and effective for everyone involved. It also communicates that you agree to respect the time of developers managing and developing the {{ config.site_name }} project. In return, we will reciprocate that respect by addressing your issue, assessing changes and helping you finalize your PRs. - -## Table of Contents - -- [Code of Conduct](./CODE_OF_CONDUCT.md) -- [Getting Started](#getting-started) - - [Issues](#issues) - - [PRs](#prs) -- [Getting Help](#getting-help) - -## Code of Conduct - -We take our open source and community seriously and hold ourselves and other contributors to high communication standards. By participating and contributing to this project, you agree to uphold our [Code of Conduct](./CODE_OF_CONDUCT.md). - -## Getting Started - -Contributors are made to this repository via issues and pull requests (PRs). A few general guidelines that cover both: - -- Search for existing issues and pull requests before creating your own -- We work hard to ensure issues are handled promptly but depending on the impact, it could take a while to investigate the root cause. A friendly ping in the comment thread to the submitter or a contributor can help draw attention if your issue is blocked. -- If you have never contributed before, see the [First contribution guideline](https://github.com/firstcontributions/first-contributions) and the [Open source guide](https://opensource.guide/how-to-contribute/) for resources and tips on how to get started - -### Issues - -Issues should be used to report problems with the library, request a new feature, or discuss potential changes before a PR is created. - -If you find an issue that addresses your problem, please add your reproduction information to the existing issue rather than creating a new one. Adding a [reaction](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) can also help indicate to our maintainers that a particular problem is affecting more than just the reporter. - -So, to wrap it up: - -- Search for an existing issue before you create your own -- Create an issue before you create a new PR -- Describe your problems or needs as good as you can -- If you are reporting a bug, do not forget to add steps to reproduce, versions (Rust and {{ config.site_name }}), a full error message, or describe the bad behaviour that happened -- If possible, do your own investigation and describe how to fix the problem / what is the problem / how to implement it or improve it - -### PRs - -PRs to our project are always welcome! It can be a quick way to get your fix or improvement slated for the next release. In general, PRs should: - -- Only fix or add the functionality in question or address wide-spread whitespace / style issues, not both -- Add unit or integration tests for fixed or changed functionality (if a test suite already exists) -- Address a single concern in the least number of changed lines as possible -- Include documentation in the repository or on our docs site -- Rebase instead of merge - -For changes that address core functionality or would require breaking changes (e.g. a major release), it is best to open an issue to discuss your proposal first. It would be really nice to do it because it can save time creating and reviewing changes. - -In general, we follow the [Fork-and-pull Git workflow](https://github.com/susam/gitpr): - -1. Fork the repository to your own GitHub account -2. Clone the project to your machine -3. Create a branch locally with a succinct but descriptive name -4. Commit changes to the branch -5. Following any formatting and testing guidelines specific for this repository -6. Push changes to your fork -7. Open a PR in our repository and add reviewers - -So, to wrap it up: - -- Follow our naming and commit conventions - - Use the emojis from [gitmoji](https://gitmoji.dev/) at the beginning of the commit message, [see our commit messages](https://github.com/Ackee-Blockchain/trident/commits/master) - - Add link to the issue at the end of the commit message - - For example: `✨ split test command into build and test - #1, #2` -- Do not modify files that are not related to the issue you are working on - - If you want to improve formatting, methods, and the other files that are not related to the issue, please create a new issue and do the changes in a new branch / PR -- Do not forget to add maintainers as reviewers (at least one of them) to your PRs - - [@ikrk](https://github.com/Ikrk) - - [@lukacan](https://github.com/lukacan) - -## Getting Help - -Join us in the [Ackee Blockchain Discord](https://discord.gg/x7qXXnGCsa) and post your question there. diff --git a/documentation/docs/home/LICENSE.md b/documentation/docs/home/LICENSE.md deleted file mode 100644 index da9774e4..00000000 --- a/documentation/docs/home/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Ackee Blockchain - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/documentation/docs/home/home-installation.md b/documentation/docs/home/home-installation.md index 98f6b241..d8138d75 100644 --- a/documentation/docs/home/home-installation.md +++ b/documentation/docs/home/home-installation.md @@ -1,3 +1,5 @@ +# Installation + ## Dependencies Check [supported versions](#supported-versions) section for further details. diff --git a/documentation/docs/index.md b/documentation/docs/index.md index 8bf0794b..508069cf 100644 --- a/documentation/docs/index.md +++ b/documentation/docs/index.md @@ -1,5 +1,6 @@ # {{ config.site_name }} -Trident is a Rust-based framework to fuzz and integration test Solana programs to help you ship secure code. + +{{ config.site_name }} is a Rust-based framework to fuzz and integration test Solana programs to help you ship secure code. # Features diff --git a/documentation/docs/integration-tests/poc-examples.md b/documentation/docs/integration-tests/poc-examples.md index e5ed39c9..367d307b 100644 --- a/documentation/docs/integration-tests/poc-examples.md +++ b/documentation/docs/integration-tests/poc-examples.md @@ -1,2 +1,4 @@ +# Examples + - [Escrow](https://github.com/Ackee-Blockchain/trident/tree/master/examples/integration-tests/escrow) - [Turnstile](https://github.com/Ackee-Blockchain/trident/tree/master/examples/integration-tests/turnstile) diff --git a/documentation/docs/integration-tests/poc-introduction.md b/documentation/docs/integration-tests/poc-introduction.md index e7c1e0b3..6da4ebed 100644 --- a/documentation/docs/integration-tests/poc-introduction.md +++ b/documentation/docs/integration-tests/poc-introduction.md @@ -1,4 +1,4 @@ -# Integration Tests +# Introduction {{ config.site_name }} supports writing Integration Tests in Rust.

diff --git a/documentation/docs/overrides/main.html b/documentation/docs/overrides/main.html deleted file mode 100644 index 033fa3c1..00000000 --- a/documentation/docs/overrides/main.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "base.html" %} - -{% block outdated %} -You're not viewing the latest version. - - Click here to go to latest. - -{% endblock %} diff --git a/documentation/docs/stylesheets/extra.css b/documentation/docs/stylesheets/extra.css index 6a05517c..28a71b37 100644 --- a/documentation/docs/stylesheets/extra.css +++ b/documentation/docs/stylesheets/extra.css @@ -1,5 +1,14 @@ -@import url('https://fonts.googleapis.com/css2?family=Merriweather:wght@700&display=swap'); -@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + + +.md-typeset h1, +.md-typeset h2, +.md-typeset h3, +.md-typeset h4, +.md-typeset h5, +.md-typeset h6 { + font-family: 'Inter', serif; +} /* update colour of comments in code block @@ -10,22 +19,15 @@ --md-code-hl-comment-color: #09902d; } -/* Update font and font size of "# Title 1" */ -.md-typeset h1 { - font-size: 32px; - font-family: 'Merriweather', serif; - padding: 12px; - margin-bottom: 20px; -} - /* Update font of basic text*/ body { - font-family: 'Source Sans Pro', sans-serif; + font-family: 'Inter', serif; } /* rotate hue so that the image will be modified based on the background */ -[data-md-color-scheme="default"] .excalidraw svg, [data-md-color-scheme="default"] span.excalidraw { +[data-md-color-scheme="default"] .excalidraw svg, +[data-md-color-scheme="default"] span.excalidraw { filter: invert(1) hue-rotate(90deg); } diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index deaf6728..0be7dc1e 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -8,43 +8,40 @@ site_author: Ackee Blockchain nav: - - Home: - - Trident: index.md - - Installation: home/home-installation.md - - Contributing: home/CONTRIBUTING.md - - License: home/LICENSE.md - - Code of conduct: home/CODE_OF_CONDUCT.md - - Fuzz Tests: - - Introduction: fuzzing/fuzzing-introduction.md - - Initialization: - - fuzzing/initialization/fuzzing-initialization-fuzz.md - - fuzzing/initialization/fuzzing-initialization-fuzz-add.md - - fuzzing/initialization/fuzzing-initialization-all.md - - Fuzz Test Lifecycle: fuzzing/fuzzing-lifecycle.md - - How-To write Fuzz Test: - - fuzzing/howto/fuzzing-howto-p0.md - - fuzzing/howto/fuzzing-howto-p1.md - - fuzzing/howto/fuzzing-howto-p2.md - - fuzzing/howto/fuzzing-howto-p3.md - - fuzzing/howto/fuzzing-howto-p4.md - - fuzzing/howto/fuzzing-howto-p5.md - - fuzzing/howto/fuzzing-howto-p6.md - - fuzzing/howto/fuzzing-howto-p7.md - - Run and Debug: fuzzing/fuzzing-run-debug.md - - Current limitations: fuzzing/fuzzing-current-limitations.md - - Examples: fuzzing/fuzzing-examples.md - - Integration Tests: - - Introduction: integration-tests/poc-introduction.md - - Initialization: - - integration-tests/initialization/poc-initialization-poc.md - - integration-tests/initialization/poc-initialization-program-client.md - - integration-tests/initialization/poc-initialization-all.md - - How-To write Integration Test: - - integration-tests/howto/poc-howto-p0.md - - integration-tests/howto/poc-howto-p1.md - - Run: integration-tests/poc-run.md - - Examples: integration-tests/poc-examples.md - + - Trident: + - index.md + - home/home-installation.md + - Fuzz Tests: + - fuzzing/fuzzing-introduction.md + - Initialization: + - fuzzing/initialization/fuzzing-initialization-fuzz.md + - fuzzing/initialization/fuzzing-initialization-fuzz-add.md + - fuzzing/initialization/fuzzing-initialization-all.md + - fuzzing/fuzzing-lifecycle.md + - How-To write Fuzz Test: + - fuzzing/howto/fuzzing-howto-p0.md + - fuzzing/howto/fuzzing-howto-p1.md + - fuzzing/howto/fuzzing-howto-p2.md + - fuzzing/howto/fuzzing-howto-p3.md + - fuzzing/howto/fuzzing-howto-p4.md + - fuzzing/howto/fuzzing-howto-p5.md + - fuzzing/howto/fuzzing-howto-p6.md + - fuzzing/howto/fuzzing-howto-p7.md + - fuzzing/fuzzing-run-debug.md + - fuzzing/fuzzing-current-limitations.md + - fuzzing/fuzzing-examples.md + - Integration Tests: + - integration-tests/poc-introduction.md + - Initialization: + - integration-tests/initialization/poc-initialization-poc.md + - integration-tests/initialization/poc-initialization-program-client.md + - integration-tests/initialization/poc-initialization-all.md + - How-To write Integration Test: + - integration-tests/howto/poc-howto-p0.md + - integration-tests/howto/poc-howto-p1.md + - integration-tests/poc-run.md + - integration-tests/poc-examples.md + - CHANGELOG.md # Beware this is strongly dependent on names of folders , example: # images have to be stored within the docs/images folder @@ -67,14 +64,14 @@ theme: icon: material/lightbulb-outline name: Switch to light mode features: - # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#instant-loading - - navigation.instant + # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-tabs + - navigation.tabs # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-expansion - # - navigation.expand + - navigation.expand + # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections + - navigation.sections # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#back-to-top-button - navigation.top - # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-tabs - - navigation.tabs # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#section-index-pages - navigation.indexes # https://squidfunk.github.io/mkdocs-material/reference/code-blocks/?h=content+copy#code-copy-button @@ -89,6 +86,7 @@ extra: link: https://discord.gg/x7qXXnGCsa - icon: fontawesome/brands/twitter link: https://twitter.com/ackeeblockchain +# https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/ version: provider: mike From 448ba2049bab794c4f1a3e2dccbd18aca15fc0af Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 22 May 2024 16:24:08 +0200 Subject: [PATCH 10/56] =?UTF-8?q?=F0=9F=92=9A=20try=20to=20resolve=20no=20?= =?UTF-8?q?pipeline=20trigger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-documentation.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-documentation.yaml b/.github/workflows/build-documentation.yaml index 3290408f..389ec373 100644 --- a/.github/workflows/build-documentation.yaml +++ b/.github/workflows/build-documentation.yaml @@ -32,4 +32,5 @@ jobs: - name: Push documentation uses: ad-m/github-push-action@master with: + ssh: true branch: documentation From d2e31c884aba73a556de14e55ef1164accb77ad2 Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 23 May 2024 09:12:59 +0200 Subject: [PATCH 11/56] =?UTF-8?q?=F0=9F=93=9D=20Small=20touches=20to=20the?= =?UTF-8?q?=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/overrides/partials/copyright.html | 2 +- documentation/docs/stylesheets/extra.css | 17 ----------------- documentation/mkdocs.yml | 19 ++++++++++--------- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/documentation/docs/overrides/partials/copyright.html b/documentation/docs/overrides/partials/copyright.html index 3ad8a5d4..1a235f31 100644 --- a/documentation/docs/overrides/partials/copyright.html +++ b/documentation/docs/overrides/partials/copyright.html @@ -1,4 +1,4 @@ diff --git a/documentation/docs/stylesheets/extra.css b/documentation/docs/stylesheets/extra.css index 28a71b37..7b3c8644 100644 --- a/documentation/docs/stylesheets/extra.css +++ b/documentation/docs/stylesheets/extra.css @@ -1,15 +1,3 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); - - -.md-typeset h1, -.md-typeset h2, -.md-typeset h3, -.md-typeset h4, -.md-typeset h5, -.md-typeset h6 { - font-family: 'Inter', serif; -} - /* update colour of comments in code block source: @@ -19,11 +7,6 @@ --md-code-hl-comment-color: #09902d; } -/* Update font of basic text*/ -body { - font-family: 'Inter', serif; -} - /* rotate hue so that the image will be modified based on the background */ diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index 0be7dc1e..5bcd4972 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -51,13 +51,17 @@ theme: logo: 'images/logo.png' favicon: 'images/favicon.ico' custom_dir: docs/overrides + font: + text: Inter # https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/?h=palette+sw#color-palette-toggle palette: + # Palette toggle for light mode - scheme: default # light mode scheme primary: black toggle: icon: material/lightbulb name: Switch to dark mode + # Palette toggle for dark mode - scheme: slate # dark mode scheme primary: black toggle: @@ -68,14 +72,16 @@ theme: - navigation.tabs # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-expansion - navigation.expand - # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections - - navigation.sections # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#back-to-top-button - navigation.top # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#section-index-pages - navigation.indexes # https://squidfunk.github.io/mkdocs-material/reference/code-blocks/?h=content+copy#code-copy-button - content.code.copy + # https://squidfunk.github.io/mkdocs-material/setup/setting-up-navigation/#navigation-sections + - navigation.sections + # may be used + # - navigation.footer # https://squidfunk.github.io/mkdocs-material/setup/setting-up-the-footer/?h=social#social-links extra: @@ -83,9 +89,9 @@ extra: - icon: fontawesome/brands/github link: https://github.com/Ackee-Blockchain/trident - icon: fontawesome/brands/discord - link: https://discord.gg/x7qXXnGCsa + link: https://discord.gg/urRbxVcMrB - icon: fontawesome/brands/twitter - link: https://twitter.com/ackeeblockchain + link: https://x.com/TridentSolana # https://squidfunk.github.io/mkdocs-material/setup/setting-up-versioning/ version: provider: mike @@ -117,11 +123,6 @@ markdown_extensions: - pymdownx.superfences - pymdownx.tasklist: custom_checkbox: true - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format exclude_docs: | requirements.txt. From 36664f18759223409c85d4a59e4a681f7cdc36be Mon Sep 17 00:00:00 2001 From: cryptopapi997 <38372048+cryptopapi997@users.noreply.github.com> Date: Wed, 29 May 2024 13:48:59 +0200 Subject: [PATCH 12/56] feat/add more specific err message for invalid struct (#164) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md updated features * 📝 update urls in readme * 📌 bump crate versions * Update README.md added break * 🚑️ update docs before release * 📝 fix discord link * 📝 (add mike): Add mike * add more specific err message * add missing name on instruction struct too * Update index.md * Update index.md * rm main.html --------- Co-authored-by: Adam Hrazdira <34861877+Ikrk@users.noreply.github.com> Co-authored-by: Emre Ekinci <83828886+ekincixyz@users.noreply.github.com> Co-authored-by: lukacan --- crates/client/src/idl.rs | 47 +++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 20 deletions(-) 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; From 8e0d235b88622179c765651f57b286f0dbe7a17f Mon Sep 17 00:00:00 2001 From: andrejlukacovic <37964423+lukacan@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:57:00 +0200 Subject: [PATCH 13/56] =?UTF-8?q?=E2=9C=A8=20feat/added=20optional=20fuzzi?= =?UTF-8?q?ng=20statistics=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Optionaly show stats during fuzzing session * 🐛 (store failed txs): Store failex txs * 🩹 Simplified stats logging * 📝 Added fuzzing stats to docs * ✨ Added failed invariants check stats --------- Co-authored-by: Ikrk --- CHANGELOG.md | 1 + Cargo.lock | 55 ++++- crates/client/Cargo.toml | 1 + .../derive/fuzz_test_executor/src/lib.rs | 52 +++-- crates/client/src/commander.rs | 221 +++++++++++++----- crates/client/src/config.rs | 143 +++++++++++- crates/client/src/fuzzer/fuzzing_stats.rs | 145 ++++++++++++ crates/client/src/fuzzer/mod.rs | 1 + crates/client/src/lib.rs | 1 + crates/client/src/templates/Trident.toml.tmpl | 3 + crates/client/src/test_generator.rs | 2 +- .../docs/fuzzing/fuzzing-run-debug.md | 37 +-- .../arbitrary-custom-types-4/Cargo.lock | 67 +++++- .../arbitrary-custom-types-4/Trident.toml | 3 + .../arbitrary-limit-inputs-5/Trident.toml | 3 + examples/fuzz-tests/hello_world/Trident.toml | 3 + .../Trident.toml | 3 + .../incorrect-ix-sequence-1/Trident.toml | 3 + .../unauthorized-access-2/Trident.toml | 3 + .../unchecked-arithmetic-0/Trident.toml | 3 + .../integration-tests/escrow/Trident.toml | 3 + .../integration-tests/turnstile/Trident.toml | 3 + 22 files changed, 660 insertions(+), 96 deletions(-) create mode 100644 crates/client/src/fuzzer/fuzzing_stats.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index c7c0f080..c84d9f5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) ## [0.6.0] - 2024-05-20 ### Added diff --git a/Cargo.lock b/Cargo.lock index ea513a80..fc817579 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1140,7 +1140,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", @@ -1273,6 +1273,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" @@ -1644,6 +1665,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.33" @@ -3121,6 +3148,20 @@ dependencies = [ "syn 1.0.109", ] +[[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" @@ -5609,6 +5650,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" @@ -6010,6 +6062,7 @@ dependencies = [ "macrotest", "pathdiff", "pretty_assertions", + "prettytable", "proc-macro2", "quinn-proto", "quote", diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 6ae6cea2..4440c68f 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -80,3 +80,4 @@ solana-bpf-loader-program = "1.16" solana-program = "1.16" solana-sdk-macro = "1.16" solana-system-program = "1.16" +prettytable = "0.10.0" diff --git a/crates/client/derive/fuzz_test_executor/src/lib.rs b/crates/client/derive/fuzz_test_executor/src/lib.rs index 22298327..6ca24177 100644 --- a/crates/client/derive/fuzz_test_executor/src/lib.rs +++ b/crates/client/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() + .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/commander.rs b/crates/client/src/commander.rs index a2346ffd..b5a3c923 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -19,6 +19,8 @@ use tokio::{ }; use crate::constants::*; +use crate::fuzzing_stats::FuzzingStatistics; +use tokio::io::AsyncBufReadExt; #[derive(Error, Debug)] pub enum Error { @@ -153,7 +155,11 @@ 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 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,34 @@ 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("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("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) { @@ -236,27 +240,54 @@ impl Commander { 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("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("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 { @@ -270,6 +301,87 @@ 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() { + println!("Honggfuzz exited with an error!"); + } + }, + 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] @@ -286,14 +398,9 @@ 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") 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/fuzzing_stats.rs b/crates/client/src/fuzzer/fuzzing_stats.rs new file mode 100644 index 00000000..f49403de --- /dev/null +++ b/crates/client/src/fuzzer/fuzzing_stats.rs @@ -0,0 +1,145 @@ +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/client/src/fuzzer/mod.rs b/crates/client/src/fuzzer/mod.rs index fc1a9b39..b478cf71 100644 --- a/crates/client/src/fuzzer/mod.rs +++ b/crates/client/src/fuzzer/mod.rs @@ -1,6 +1,7 @@ pub mod accounts_storage; pub mod data_builder; pub mod fuzzer_generator; +pub mod fuzzing_stats; #[cfg(feature = "fuzzing")] pub mod program_test_client_blocking; pub mod snapshot; diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index cb07f622..c8072b96 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -42,6 +42,7 @@ pub mod fuzzing { 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::fuzzing_stats::FuzzingStatistics; pub use super::fuzzer::program_test_client_blocking::ProgramEntry; pub use super::fuzzer::program_test_client_blocking::ProgramTestClientBlocking; 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/test_generator.rs b/crates/client/src/test_generator.rs index 47b022e7..b4d7aece 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -609,7 +609,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/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/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index 970c4fc5..42ab1daa 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -1096,7 +1096,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", @@ -1229,6 +1229,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 +1617,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" @@ -2278,6 +2305,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.6", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -3083,6 +3121,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" @@ -5607,6 +5659,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" @@ -5999,6 +6062,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", @@ -6014,6 +6078,7 @@ dependencies = [ "solana-bpf-loader-program", "solana-cli-output", "solana-program", + "solana-logger", "solana-program-runtime", "solana-program-test", "solana-sdk", 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-limit-inputs-5/Trident.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/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.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/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-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/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/unchecked-arithmetic-0/Trident.toml b/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml +++ b/examples/fuzz-tests/unchecked-arithmetic-0/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.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/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 From 17d3c2a34cdee3674c5394a3bbaa8fb3128ecb06 Mon Sep 17 00:00:00 2001 From: Ikrk Date: Wed, 29 May 2024 15:35:13 +0200 Subject: [PATCH 14/56] =?UTF-8?q?=F0=9F=90=9B=20Snapshot's=20zeroed=20acco?= =?UTF-8?q?unt=20as=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/client/src/fuzzer/snapshot_generator.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c84d9f5f..969566f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) ## [0.6.0] - 2024-05-20 diff --git a/crates/client/src/fuzzer/snapshot_generator.rs b/crates/client/src/fuzzer/snapshot_generator.rs index 252649b5..78c2ba52 100644 --- a/crates/client/src/fuzzer/snapshot_generator.rs +++ b/crates/client/src/fuzzer/snapshot_generator.rs @@ -232,7 +232,7 @@ fn is_optional(parsed_field: &AccountField) -> 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. From 1aa786526cbaf5a4b4ca50e4c7e991edbd63f670 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 26 Jun 2024 10:13:34 +0200 Subject: [PATCH 15/56] =?UTF-8?q?=F0=9F=94=A5=20remove=20explorer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/lint.yml | 22 - .vscode/settings.json | 1 - Cargo.lock | 72 -- Cargo.toml | 14 +- crates/cli/Cargo.toml | 1 - crates/cli/src/command.rs | 3 - crates/cli/src/command/explorer.rs | 204 ---- crates/cli/src/command/explorer/account.rs | 37 - crates/cli/src/command/explorer/program.rs | 25 - .../cli/src/command/explorer/transaction.rs | 43 - crates/cli/src/lib.rs | 7 - crates/explorer/Cargo.toml | 33 - crates/explorer/src/account.rs | 216 ---- crates/explorer/src/config.rs | 64 -- crates/explorer/src/display.rs | 23 - crates/explorer/src/error.rs | 25 - crates/explorer/src/lib.rs | 11 - crates/explorer/src/output.rs | 365 ------- crates/explorer/src/parse.rs | 145 --- .../src/parse/associated_token_account.rs | 96 -- crates/explorer/src/parse/bpf_loader.rs | 98 -- .../src/parse/bpf_upgradeable_loader.rs | 420 -------- crates/explorer/src/parse/memo.rs | 42 - crates/explorer/src/parse/stake.rs | 934 ------------------ crates/explorer/src/parse/system.rs | 540 ---------- crates/explorer/src/parse/token.rs | 651 ------------ crates/explorer/src/parse/vote.rs | 470 --------- crates/explorer/src/program.rs | 257 ----- crates/explorer/src/transaction.rs | 788 --------------- 29 files changed, 1 insertion(+), 5606 deletions(-) delete mode 100644 crates/cli/src/command/explorer.rs delete mode 100644 crates/cli/src/command/explorer/account.rs delete mode 100644 crates/cli/src/command/explorer/program.rs delete mode 100644 crates/cli/src/command/explorer/transaction.rs delete mode 100644 crates/explorer/Cargo.toml delete mode 100644 crates/explorer/src/account.rs delete mode 100644 crates/explorer/src/config.rs delete mode 100644 crates/explorer/src/display.rs delete mode 100644 crates/explorer/src/error.rs delete mode 100644 crates/explorer/src/lib.rs delete mode 100644 crates/explorer/src/output.rs delete mode 100644 crates/explorer/src/parse.rs delete mode 100644 crates/explorer/src/parse/associated_token_account.rs delete mode 100644 crates/explorer/src/parse/bpf_loader.rs delete mode 100644 crates/explorer/src/parse/bpf_upgradeable_loader.rs delete mode 100644 crates/explorer/src/parse/memo.rs delete mode 100644 crates/explorer/src/parse/stake.rs delete mode 100644 crates/explorer/src/parse/system.rs delete mode 100644 crates/explorer/src/parse/token.rs delete mode 100644 crates/explorer/src/parse/vote.rs delete mode 100644 crates/explorer/src/program.rs delete mode 100644 crates/explorer/src/transaction.rs 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/.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/Cargo.lock b/Cargo.lock index fc817579..a774bc81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2995,48 +2995,6 @@ 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" @@ -6035,7 +5993,6 @@ dependencies = [ "solana-sdk", "tokio", "trident-client", - "trident-explorer", ] [[package]] @@ -6123,35 +6080,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "trident-explorer" -version = "0.3.2" -dependencies = [ - "base64 0.13.1", - "bincode", - "bs58 0.5.0", - "chrono", - "console", - "num-derive 0.4.2", - "num-traits", - "phf", - "pretty-hex", - "serde", - "serde_json", - "solana-account-decoder", - "solana-cli-config", - "solana-client", - "solana-logger", - "solana-program", - "solana-sdk", - "solana-transaction-status", - "solana-vote-program", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "thiserror", -] - [[package]] name = "trident-test" version = "0.3.2" diff --git a/Cargo.toml b/Cargo.toml index b13b50cb..7c80c445 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/cli", "crates/client", "crates/explorer", "crates/test"] +members = ["crates/cli", "crates/client", "crates/test"] exclude = ["examples/"] resolver = "1" @@ -7,19 +7,13 @@ 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" @@ -43,12 +37,6 @@ 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"] } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 353c32e3..689bd712 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -14,4 +14,3 @@ anyhow = { workspace = true } fehler = { workspace = true } solana-sdk = { workspace = true } trident-client = { workspace = true } -trident-explorer = { workspace = true } diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index f21c1392..44694d4e 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -13,9 +13,6 @@ pub use test::test; mod localnet; pub use localnet::localnet; -mod explorer; -pub use explorer::{explorer, ExplorerCommand}; - mod init; pub use init::{init, TestsType}; 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/lib.rs b/crates/cli/src/lib.rs index 5aef3fac..f1173b00 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -7,7 +7,6 @@ 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; @@ -48,11 +47,6 @@ enum Command { }, /// 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. @@ -73,7 +67,6 @@ pub async fn start() { 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::Clean => command::clean().await?, } 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(()) - } -} From 9fa4623db1d94736bed8ab1680ce349bcab21deb Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 26 Jun 2024 10:38:33 +0200 Subject: [PATCH 16/56] =?UTF-8?q?=F0=9F=94=A5=20remove=20tests=20for=20der?= =?UTF-8?q?ive=20macros=20and=20update=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../fuzzer_macros/fuzz_display_ix.expanded.rs | 62 ----- .../fuzzer_macros/fuzz_display_ix.rs | 41 --- .../fuzz_fuzz_deserialize.expanded.rs | 58 ----- .../fuzzer_macros/fuzz_fuzz_deserialize.rs | 41 --- .../fuzz_fuzz_test_executor.expanded.rs | 243 ------------------ .../fuzzer_macros/fuzz_fuzz_test_executor.rs | 41 --- .../fuzz_fuzz_trident.expanded.rs | 25 -- .../fuzzer_macros/fuzz_fuzz_trident.rs | 12 - crates/client/tests/test_fuzz.rs | 39 --- 10 files changed, 1 insertion(+), 562 deletions(-) delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 969566f1..2adc50cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) 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..fc278399 100644 --- a/crates/client/tests/test_fuzz.rs +++ b/crates/client/tests/test_fuzz.rs @@ -59,42 +59,3 @@ async fn test_snapshots_and_instructions() { 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"); -} From 1cc34a457700578f24bb56b9755d83782b25c373 Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 23 May 2024 14:55:00 +0200 Subject: [PATCH 17/56] =?UTF-8?q?=F0=9F=92=9A=20test=20fuzzing=20pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/setup-honggfuzz/action.yml | 23 +++++++++++++++++ .github/workflows/run_fuzz_example.yml | 25 +++++++++++++++++++ CHANGELOG.md | 3 ++- crates/client/src/commander.rs | 7 +++--- .../unchecked-arithmetic-0/Trident.toml | 6 ++--- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 .github/actions/setup-honggfuzz/action.yml create mode 100644 .github/workflows/run_fuzz_example.yml 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/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml new file mode 100644 index 00000000..e8d07b8b --- /dev/null +++ b/.github/workflows/run_fuzz_example.yml @@ -0,0 +1,25 @@ +name: Test Fuzz Tests + +on: + workflow_dispatch: + pull_request: + +env: + SOLANA_CLI_VERSION: 1.18.12 + ANCHOR_VERSION: 0.29.0 + HONGGFUZZ_VERSION: 0.5.55 + +jobs: + run_fuzz_example: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/setup-rust/ + - uses: ./.github/actions/setup-solana/ + - uses: ./.github/actions/setup-honggfuzz/ + id: rust-setup + - uses: Swatinem/rust-cache@v2 + name: Cache Rust and it's packages + - name: Test Fuzz + working-directory: examples/fuzz-tests/unchecked-arithmetic-0 + run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2adc50cf..d525ceb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased -- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) +- fix/in case of fuzzing failure throw error instead of only printing message([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) +- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index b5a3c923..dd8d2418 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -223,7 +223,7 @@ impl Commander { "The crash directory {} contains new fuzz test crashes. Exiting!", crash_dir.to_string_lossy() ); - process::exit(1); + process::exit(99); } } } @@ -292,7 +292,7 @@ impl Commander { res = child.wait() => match res { Ok(status) => if !status.success() { - println!("Honggfuzz exited with an error!"); + throw!(Error::FuzzingFailed); }, Err(_) => throw!(Error::FuzzingFailed), }, @@ -358,7 +358,7 @@ impl Commander { match res { Ok(status) => { if !status.success() { - println!("Honggfuzz exited with an error!"); + throw!(Error::FuzzingFailed); } }, Err(_) => throw!(Error::FuzzingFailed), @@ -367,7 +367,6 @@ impl Commander { _ = 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 diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml b/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml index a398402c..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"]). @@ -38,4 +38,4 @@ save_all = 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 +fuzzing_with_stats = true From 61ba991b7310fd74d87cce0771f12c578c267d73 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 26 Jun 2024 22:30:58 +0200 Subject: [PATCH 18/56] =?UTF-8?q?=F0=9F=93=8C=20unify=20exports=20from=20t?= =?UTF-8?q?rident?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- crates/cli/src/command/build.rs | 2 +- crates/cli/src/command/clean.rs | 2 +- crates/cli/src/command/fuzz.rs | 2 +- crates/cli/src/command/init.rs | 2 +- crates/cli/src/command/keypair.rs | 2 +- crates/cli/src/command/localnet.rs | 2 +- crates/cli/src/command/test.rs | 2 +- crates/client/src/client.rs | 4 +- crates/client/src/commander.rs | 8 +- crates/client/src/fuzzer/accounts_storage.rs | 3 +- crates/client/src/fuzzer/data_builder.rs | 4 +- crates/client/src/fuzzer/error.rs | 2 + crates/client/src/fuzzer/fuzzing_stats.rs | 2 + .../fuzzer/program_test_client_blocking.rs | 11 +- crates/client/src/fuzzer/snapshot.rs | 4 +- .../client/src/fuzzer/snapshot_generator.rs | 4 +- crates/client/src/lib.rs | 172 ++++++++++-------- crates/client/src/temp_clone.rs | 3 +- .../src/templates/trident-tests/test.rs | 3 +- .../src/templates/trident-tests/test_fuzz.rs | 2 +- crates/client/src/test_generator.rs | 7 +- crates/client/src/tester.rs | 2 +- .../expected_accounts_snapshots.rs | 4 +- crates/client/tests/test_fuzz.rs | 17 +- crates/client/tests/test_program_client.rs | 8 +- crates/test/src/lib.rs | 14 +- crates/test/tests/expand/basic.expanded.rs | 14 +- .../test/tests/expand/with_root.expanded.rs | 14 +- .../arbitrary-custom-types-4/Cargo.lock | 3 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../arbitrary-limit-inputs-5/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- examples/fuzz-tests/hello_world/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 5 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../incorrect-integer-arithmetic-3/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../incorrect-ix-sequence-1/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../unauthorized-access-2/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../unchecked-arithmetic-0/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../escrow/.program_client/src/lib.rs | 3 +- examples/integration-tests/escrow/Cargo.lock | 66 ++++++- .../trident-tests/poc_tests/tests/test.rs | 8 +- .../turnstile/.program_client/src/lib.rs | 3 +- .../integration-tests/turnstile/Cargo.lock | 66 ++++++- .../trident-tests/poc_tests/tests/test.rs | 7 +- 56 files changed, 745 insertions(+), 183 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d525ceb5..8b8e42dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased -- fix/in case of fuzzing failure throw error instead of only printing message([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) +- feat/unify dependencies provided by the Trident ([#172](https://github.com/Ackee-Blockchain/trident/pull/172)) +- fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) - del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) diff --git a/crates/cli/src/command/build.rs b/crates/cli/src/command/build.rs index c71d4e43..11a3ab4c 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; 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/fuzz.rs b/crates/cli/src/command/fuzz.rs index 87b74507..e398882f 100644 --- a/crates/cli/src/command/fuzz.rs +++ b/crates/cli/src/command/fuzz.rs @@ -2,7 +2,7 @@ use anyhow::{bail, Error}; use clap::Subcommand; use fehler::throws; -use trident_client::{Commander, TestGenerator}; +use trident_client::___private::{Commander, TestGenerator}; use crate::_discover; diff --git a/crates/cli/src/command/init.rs b/crates/cli/src/command/init.rs index bf4c4c88..182f081d 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; 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 index 9cb4973d..cae67c5a 100644 --- a/crates/cli/src/command/localnet.rs +++ b/crates/cli/src/command/localnet.rs @@ -1,7 +1,7 @@ use anyhow::Error; use fehler::throws; use tokio::signal; -use trident_client::*; +use trident_client::___private::Commander; #[throws] pub async fn localnet() { 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/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 dd8d2418..70b12c62 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,7 +17,7 @@ use tokio::{ }; use crate::constants::*; -use crate::fuzzing_stats::FuzzingStatistics; +use crate::fuzzer::fuzzing_stats::FuzzingStatistics; use tokio::io::AsyncBufReadExt; #[derive(Error, Debug)] diff --git a/crates/client/src/fuzzer/accounts_storage.rs b/crates/client/src/fuzzer/accounts_storage.rs index 01e2ef11..226623dc 100644 --- a/crates/client/src/fuzzer/accounts_storage.rs +++ b/crates/client/src/fuzzer/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::fuzzer::{data_builder::FuzzClient, AccountId}; pub struct PdaStore { pub pubkey: Pubkey, diff --git a/crates/client/src/fuzzer/data_builder.rs b/crates/client/src/fuzzer/data_builder.rs index 174611dc..b9d1238a 100644 --- a/crates/client/src/fuzzer/data_builder.rs +++ b/crates/client/src/fuzzer/data_builder.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + 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; @@ -13,7 +15,7 @@ use std::collections::HashMap; use std::error::Error; use std::fmt::Display; -use crate::error::*; +use crate::fuzzer::error::*; pub struct FuzzData { pub pre_ixs: Vec, diff --git a/crates/client/src/fuzzer/error.rs b/crates/client/src/fuzzer/error.rs index cc488669..4058519c 100644 --- a/crates/client/src/fuzzer/error.rs +++ b/crates/client/src/fuzzer/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/client/src/fuzzer/fuzzing_stats.rs b/crates/client/src/fuzzer/fuzzing_stats.rs index f49403de..d1ac5c62 100644 --- a/crates/client/src/fuzzer/fuzzing_stats.rs +++ b/crates/client/src/fuzzer/fuzzing_stats.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + use prettytable::{row, Table}; use std::collections::HashMap; diff --git a/crates/client/src/fuzzer/program_test_client_blocking.rs b/crates/client/src/fuzzer/program_test_client_blocking.rs index f31858a2..3ba74105 100644 --- a/crates/client/src/fuzzer/program_test_client_blocking.rs +++ b/crates/client/src/fuzzer/program_test_client_blocking.rs @@ -1,9 +1,10 @@ -use crate::fuzzing::ProgramTest; -use crate::fuzzing::{ProgramTestContext, SYSTEM_PROGRAM_ID}; -use crate::solana_sdk::account::Account; 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 +13,8 @@ use solana_sdk::{ use spl_token::state::Mint; use tokio::runtime::Builder; -use crate::data_builder::FuzzClient; -use crate::error::*; +use crate::fuzzer::data_builder::FuzzClient; +use crate::fuzzer::error::*; pub type ProgramEntry = for<'info> fn( program_id: &Pubkey, diff --git a/crates/client/src/fuzzer/snapshot.rs b/crates/client/src/fuzzer/snapshot.rs index 69cdfe73..46d6c0a6 100644 --- a/crates/client/src/fuzzer/snapshot.rs +++ b/crates/client/src/fuzzer/snapshot.rs @@ -4,8 +4,8 @@ use anchor_client::anchor_lang::solana_program::account_info::Account as Acc; use anchor_client::anchor_lang::solana_program::account_info::AccountInfo; use solana_sdk::{account::Account, instruction::AccountMeta}; -use crate::data_builder::{FuzzClient, FuzzDeserialize}; -use crate::error::*; +use crate::fuzzer::data_builder::{FuzzClient, FuzzDeserialize}; +use crate::fuzzer::error::*; pub struct Snapshot<'info, T> { before: Vec>, before_acc_inf: Vec>>, diff --git a/crates/client/src/fuzzer/snapshot_generator.rs b/crates/client/src/fuzzer/snapshot_generator.rs index 78c2ba52..21e9a44a 100644 --- a/crates/client/src/fuzzer/snapshot_generator.rs +++ b/crates/client/src/fuzzer/snapshot_generator.rs @@ -66,8 +66,8 @@ pub fn generate_snapshots_code(programs_data: &[ProgramData]) -> Result { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, diff --git a/crates/client/tests/test_fuzz.rs b/crates/client/tests/test_fuzz.rs index fc278399..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,14 +49,15 @@ 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); diff --git a/crates/client/tests/test_program_client.rs b/crates/client/tests/test_program_client.rs index 3b082355..c9d8cc71 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,9 @@ 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::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/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/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index 42ab1daa..ed4099fa 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -2311,7 +2311,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", ] @@ -6078,7 +6078,6 @@ dependencies = [ "solana-bpf-loader-program", "solana-cli-output", "solana-program", - "solana-logger", "solana-program-runtime", "solana-program-test", "solana-sdk", 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..509c99d4 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,6 @@ +use anchor_lang::prelude::*; use arbitrary_custom_types_4::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 InitializeSnapshot<'info> { pub counter: Option>, pub user: Signer<'info>, 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-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 3eec7e31..905b4c1f 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -1097,7 +1097,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", @@ -1230,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" @@ -1597,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" @@ -2280,6 +2307,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" @@ -3085,6 +3123,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" @@ -5609,6 +5661,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" @@ -6001,6 +6064,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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 index 1aa9daaf..129df822 100644 --- 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 @@ -1,7 +1,7 @@ +use anchor_lang::prelude::*; 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; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, 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..e233562a 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,8 @@ pub mod arbitrary_limit_inputs_5_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/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 6deb6646..0a36493a 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2278,6 +2305,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" @@ -3083,6 +3121,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" @@ -5607,6 +5659,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" @@ -5999,6 +6062,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..86e3ecb2 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,7 @@ +use anchor_lang::prelude::*; use hello_world::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 InitializeSnapshot<'info> { pub author: Signer<'info>, pub hello_world_account: Option>, 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/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 187583d8..babc39bb 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2280,6 +2307,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" @@ -3085,6 +3123,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" @@ -5609,6 +5661,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" @@ -6001,6 +6064,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..c95cb226 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,7 @@ 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}; +use anchor_lang::prelude::*; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, 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-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index bfd6cc05..b8f170c6 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2278,6 +2305,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" @@ -3083,6 +3121,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" @@ -5607,6 +5659,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" @@ -5999,6 +6062,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..cf102ee4 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,6 @@ +use anchor_lang::prelude::*; use incorrect_ix_sequence_1::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 InitializeSnapshot<'info> { pub author: Signer<'info>, pub state: Option>, 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/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index be9f2937..28bb7ba5 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2271,6 +2298,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" @@ -3076,6 +3114,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" @@ -5600,6 +5652,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" @@ -5992,6 +6055,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..89c6e088 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,6 @@ -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; use unauthorized_access_2::ID as PROGRAM_ID; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; +use anchor_lang::prelude::*; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub escrow: Option>, 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/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index 45fac246..15e2a586 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2271,6 +2298,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" @@ -3076,6 +3114,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" @@ -5600,6 +5652,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" @@ -5992,6 +6055,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..ea5d9721 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,5 +1,5 @@ -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; use unchecked_arithmetic_0::ID as PROGRAM_ID; pub struct InitializeSnapshot<'info> { pub counter: Option>, 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/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-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-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?; From 9e4adf14003a21d694cd4e88ba971cf6b677ea49 Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 27 Jun 2024 17:07:34 +0200 Subject: [PATCH 19/56] =?UTF-8?q?=F0=9F=93=8C=20unify=20dependencies,=20an?= =?UTF-8?q?d=20remove=20unused?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 28 +++++--------- Cargo.toml | 52 ++++++++----------------- crates/cli/Cargo.toml | 17 ++++++--- crates/client/Cargo.toml | 82 ++++++++++++++++++++-------------------- crates/test/Cargo.toml | 8 ++-- 5 files changed, 82 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a774bc81..e04b1647 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -339,24 +339,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", ] @@ -1108,9 +1108,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" @@ -6014,16 +6014,13 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", - "macrotest", "pathdiff", "pretty_assertions", "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6032,14 +6029,10 @@ dependencies = [ "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", @@ -6086,7 +6079,6 @@ version = "0.3.2" dependencies = [ "darling 0.13.4", "macrotest", - "proc-macro2", "quote", "syn 1.0.109", ] @@ -6229,9 +6221,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" diff --git a/Cargo.toml b/Cargo.toml index 7c80c445..9d8147d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,39 +5,19 @@ resolver = "1" [workspace.dependencies] -trident-test = { path = "./crates/test", version = "0.3.2" } -trident-client = { path = "./crates/client", version = "0.6.0" } -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-program = "1.16" -spl-token = "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" -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 = { version = ">=0.29.0" } +anchor-syn = { version = ">=0.29.0" } +anchor-spl = { version = ">=0.29.0" } +anchor-lang = { version = ">=0.29.0" } +# SOLANA +solana-sdk = "1.16" +solana-cli-output = "1.16" +solana-transaction-status = "1.16" +solana-account-decoder = "1.16" +solana-program = "1.16" +solana-banks-client = "1.16" +solana-program-runtime = "1.16" +solana-program-test = "1.16" +spl-token = "4.0.0" +spl-associated-token-account = "2.0.0" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 689bd712..38a3435b 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -8,9 +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 +trident-client = { path = "../client", version = "0.6.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/client/Cargo.toml b/crates/client/Cargo.toml index 4440c68f..022ab825 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -20,64 +20,64 @@ anyhow = { version = "1.0.45", features = ["std"], default-features = false } [dev-dependencies] pretty_assertions = "1.1.0" -macrotest = "1.0.9" [dependencies] +# TRIDENT 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-test = { path = "../test", version = "0.3.2" } + + +# 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-spl = { workspace = true, features = ["idl-build"] } +anchor-lang = { workspace = true, features = ["idl-build", "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 } +solana-banks-client = { workspace = true } +solana-program-runtime = { workspace = true, optional = true } +solana-program-test = { workspace = true, optional = true } + + +# HONGGFUZZ honggfuzz = { version = "0.5.55", optional = true } +# ARBITRARY arbitrary = { version = "1.3.0", features = ["derive"] } -solana-program-test = { version = "1.16", optional = 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", optional = true } -solana-program-runtime = { version = "1.16", optional = true } -shellexpand = { workspace = true } 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" prettytable = "0.10.0" diff --git a/crates/test/Cargo.toml b/crates/test/Cargo.toml index 2136b2d4..d1593e22 100644 --- a/crates/test/Cargo.toml +++ b/crates/test/Cargo.toml @@ -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" From 9451ff16b3539251b73d9d4216e7cf52ce57d5ef Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 28 Jun 2024 09:08:31 +0200 Subject: [PATCH 20/56] =?UTF-8?q?=F0=9F=8E=A8=20move=20fuzz=20to=20separat?= =?UTF-8?q?e=20crate=20and=20update=20examples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Cargo.lock | 53 +++++++++++++++---- Cargo.toml | 2 +- crates/client/Cargo.toml | 18 ++----- crates/client/src/commander.rs | 2 +- crates/client/src/lib.rs | 33 ++++++------ .../fuzzer_generator.rs | 0 .../client/src/source_code_generators/mod.rs | 3 ++ .../program_client_generator.rs | 0 .../snapshot_generator.rs | 0 crates/client/src/test_generator.rs | 13 ++--- crates/client/tests/test_program_client.rs | 5 +- crates/fuzz/Cargo.toml | 39 ++++++++++++++ .../derive/display_ix/Cargo.toml | 0 .../derive/display_ix/src/lib.rs | 0 .../derive/fuzz_deserialize/Cargo.toml | 0 .../derive/fuzz_deserialize/src/lib.rs | 0 .../derive/fuzz_test_executor/Cargo.toml | 0 .../derive/fuzz_test_executor/src/lib.rs | 0 .../fuzzer => fuzz/src}/accounts_storage.rs | 2 +- .../src/fuzzer => fuzz/src}/data_builder.rs | 6 +-- .../{client/src/fuzzer => fuzz/src}/error.rs | 0 .../src/fuzzer => fuzz/src}/fuzzing_stats.rs | 0 .../src/fuzzer/mod.rs => fuzz/src/lib.rs} | 8 +-- .../src}/program_test_client_blocking.rs | 4 +- .../src/fuzzer => fuzz/src}/snapshot.rs | 8 +-- .../arbitrary-custom-types-4/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../arbitrary-limit-inputs-5/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- examples/fuzz-tests/hello_world/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../incorrect-integer-arithmetic-3/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../incorrect-ix-sequence-1/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../unauthorized-access-2/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../unchecked-arithmetic-0/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- 40 files changed, 312 insertions(+), 144 deletions(-) rename crates/client/src/{fuzzer => source_code_generators}/fuzzer_generator.rs (100%) create mode 100644 crates/client/src/source_code_generators/mod.rs rename crates/client/src/{ => source_code_generators}/program_client_generator.rs (100%) rename crates/client/src/{fuzzer => source_code_generators}/snapshot_generator.rs (100%) create mode 100644 crates/fuzz/Cargo.toml rename crates/{client => fuzz}/derive/display_ix/Cargo.toml (100%) rename crates/{client => fuzz}/derive/display_ix/src/lib.rs (100%) rename crates/{client => fuzz}/derive/fuzz_deserialize/Cargo.toml (100%) rename crates/{client => fuzz}/derive/fuzz_deserialize/src/lib.rs (100%) rename crates/{client => fuzz}/derive/fuzz_test_executor/Cargo.toml (100%) rename crates/{client => fuzz}/derive/fuzz_test_executor/src/lib.rs (100%) rename crates/{client/src/fuzzer => fuzz/src}/accounts_storage.rs (98%) rename crates/{client/src/fuzzer => fuzz/src}/data_builder.rs (98%) rename crates/{client/src/fuzzer => fuzz/src}/error.rs (100%) rename crates/{client/src/fuzzer => fuzz/src}/fuzzing_stats.rs (100%) rename crates/{client/src/fuzzer/mod.rs => fuzz/src/lib.rs} (66%) rename crates/{client/src/fuzzer => fuzz/src}/program_test_client_blocking.rs (98%) rename crates/{client/src/fuzzer => fuzz/src}/snapshot.rs (94%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b8e42dc..2e35045b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- 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)) - fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) - del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) diff --git a/Cargo.lock b/Cargo.lock index e04b1647..0490b437 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2120,13 +2120,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", ] @@ -2549,6 +2549,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" @@ -4031,7 +4040,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.3.3", "num-traits", @@ -4163,7 +4172,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.6.1", "rand 0.8.5", @@ -4353,7 +4362,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4758,7 +4767,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.3.3", "num-traits", @@ -4834,7 +4843,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", @@ -6017,7 +6026,6 @@ dependencies = [ "log", "pathdiff", "pretty_assertions", - "prettytable", "proc-macro2", "quinn-proto", "quote", @@ -6028,9 +6036,7 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", "solana-cli-output", - "solana-program-runtime", "solana-program-test", "solana-sdk", "solana-transaction-status", @@ -6043,6 +6049,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6073,6 +6080,30 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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" diff --git a/Cargo.toml b/Cargo.toml index 9d8147d5..1f2cb53f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/cli", "crates/client", "crates/test"] +members = ["crates/cli", "crates/client", "crates/test", "crates/fuzz"] exclude = ["examples/"] resolver = "1" diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 022ab825..e3e8f6a4 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -8,12 +8,7 @@ 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", -] +fuzzing = ["dep:solana-program-test", "dep:honggfuzz", "quinn-proto/arbitrary"] [build-dependencies] anyhow = { version = "1.0.45", features = ["std"], default-features = false } @@ -23,11 +18,11 @@ pretty_assertions = "1.1.0" [dependencies] # TRIDENT -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-derive-displayix = { path = "../fuzz/derive/display_ix", version = "0.0.1" } +trident-derive-fuzz-deserialize = { path = "../fuzz/derive/fuzz_deserialize", version = "0.0.1" } +trident-derive-fuzz-test-executor = { path = "../fuzz/derive/fuzz_test_executor", version = "0.0.1" } trident-test = { path = "../test", version = "0.3.2" } - +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 @@ -44,8 +39,6 @@ solana-transaction-status = { workspace = true } solana-account-decoder = { workspace = true } spl-token = { workspace = true } spl-associated-token-account = { workspace = true } -solana-banks-client = { workspace = true } -solana-program-runtime = { workspace = true, optional = true } solana-program-test = { workspace = true, optional = true } @@ -80,4 +73,3 @@ quinn-proto = { version = "0.10.6", optional = true } pathdiff = "0.2.1" indicatif = "0.17.8" regex = "1.10.3" -prettytable = "0.10.0" diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index 70b12c62..27208c78 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -17,8 +17,8 @@ use tokio::{ }; use crate::constants::*; -use crate::fuzzer::fuzzing_stats::FuzzingStatistics; use tokio::io::AsyncBufReadExt; +use trident_fuzz::fuzzing_stats::FuzzingStatistics; #[derive(Error, Debug)] pub enum Error { diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index a4f03f41..df0d0539 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -35,24 +35,24 @@ pub mod fuzzing { pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; + pub use trident_fuzz::convert_entry; + pub use trident_fuzz::fuzz_trident; + pub use trident_fuzz::show_account; /// trident macros - pub use super::fuzzer::*; - pub use crate::convert_entry; - pub use crate::fuzz_trident; - pub use crate::show_account; + pub use trident_fuzz::*; - pub use super::fuzzer::program_test_client_blocking::ProgramEntry; pub use solana_program_test::processor; + pub use trident_fuzz::program_test_client_blocking::ProgramEntry; - /// trident methods - 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::error::*; - pub use super::fuzzer::fuzzing_stats::FuzzingStatistics; - pub use super::fuzzer::program_test_client_blocking::ProgramTestClientBlocking; - pub use super::fuzzer::snapshot::Snapshot; pub use super::temp_clone::*; + /// trident methods + pub use trident_fuzz::accounts_storage::*; + pub use trident_fuzz::data_builder::build_ix_fuzz_data; + pub use trident_fuzz::data_builder::*; + pub use trident_fuzz::error::*; + pub use trident_fuzz::fuzzing_stats::FuzzingStatistics; + pub use trident_fuzz::program_test_client_blocking::ProgramTestClientBlocking; + pub use trident_fuzz::snapshot::Snapshot; pub use std::cell::RefCell; pub use std::collections::HashMap; @@ -92,11 +92,10 @@ mod client; mod commander; mod config; mod error_reporter; -mod fuzzer; mod idl; mod keys; -mod program_client_generator; mod reader; +mod source_code_generators; mod temp_clone; mod test_generator; mod tester; @@ -108,12 +107,10 @@ pub mod ___private { pub use super::commander::Error; pub use super::commander::LocalnetHandle; pub use super::error_reporter::*; - pub use super::fuzzer::fuzzer_generator; - pub use super::fuzzer::snapshot_generator; pub use super::idl::*; pub use super::keys::*; - pub use super::program_client_generator::*; 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; 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 100% rename from crates/client/src/fuzzer/snapshot_generator.rs rename to crates/client/src/source_code_generators/snapshot_generator.rs diff --git a/crates/client/src/test_generator.rs b/crates/client/src/test_generator.rs index c312980b..73bce8e7 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -1,11 +1,12 @@ use crate::{ commander::{Commander, Error as CommanderError}, - fuzzer, idl::IdlProgram, - program_client_generator, }; -use crate::fuzzer::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::*}; @@ -491,7 +492,7 @@ impl TestGenerator { // 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 = 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) @@ -499,8 +500,8 @@ impl TestGenerator { // // 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 = 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) diff --git a/crates/client/tests/test_program_client.rs b/crates/client/tests/test_program_client.rs index c9d8cc71..c1cc7a58 100644 --- a/crates/client/tests/test_program_client.rs +++ b/crates/client/tests/test_program_client.rs @@ -34,7 +34,10 @@ 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::generate_source_code(&program_data, &use_modules); + let client_code = trident_client::___private::program_client_generator::generate_source_code( + &program_data, + &use_modules, + ); let client_code = trident_client::___private::Commander::format_program_code(&client_code).await?; diff --git a/crates/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml new file mode 100644 index 00000000..704c8dc9 --- /dev/null +++ b/crates/fuzz/Cargo.toml @@ -0,0 +1,39 @@ +[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 = ["idl-build", "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" diff --git a/crates/client/derive/display_ix/Cargo.toml b/crates/fuzz/derive/display_ix/Cargo.toml similarity index 100% rename from crates/client/derive/display_ix/Cargo.toml rename to crates/fuzz/derive/display_ix/Cargo.toml 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 100% rename from crates/client/derive/fuzz_deserialize/Cargo.toml rename to crates/fuzz/derive/fuzz_deserialize/Cargo.toml diff --git a/crates/client/derive/fuzz_deserialize/src/lib.rs b/crates/fuzz/derive/fuzz_deserialize/src/lib.rs similarity index 100% rename from crates/client/derive/fuzz_deserialize/src/lib.rs rename to crates/fuzz/derive/fuzz_deserialize/src/lib.rs diff --git a/crates/client/derive/fuzz_test_executor/Cargo.toml b/crates/fuzz/derive/fuzz_test_executor/Cargo.toml similarity index 100% rename from crates/client/derive/fuzz_test_executor/Cargo.toml rename to crates/fuzz/derive/fuzz_test_executor/Cargo.toml diff --git a/crates/client/derive/fuzz_test_executor/src/lib.rs b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs similarity index 100% rename from crates/client/derive/fuzz_test_executor/src/lib.rs rename to crates/fuzz/derive/fuzz_test_executor/src/lib.rs 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 226623dc..03e893f1 100644 --- a/crates/client/src/fuzzer/accounts_storage.rs +++ b/crates/fuzz/src/accounts_storage.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use solana_sdk::{pubkey::Pubkey, signature::Keypair}; -use crate::fuzzer::{data_builder::FuzzClient, AccountId}; +use crate::{data_builder::FuzzClient, AccountId}; pub struct PdaStore { pub pubkey: Pubkey, diff --git a/crates/client/src/fuzzer/data_builder.rs b/crates/fuzz/src/data_builder.rs similarity index 98% rename from crates/client/src/fuzzer/data_builder.rs rename to crates/fuzz/src/data_builder.rs index b9d1238a..286f12a0 100644 --- a/crates/client/src/fuzzer/data_builder.rs +++ b/crates/fuzz/src/data_builder.rs @@ -1,8 +1,8 @@ #![allow(dead_code)] -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 anchor_lang::solana_program::account_info::{Account as Acc, AccountInfo}; +use anchor_lang::solana_program::hash::Hash; use arbitrary::Arbitrary; use arbitrary::Unstructured; use solana_sdk::account::{Account, AccountSharedData}; @@ -15,7 +15,7 @@ use std::collections::HashMap; use std::error::Error; use std::fmt::Display; -use crate::fuzzer::error::*; +use crate::error::*; pub struct FuzzData { pub pre_ixs: Vec, diff --git a/crates/client/src/fuzzer/error.rs b/crates/fuzz/src/error.rs similarity index 100% rename from crates/client/src/fuzzer/error.rs rename to crates/fuzz/src/error.rs diff --git a/crates/client/src/fuzzer/fuzzing_stats.rs b/crates/fuzz/src/fuzzing_stats.rs similarity index 100% rename from crates/client/src/fuzzer/fuzzing_stats.rs rename to crates/fuzz/src/fuzzing_stats.rs diff --git a/crates/client/src/fuzzer/mod.rs b/crates/fuzz/src/lib.rs similarity index 66% rename from crates/client/src/fuzzer/mod.rs rename to crates/fuzz/src/lib.rs index b478cf71..4c2a43e6 100644 --- a/crates/client/src/fuzzer/mod.rs +++ b/crates/fuzz/src/lib.rs @@ -1,12 +1,8 @@ pub mod accounts_storage; pub mod data_builder; -pub mod fuzzer_generator; +pub mod error; pub mod fuzzing_stats; -#[cfg(feature = "fuzzing")] +// #[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/fuzzer/program_test_client_blocking.rs b/crates/fuzz/src/program_test_client_blocking.rs similarity index 98% rename from crates/client/src/fuzzer/program_test_client_blocking.rs rename to crates/fuzz/src/program_test_client_blocking.rs index 3ba74105..5cc4d455 100644 --- a/crates/client/src/fuzzer/program_test_client_blocking.rs +++ b/crates/fuzz/src/program_test_client_blocking.rs @@ -13,8 +13,8 @@ use solana_sdk::{ use spl_token::state::Mint; use tokio::runtime::Builder; -use crate::fuzzer::data_builder::FuzzClient; -use crate::fuzzer::error::*; +use crate::data_builder::FuzzClient; +use crate::error::*; pub type ProgramEntry = for<'info> fn( program_id: &Pubkey, diff --git a/crates/client/src/fuzzer/snapshot.rs b/crates/fuzz/src/snapshot.rs similarity index 94% rename from crates/client/src/fuzzer/snapshot.rs rename to crates/fuzz/src/snapshot.rs index 46d6c0a6..995ebcbf 100644 --- a/crates/client/src/fuzzer/snapshot.rs +++ b/crates/fuzz/src/snapshot.rs @@ -1,11 +1,11 @@ #![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::fuzzer::data_builder::{FuzzClient, FuzzDeserialize}; -use crate::fuzzer::error::*; +use crate::data_builder::{FuzzClient, FuzzDeserialize}; +use crate::error::*; pub struct Snapshot<'info, T> { before: Vec>, before_acc_inf: Vec>>, diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index ed4099fa..b417797a 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -6059,14 +6059,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6074,15 +6071,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", @@ -6093,6 +6084,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6123,12 +6115,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..ee2f1d14 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 @@ -3,7 +3,7 @@ use arbitrary_custom_types_4::ID as PROGRAM_ID; use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::FuzzInstruction; 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; diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 905b4c1f..e72692c4 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -6061,14 +6061,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6076,15 +6073,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", @@ -6095,6 +6086,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6125,12 +6117,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..446ca549 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 @@ -2,7 +2,7 @@ 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 fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 0a36493a..9ae2578c 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -6059,14 +6059,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6074,15 +6071,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", @@ -6093,6 +6084,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6123,12 +6115,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..c239068c 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 @@ -2,7 +2,7 @@ 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 trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index babc39bb..0373f44d 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -6061,14 +6061,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6076,15 +6073,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", @@ -6095,6 +6086,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6125,12 +6117,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..13704dbc 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 @@ -2,7 +2,7 @@ use fuzz_instructions::incorrect_integer_arithmetic_3_fuzz_instructions::FuzzIns 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 trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index b8f170c6..014ca308 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -6059,14 +6059,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6074,15 +6071,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", @@ -6093,6 +6084,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6123,12 +6115,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..a0b6b879 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 @@ -2,7 +2,7 @@ use fuzz_instructions::incorrect_ix_sequence_1_fuzz_instructions::FuzzInstructio 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 trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index 28bb7ba5..1a11cc23 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -6052,14 +6052,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6067,15 +6064,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", @@ -6086,6 +6077,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6116,12 +6108,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..f9189619 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,6 +1,6 @@ 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 trident_client::fuzzing::*; use unauthorized_access_2::entry; use unauthorized_access_2::ID as PROGRAM_ID; mod accounts_snapshots; diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index 15e2a586..dc789acb 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -6052,14 +6052,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6067,15 +6064,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", @@ -6086,6 +6077,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6116,12 +6108,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..29b1c0ca 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,6 +1,6 @@ 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 trident_client::fuzzing::*; use unchecked_arithmetic_0::entry; use unchecked_arithmetic_0::ID as PROGRAM_ID; mod accounts_snapshots; From 9c5f6a5be0478072251e4bb5ee8e5cc890d64ac9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 5 Jul 2024 01:10:30 +0200 Subject: [PATCH 21/56] =?UTF-8?q?=F0=9F=94=A5=20Remove=20fuzzing=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/client/Cargo.toml | 9 +++------ crates/client/src/lib.rs | 1 - .../src/templates/trident-tests/Cargo_fuzz.toml.tmpl | 1 - crates/fuzz/src/lib.rs | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../hello_world/trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - 12 files changed, 4 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e35045b..9dd0851a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - 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)) - fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index e3e8f6a4..7d56d7f6 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -7,9 +7,6 @@ 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"] - [build-dependencies] anyhow = { version = "1.0.45", features = ["std"], default-features = false } @@ -39,11 +36,11 @@ solana-transaction-status = { workspace = true } solana-account-decoder = { workspace = true } spl-token = { workspace = true } spl-associated-token-account = { workspace = true } -solana-program-test = { workspace = true, optional = true } +solana-program-test = { workspace = true } # HONGGFUZZ -honggfuzz = { version = "0.5.55", optional = true } +honggfuzz = { version = "0.5.55" } # ARBITRARY arbitrary = { version = "1.3.0", features = ["derive"] } @@ -69,7 +66,7 @@ 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", optional = true } +quinn-proto = { version = "0.10.6", features = ["arbitrary"] } pathdiff = "0.2.1" indicatif = "0.17.8" regex = "1.10.3" diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index df0d0539..45ee7d15 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -4,7 +4,6 @@ //! Trident could be useful for writing Rust dApps, too. /// Aimed for the fuzz tests -#[cfg(feature = "fuzzing")] pub mod fuzzing { /// anchor_lang pub use anchor_lang; 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..a9473d4e 100644 --- a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl @@ -14,4 +14,3 @@ assert_matches = "1.4.0" [dependencies.trident-client] version = "0.6.0" -features=["fuzzing"] diff --git a/crates/fuzz/src/lib.rs b/crates/fuzz/src/lib.rs index 4c2a43e6..58831843 100644 --- a/crates/fuzz/src/lib.rs +++ b/crates/fuzz/src/lib.rs @@ -2,7 +2,6 @@ pub mod accounts_storage; pub mod data_builder; pub mod error; pub mod fuzzing_stats; -// #[cfg(feature = "fuzzing")] pub mod program_test_client_blocking; pub mod snapshot; pub type AccountId = u8; 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..a1a9df14 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 @@ -15,7 +15,6 @@ 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-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..24bac75d 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 @@ -16,7 +16,6 @@ anchor-spl = "0.29.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.arbitrary-limit-inputs-5] path = "../../programs/arbitrary-limit-inputs-5" 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..990fc1ec 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 @@ -15,7 +15,6 @@ 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/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..62ccf841 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 @@ -16,7 +16,6 @@ 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-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..5757ccf1 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 @@ -15,7 +15,6 @@ 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/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml index ffffdf00..8fd386ad 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 @@ -15,7 +15,6 @@ 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/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml index 21b589bd..ee0baec3 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 @@ -15,7 +15,6 @@ assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.unchecked-arithmetic-0] path = "../../programs/unchecked-arithmetic-0" From 135f78dd4092e944e16d75410e0cd39d91b33251 Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 5 Jul 2024 13:59:29 +0200 Subject: [PATCH 22/56] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Modify=20dependencie?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit removed anchor idl feature flags , increased minimal solana ver. to 1.17.4 --- .github/workflows/run_fuzz_example.yml | 2 +- Cargo.lock | 53 +++- Cargo.toml | 32 +- crates/client/Cargo.toml | 4 +- .../trident-tests/Cargo_fuzz.toml.tmpl | 2 +- crates/fuzz/Cargo.toml | 2 +- .../arbitrary-custom-types-4/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../arbitrary-limit-inputs-5/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- examples/fuzz-tests/hello_world/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../incorrect-integer-arithmetic-3/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../incorrect-ix-sequence-1/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../unauthorized-access-2/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../unchecked-arithmetic-0/Cargo.lock | 293 +++++++++++++++--- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- 20 files changed, 682 insertions(+), 188 deletions(-) diff --git a/.github/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index e8d07b8b..80773023 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -7,7 +7,7 @@ on: env: SOLANA_CLI_VERSION: 1.18.12 ANCHOR_VERSION: 0.29.0 - HONGGFUZZ_VERSION: 0.5.55 + HONGGFUZZ_VERSION: 0.5.56 jobs: run_fuzz_example: diff --git a/Cargo.lock b/Cargo.lock index 0490b437..8ebbed4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2789,6 +2788,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2807,6 +2815,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4008,7 +4028,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -5026,7 +5046,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5198,7 +5218,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5313,6 +5333,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5343,7 +5378,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5366,7 +5401,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6041,7 +6076,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6098,7 +6133,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 1f2cb53f..43dae98c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,18 +6,22 @@ resolver = "1" [workspace.dependencies] # ANCHOR -anchor-client = { version = ">=0.29.0" } -anchor-syn = { version = ">=0.29.0" } -anchor-spl = { version = ">=0.29.0" } -anchor-lang = { version = ">=0.29.0" } +anchor-client = ">=0.29.0" +anchor-syn = ">=0.29.0" +anchor-spl = ">=0.29.0" +anchor-lang = ">=0.29.0" + + # SOLANA -solana-sdk = "1.16" -solana-cli-output = "1.16" -solana-transaction-status = "1.16" -solana-account-decoder = "1.16" -solana-program = "1.16" -solana-banks-client = "1.16" -solana-program-runtime = "1.16" -solana-program-test = "1.16" -spl-token = "4.0.0" -spl-associated-token-account = "2.0.0" +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 = "3.0.2", features = [ + "no-entrypoint", +] } +spl-token = { version = "4.0.0", features = ["no-entrypoint"] } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 7d56d7f6..ef0774dc 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -24,8 +24,8 @@ 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 = { workspace = true, features = ["idl-build"] } -anchor-lang = { workspace = true, features = ["idl-build", "init-if-needed"] } +anchor-spl = { workspace = true } +anchor-lang = { workspace = true, features = ["init-if-needed"] } anchor-syn = { workspace = true } anchor-client = { workspace = true, features = ["async"] } 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 a9473d4e..be583182 100644 --- a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl @@ -7,7 +7,7 @@ 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" diff --git a/crates/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml index 704c8dc9..80ddf1f0 100644 --- a/crates/fuzz/Cargo.toml +++ b/crates/fuzz/Cargo.toml @@ -18,7 +18,7 @@ solana-program-runtime = { workspace = true } solana-program-test = { workspace = true } # ANCHOR -anchor-lang = { workspace = true, features = ["idl-build", "init-if-needed"] } +anchor-lang = { workspace = true, features = ["init-if-needed"] } anchor-syn = { workspace = true } diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index b417797a..bf55e703 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2089,13 +2088,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", ] @@ -2521,6 +2520,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" @@ -2785,6 +2793,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2803,6 +2820,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4032,7 +4061,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4063,7 +4092,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4198,7 +4227,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4384,7 +4413,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4795,7 +4824,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4871,7 +4900,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5056,7 +5085,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5228,7 +5257,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5343,6 +5372,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5373,7 +5417,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5396,7 +5440,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6076,7 +6120,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6133,7 +6177,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 a1a9df14..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index e72692c4..757154d8 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2091,13 +2090,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", ] @@ -2523,6 +2522,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" @@ -2787,6 +2795,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2805,6 +2822,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4034,7 +4063,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4065,7 +4094,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4200,7 +4229,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4386,7 +4415,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4797,7 +4826,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4873,7 +4902,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5058,7 +5087,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5230,7 +5259,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5345,6 +5374,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5375,7 +5419,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5398,7 +5442,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6078,7 +6122,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6135,7 +6179,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 24bac75d..3a6c4c05 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,7 +9,7 @@ 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" diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 9ae2578c..cc3414db 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2089,13 +2088,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", ] @@ -2521,6 +2520,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" @@ -2785,6 +2793,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2803,6 +2820,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4032,7 +4061,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4063,7 +4092,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4198,7 +4227,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4384,7 +4413,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4795,7 +4824,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4871,7 +4900,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5056,7 +5085,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5228,7 +5257,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5343,6 +5372,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5373,7 +5417,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5396,7 +5440,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6076,7 +6120,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6133,7 +6177,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 990fc1ec..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 0373f44d..6f768dd0 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2083,13 +2082,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", ] @@ -2523,6 +2522,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" @@ -2787,6 +2795,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2805,6 +2822,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4034,7 +4063,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4065,7 +4094,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4200,7 +4229,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4386,7 +4415,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4797,7 +4826,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4873,7 +4902,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5058,7 +5087,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5230,7 +5259,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5345,6 +5374,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5375,7 +5419,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5398,7 +5442,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6078,7 +6122,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6135,7 +6179,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 62ccf841..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,7 +9,7 @@ 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" diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index 014ca308..043a55b9 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2082,13 +2081,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", ] @@ -2521,6 +2520,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" @@ -2785,6 +2793,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2803,6 +2820,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4032,7 +4061,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4063,7 +4092,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4198,7 +4227,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4384,7 +4413,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4795,7 +4824,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4871,7 +4900,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5056,7 +5085,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5228,7 +5257,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5343,6 +5372,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5373,7 +5417,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5396,7 +5440,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6076,7 +6120,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6133,7 +6177,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 5757ccf1..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index 1a11cc23..11b32513 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2082,13 +2081,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", ] @@ -2514,6 +2513,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" @@ -2778,6 +2786,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2796,6 +2813,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4025,7 +4054,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4056,7 +4085,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4191,7 +4220,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4377,7 +4406,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4788,7 +4817,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4864,7 +4893,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5049,7 +5078,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5221,7 +5250,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5336,6 +5365,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5366,7 +5410,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5389,7 +5433,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6069,7 +6113,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6126,7 +6170,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 8fd386ad..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index dc789acb..c7ea855f 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", @@ -275,7 +274,7 @@ checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" dependencies = [ "anchor-lang", "solana-program", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token", "spl-token-2022 0.9.0", ] @@ -2082,13 +2081,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", ] @@ -2514,6 +2513,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" @@ -4027,8 +4035,8 @@ 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", ] @@ -4056,7 +4064,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4191,7 +4199,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4377,7 +4385,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4788,7 +4796,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4864,7 +4872,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5047,7 +5055,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", @@ -5226,6 +5234,22 @@ 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.0", + "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" @@ -5234,7 +5258,18 @@ checksum = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" 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]] @@ -5244,7 +5279,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn", + "spl-discriminator-syn 0.1.2", + "syn 2.0.60", +] + +[[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.60", ] @@ -5261,6 +5307,19 @@ dependencies = [ "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.60", + "thiserror", +] + [[package]] name = "spl-memo" version = "4.0.0" @@ -5280,7 +5339,20 @@ dependencies = [ "bytemuck", "solana-program", "solana-zk-token-sdk", - "spl-program-error", + "spl-program-error 0.3.1", +] + +[[package]] +name = "spl-pod" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ce669f48cf2eca1ec518916d8725596bfb655beb1c74374cf71dc6cb773c9" +dependencies = [ + "borsh 1.5.0", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error 0.4.1", ] [[package]] @@ -5292,7 +5364,20 @@ 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", ] @@ -5308,6 +5393,18 @@ dependencies = [ "syn 2.0.60", ] +[[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.60", +] + [[package]] name = "spl-tlv-account-resolution" version = "0.4.0" @@ -5316,10 +5413,10 @@ checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", + "spl-type-length-value 0.3.1", ] [[package]] @@ -5330,10 +5427,24 @@ checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", + "spl-type-length-value 0.3.1", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" +dependencies = [ + "bytemuck", + "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]] @@ -5365,11 +5476,11 @@ dependencies = [ "solana-program", "solana-zk-token-sdk", "spl-memo", - "spl-pod", + "spl-pod 0.1.1", "spl-token", - "spl-token-metadata-interface", + "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "spl-type-length-value 0.3.1", "thiserror", ] @@ -5388,12 +5499,36 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", + "spl-pod 0.1.1", "spl-token", - "spl-token-group-interface", - "spl-token-metadata-interface", + "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", + "spl-type-length-value 0.3.1", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" +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.2", + "spl-token", + "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", ] @@ -5405,9 +5540,22 @@ checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", +] + +[[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]] @@ -5418,10 +5566,24 @@ checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", + "spl-type-length-value 0.3.1", +] + +[[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.0", + "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]] @@ -5433,11 +5595,11 @@ dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", + "spl-type-length-value 0.3.1", ] [[package]] @@ -5449,11 +5611,27 @@ dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", "spl-tlv-account-resolution 0.5.2", - "spl-type-length-value", + "spl-type-length-value 0.3.1", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "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]] @@ -5464,9 +5642,22 @@ checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", +] + +[[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]] @@ -6068,7 +6259,7 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", + "spl-associated-token-account 3.0.2", "spl-token", "syn 1.0.109", "thiserror", 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 ee0baec3..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" From 3bf8287de84752356abbbc0dc57cbcfc94c72f68 Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 5 Jul 2024 22:20:25 +0200 Subject: [PATCH 23/56] =?UTF-8?q?=F0=9F=92=9A=20Add=20anchor=200.30.1=20pi?= =?UTF-8?q?peline=20run?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/run_fuzz_example.yml | 22 +- .../arbitrary-limit-inputs-5/.gitignore | 1 - .../arbitrary-limit-inputs-5/.prettierignore | 1 - .../arbitrary-limit-inputs-5/Anchor.toml | 6 +- .../arbitrary-limit-inputs-5/Cargo.lock | 1174 ++++++++++------- .../arbitrary-limit-inputs-5/Cargo.toml | 1 + .../arbitrary-limit-inputs-5/Trident.toml | 6 +- .../arbitrary-limit-inputs-5/package.json | 36 +- .../arbitrary-limit-inputs-5/Cargo.toml | 9 +- .../arbitrary-limit-inputs-5/src/lib.rs | 2 +- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../arbitrary-limit-inputs-5/tsconfig.json | 19 +- .../arbitrary-limit-inputs-5/yarn.lock | 181 +-- 13 files changed, 850 insertions(+), 610 deletions(-) diff --git a/.github/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index 80773023..907f6dba 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -5,15 +5,16 @@ on: pull_request: env: - SOLANA_CLI_VERSION: 1.18.12 - ANCHOR_VERSION: 0.29.0 + SOLANA_CLI_VERSION: 1.18.17 HONGGFUZZ_VERSION: 0.5.56 jobs: - run_fuzz_example: + unchecked-arithmetic-0: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 + - name: Set Anchor Version + run: echo "ANCHOR_VERSION=0.29.0" >> $GITHUB_ENV - uses: ./.github/actions/setup-rust/ - uses: ./.github/actions/setup-solana/ - uses: ./.github/actions/setup-honggfuzz/ @@ -23,3 +24,18 @@ jobs: - name: Test Fuzz working-directory: examples/fuzz-tests/unchecked-arithmetic-0 run: cargo run --manifest-path ../../../Cargo.toml 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: ./.github/actions/setup-rust/ + - uses: ./.github/actions/setup-solana/ + - uses: ./.github/actions/setup-honggfuzz/ + id: rust-setup + - uses: Swatinem/rust-cache@v2 + name: Cache Rust and it's packages + - name: Test Fuzz + working-directory: examples/fuzz-tests/arbitrary-limit-inputs-5 + run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 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 757154d8..02f46014 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,37 +262,66 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", + "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-token 4.0.0", - "spl-token-2022 0.9.0", + "spl-associated-token-account 3.0.2", + "spl-pod 0.2.2", + "spl-token", + "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", @@ -323,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" @@ -399,7 +434,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", @@ -422,7 +457,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", @@ -451,7 +486,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -551,9 +586,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", @@ -580,7 +615,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -596,15 +631,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", @@ -656,9 +691,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", ] @@ -733,11 +768,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", ] @@ -769,15 +804,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", ] @@ -827,9 +862,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", @@ -838,9 +873,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", @@ -879,22 +914,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]] @@ -932,9 +967,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", ] @@ -972,11 +1007,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", @@ -991,9 +1036,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" @@ -1007,7 +1052,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1162,18 +1207,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", ] @@ -1199,9 +1244,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" @@ -1285,12 +1330,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]] @@ -1309,16 +1354,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]] @@ -1334,13 +1379,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]] @@ -1381,7 +1426,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -1420,7 +1465,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1514,13 +1559,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]] @@ -1543,7 +1588,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1607,9 +1652,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" @@ -1643,13 +1688,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]] @@ -1658,11 +1703,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]] @@ -1686,9 +1731,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", @@ -1840,7 +1885,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1927,9 +1972,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", @@ -1940,9 +1985,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" @@ -1976,7 +2021,7 @@ dependencies = [ "indexmap 2.2.6", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tracing", ] @@ -2124,9 +2169,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" @@ -2142,9 +2187,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", @@ -2235,18 +2280,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", @@ -2254,9 +2299,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" @@ -2293,9 +2338,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", ] @@ -2376,15 +2421,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" @@ -2392,7 +2437,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", ] @@ -2452,15 +2497,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" @@ -2474,9 +2519,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" @@ -2489,9 +2534,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", @@ -2499,9 +2544,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", @@ -2509,9 +2554,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" @@ -2575,9 +2620,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", ] @@ -2697,11 +2742,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", ] @@ -2741,7 +2785,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2755,9 +2799,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", @@ -2778,9 +2822,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", ] @@ -2795,15 +2839,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2822,18 +2857,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -2843,7 +2866,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2855,7 +2878,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2866,9 +2889,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", ] @@ -2956,9 +2979,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", @@ -2972,16 +2995,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" @@ -3048,7 +3071,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3172,7 +3195,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -3220,9 +3243,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", ] @@ -3244,7 +3267,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3364,7 +3387,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]] @@ -3428,11 +3451,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]] @@ -3441,16 +3464,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", @@ -3460,9 +3483,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", @@ -3471,15 +3494,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" @@ -3514,7 +3537,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tower-service", "url", "wasm-bindgen", @@ -3547,7 +3570,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -3590,7 +3613,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.60", + "syn 2.0.68", "unicode-ident", ] @@ -3606,9 +3629,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" @@ -3640,7 +3663,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", @@ -3692,15 +3715,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" @@ -3743,7 +3766,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3758,11 +3781,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", @@ -3771,9 +3794,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", @@ -3781,9 +3804,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", ] @@ -3799,44 +3822,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" @@ -3865,10 +3897,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]] @@ -3906,7 +3938,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4048,9 +4080,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", @@ -4063,19 +4095,19 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", + "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", @@ -4134,9 +4166,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", @@ -4155,11 +4187,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", @@ -4172,9 +4204,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", @@ -4183,9 +4215,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", @@ -4203,9 +4235,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", @@ -4222,9 +4254,9 @@ 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", @@ -4240,9 +4272,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", @@ -4257,9 +4289,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", @@ -4273,9 +4305,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", @@ -4300,9 +4332,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", @@ -4333,9 +4365,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", @@ -4343,9 +4375,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", @@ -4357,9 +4389,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", @@ -4379,9 +4411,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", @@ -4403,9 +4435,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", @@ -4428,21 +4460,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", @@ -4453,9 +4485,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", @@ -4464,9 +4496,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", @@ -4474,9 +4506,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", @@ -4489,9 +4521,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", @@ -4517,9 +4549,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", @@ -4546,9 +4578,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", @@ -4556,11 +4588,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", @@ -4568,7 +4600,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.14", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", @@ -4577,7 +4609,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", @@ -4601,9 +4633,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", @@ -4629,9 +4661,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", @@ -4659,9 +4691,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", @@ -4684,9 +4716,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", @@ -4711,9 +4743,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", @@ -4721,9 +4753,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", @@ -4740,9 +4772,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", @@ -4766,9 +4798,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", @@ -4788,9 +4820,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", @@ -4801,9 +4833,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", @@ -4878,15 +4910,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", @@ -4933,15 +4965,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]] @@ -4952,9 +4984,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", @@ -4968,9 +5000,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", @@ -4983,9 +5015,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", @@ -5016,9 +5048,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", @@ -5030,9 +5062,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", @@ -5045,9 +5077,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", @@ -5069,9 +5101,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", @@ -5085,18 +5117,18 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-memo", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "thiserror", ] [[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", @@ -5109,9 +5141,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", @@ -5125,9 +5157,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", @@ -5144,9 +5176,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", @@ -5166,9 +5198,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", @@ -5180,9 +5212,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", @@ -5259,20 +5291,47 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "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 = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "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 = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" +checksum = "34d1814406e98b08c5cd02c1126f83fd407ad084adce0b05fda5730677822eac" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator-derive", + "spl-discriminator-derive 0.2.0", ] [[package]] @@ -5282,8 +5341,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]] @@ -5295,7 +5365,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", ] @@ -5310,27 +5393,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 = "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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0657b6490196971d9e729520ba934911ff41fbb2cb9004463dbe23cf8b4b4f" +checksum = "49065093ea91f57b9b2bd81493ff705e2ad4e64507a07dbc02b085778e02770e" dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-program-error-derive", + "spl-program-error-derive 0.4.1", "thiserror", ] @@ -5343,50 +5452,47 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" +name = "spl-program-error-derive" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.68", ] [[package]] name = "spl-tlv-account-resolution" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" +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-token" -version = "3.5.0" +name = "spl-tlv-account-resolution" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" dependencies = [ - "arrayref", "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", "solana-program", - "thiserror", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-type-length-value 0.4.3", ] [[package]] @@ -5406,9 +5512,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", @@ -5416,21 +5522,23 @@ dependencies = [ "num-traits", "num_enum 0.7.2", "solana-program", + "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "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 = "1.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" dependencies = [ "arrayref", "bytemuck", @@ -5441,12 +5549,12 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", - "spl-type-length-value", + "spl-pod 0.2.2", + "spl-token", + "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", ] @@ -5458,9 +5566,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]] @@ -5471,55 +5592,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 = "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.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" +checksum = "422ce13429dbd41d2cee8a73931c05fda0b0c8ca156a8b0c19445642550bb61a" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", ] [[package]] @@ -5540,6 +5688,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" @@ -5587,9 +5741,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", @@ -5605,7 +5759,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5649,9 +5803,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", @@ -5749,7 +5903,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5760,7 +5914,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "test-case-core", ] @@ -5781,22 +5935,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]] @@ -5861,9 +6015,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", ] @@ -5876,9 +6030,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", @@ -5895,13 +6049,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]] @@ -5973,16 +6127,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]] @@ -5995,11 +6148,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" @@ -6009,7 +6177,7 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.6", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -6020,7 +6188,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]] @@ -6049,7 +6230,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -6121,12 +6302,12 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", - "spl-token 3.5.0", + "spl-associated-token-account 3.0.2", + "spl-token", "syn 1.0.109", "thiserror", "tokio", - "toml", + "toml 0.5.11", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6179,7 +6360,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", @@ -6256,9 +6437,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" @@ -6315,9 +6496,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", @@ -6406,7 +6587,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -6440,7 +6621,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6513,7 +6694,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]] @@ -6531,7 +6712,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]] @@ -6551,18 +6732,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]] @@ -6573,9 +6754,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" @@ -6585,9 +6766,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" @@ -6597,15 +6778,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" @@ -6615,9 +6796,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" @@ -6627,9 +6808,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" @@ -6639,9 +6820,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" @@ -6651,9 +6832,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" @@ -6664,6 +6845,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" @@ -6714,22 +6904,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]] @@ -6749,7 +6939,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -6773,9 +6963,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 a398402c..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"]). @@ -38,4 +38,4 @@ save_all = 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 +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..b8210d00 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,13 @@ 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"] [dependencies] -anchor-lang = "0.29.0" -anchor-spl = "0.29.0" +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/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 3a6c4c05..b7f9a646 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 @@ -12,7 +12,7 @@ edition = "2021" 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" 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" From 3899077a0618eacaf560264384e465bffc3107e9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 6 Jul 2024 19:04:24 +0200 Subject: [PATCH 24/56] =?UTF-8?q?=E2=9C=A8=20Introduce=20AccountsSnapshots?= =?UTF-8?q?=20derive=20Macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Cargo.lock | 802 +++++++++++++----- crates/client/Cargo.toml | 2 + crates/client/src/lib.rs | 1 + .../snapshot_generator.rs | 6 +- .../expected_accounts_snapshots.rs | 7 +- crates/fuzz/Cargo.toml | 1 + .../fuzz/derive/accounts_snapshots/Cargo.toml | 19 + .../fuzz/derive/accounts_snapshots/src/lib.rs | 10 + .../fuzz/derive/fuzz_deserialize/src/lib.rs | 3 +- .../fuzz/derive/fuzz_test_executor/src/lib.rs | 2 +- crates/fuzz/src/data_builder.rs | 1 + crates/fuzz/src/lib.rs | 1 + crates/fuzz/src/snapshot.rs | 9 +- crates/fuzz/src/trident_accounts_struct.rs | 759 +++++++++++++++++ .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 2 + .../arbitrary-limit-inputs-5/Cargo.lock | 22 + .../arbitrary-limit-inputs-5/Cargo.toml | 4 +- .../src/instructions/initialize.rs | 4 +- .../src/instructions/withdraw.rs | 4 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 217 ----- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 3 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 1 - .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 1 + .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 + .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 6 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 2 + 28 files changed, 1427 insertions(+), 471 deletions(-) create mode 100644 crates/fuzz/derive/accounts_snapshots/Cargo.toml create mode 100644 crates/fuzz/derive/accounts_snapshots/src/lib.rs create mode 100644 crates/fuzz/src/trident_accounts_struct.rs delete mode 100644 examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dd0851a..2c839c7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) - del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - 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)) diff --git a/Cargo.lock b/Cargo.lock index 8ebbed4a..a9c043fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,9 +76,9 @@ dependencies = [ [[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", @@ -274,8 +274,8 @@ checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" dependencies = [ "anchor-lang", "solana-program", - "spl-associated-token-account", - "spl-token 4.0.0", + "spl-associated-token-account 2.3.0", + "spl-token", "spl-token-2022 0.9.0", ] @@ -376,6 +376,20 @@ version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +[[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" @@ -758,6 +772,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" @@ -784,6 +808,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.50", + "syn_derive", +] + [[package]] name = "borsh-derive-internal" version = "0.9.3" @@ -882,9 +920,9 @@ 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", ] @@ -991,6 +1029,12 @@ 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" @@ -1178,6 +1222,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" @@ -1386,17 +1439,6 @@ dependencies = [ "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", -] - [[package]] name = "dashmap" version = "5.5.3" @@ -1408,6 +1450,7 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core", + "rayon", ] [[package]] @@ -1494,6 +1537,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" @@ -1599,6 +1648,12 @@ dependencies = [ "syn 2.0.50", ] +[[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" @@ -1801,6 +1856,15 @@ dependencies = [ "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" @@ -1817,13 +1881,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" @@ -2042,7 +2103,7 @@ 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]] @@ -2262,6 +2323,25 @@ 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" @@ -2619,6 +2699,33 @@ dependencies = [ "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" @@ -2663,6 +2770,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" @@ -2788,15 +2901,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2815,18 +2919,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -3109,6 +3201,36 @@ 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" @@ -3203,9 +3325,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", ] @@ -3281,9 +3403,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", ] @@ -3762,6 +3884,15 @@ 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" @@ -3855,7 +3986,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", @@ -4013,9 +4144,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bc7bb65888ae7e13180dcd6a74d3233fcc57b627e138e34f2ac01601e92e6a2" +checksum = "cb0acf51e7100ff312eb16c3e0f30eb82bc23de071db542c530dcb240c50239f" dependencies = [ "Inflector", "base64 0.21.7", @@ -4028,19 +4159,19 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", + "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.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8a6960b763f5608a5373c3623e14b8c5d6afc98513637bc80f6a132a7c3436" +checksum = "06cc0b58c9ddb9f978ffd116728235841a3d5c35eda1bbf605d5c7eb62c7ba0e" dependencies = [ "arrayref", "bincode", @@ -4050,10 +4181,9 @@ dependencies = [ "byteorder", "bzip2", "crossbeam-channel", - "dashmap 4.0.2", + "dashmap", "flate2", "fnv", - "fs-err", "im", "index_list", "itertools", @@ -4062,10 +4192,10 @@ dependencies = [ "lz4", "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", @@ -4073,14 +4203,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", @@ -4097,14 +4230,14 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc7af1bec07573459641f5f3731adfe8804480ee5f3d6ff3396613999e20373" +checksum = "5fbd31eb27345b689f1a10763a2b6686c304fe52567c5e6f0dfedf06449211dd" dependencies = [ "bincode", "bytemuck", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -4118,11 +4251,11 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a81d32f3e655c48feb0c7f9e35e978cbd8cff1e8ab2628a5e4c6db4acf59d9" +checksum = "a8c8f3d14fbd3930a0d9c25fec5d6bd7f4e58eb63a12a2c52ce310168dddaf9d" dependencies = [ - "borsh 0.10.3", + "borsh 1.5.1", "futures", "solana-banks-interface", "solana-program", @@ -4135,9 +4268,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46351e3e3fcc299b5f601053aee4ef02041ff485dddccf67003c9a0da8f56321" +checksum = "b36b985636656b6ab830523f8340ab0b272f192148b2c92c5e7dbf4c60d70273" dependencies = [ "serde", "solana-sdk", @@ -4146,9 +4279,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904fcca7a6dd533eadc30b3aa690d3a78d95c0a49f36578a483539a3fcf709c8" +checksum = "f060504addd1cf57f45c63b44a674666117c482b1d6d39bdf293f7efc88b9638" dependencies = [ "bincode", "crossbeam-channel", @@ -4166,9 +4299,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10fff6fa164f4cfe66731b574b56c0883e56228a64f03b4e66634e09187219a" +checksum = "8d6ade96d078ce636533e5f2a96da651120da334a0af9eed6160e12c3b96035a" dependencies = [ "bincode", "byteorder", @@ -4185,16 +4318,16 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90122f6272c05baf8bbf88431be6feaf381aafd3d38e68b5ebd8c0a447f05f6" +checksum = "e31233a00b12c799c7bd93518394fbb1d168a9a86eca6f3d7e404ca03cdace04" dependencies = [ "bv", "bytemuck", "log", "memmap2 0.5.10", "modular-bitfield", - "num_enum 0.6.1", + "num_enum 0.7.2", "rand 0.8.5", "solana-measure", "solana-sdk", @@ -4203,9 +4336,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29a50c8ac6cb7cdefa3da425bad3122d14a7b9f5e1a6e1e4e64eb53c778c1ff" +checksum = "fe1de38b51034aa407fdf5579935c8e7a5e43d18d294cc76230080dbcfa2bbee" dependencies = [ "chrono", "clap 2.34.0", @@ -4220,9 +4353,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c88fefb22ac1f9f8e0f2d33da1b3f6ebc7411e112a26d6490f03d50254c493" +checksum = "2a53a51ccf2a444403d9d7f15b736be8571b47bb57b0dd66e35d31b16b087448" dependencies = [ "dirs-next", "lazy_static", @@ -4236,9 +4369,9 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f28330bfd12bc0a502b2bed7b0360f0fca62128744a824143b2a6dfbaf89fd" +checksum = "5b3ea750256172de8da64ed27412413d9d13fe247a3746d3271254b58e3d77aa" dependencies = [ "Inflector", "base64 0.21.7", @@ -4263,13 +4396,13 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93b28ec883a4bb22289ef31851abe5f2c9247748cf79580aef954ec9759b84ca" +checksum = "790ce6ac8ad0f7e3531327a7ea486433ea2d9513bbaa9e51f9ce9c687aa5c687" dependencies = [ "async-trait", "bincode", - "dashmap 4.0.2", + "dashmap", "futures", "futures-util", "indexmap 2.2.3", @@ -4296,9 +4429,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e60e708bc0f1cb7807ee7ac81a73c72dfd90347cd906d918101de7e91f0b4407" +checksum = "4fc0d9facac6c11c0fcd565f20ec6855b7728133956ac7e71475badb04e313b3" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4306,9 +4439,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5fa041dc7ebb8079fb15a4691b2822d8a67a615f90a838e43aa556eaab6178" +checksum = "56db52d5c4faa7dba6dd0d82deb89d1b442524ea241b8d88940efae656236009" dependencies = [ "bincode", "chrono", @@ -4320,9 +4453,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f933d76a147dc6bb37daff4314c7b63a8a4778be259d8cbe8126294d97b328d" +checksum = "cc24ca8cdf265fe38e4f43ba8d3a97368a8269a59b6e7b9be097b54a19565359" dependencies = [ "async-trait", "bincode", @@ -4342,9 +4475,9 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "506d373966c1118111c3d72ba88172e907d9699a2d6792210f31ed7423e654d9" +checksum = "f10d6e9e0f0afbdbc839c4a10b1c8b34361e4a8bbe608cb2e0c3d036b02a6344" dependencies = [ "lazy_static", "log", @@ -4366,17 +4499,13 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a64bc1df0fcda5884f6cf6eb50f8aa283dbf767e984fcbbb53e344859b597f" +checksum = "e5fa9c8e908d743fc4b446c675d15f8290b1a400d84640f7fae6256aeea4815d" dependencies = [ - "ahash 0.8.4", - "blake3", "block-buffer 0.10.4", "bs58 0.4.0", "bv", - "byteorder", - "cc", "either", "generic-array", "im", @@ -4387,7 +4516,6 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "serde_json", "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", @@ -4396,9 +4524,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8e0e27e6639f23a7d23e0ae7b92b8ab5d848bb649e962f6528a795988ca161" +checksum = "207d87baccbc41473f151443b8d2b8f8ba85ace1b05bef368a2cbe0858ae6a77" dependencies = [ "proc-macro2", "quote", @@ -4408,9 +4536,9 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5918fbb8bfc74dc48d97e09bfd7c94772e63c8e252875f5834de7d56b4afe" +checksum = "64c8569a2fa9f9a7ec2f3760a0d4764543963a72fbd57dde91a0b2cdd9533354" dependencies = [ "log", "solana-measure", @@ -4421,9 +4549,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b868a3b8148d7ab3e44a6b40530843903bedaaf8c6a2aa3d797eb01b3435538d" +checksum = "5540574de96cac634cb9c82ba7635aab00cbc37a277d36fa1d491a43f3d6e5f8" dependencies = [ "env_logger", "lazy_static", @@ -4432,9 +4560,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5a243ef9e5f0364a3625a74ac701ff15d28d57f997cfcfc5b27badb0f0f36d" +checksum = "f9c106b7bb39e23d9fddafababe5b7e489cad207a5bd6e06d46e66f9c88647fe" dependencies = [ "log", "solana-sdk", @@ -4442,9 +4570,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b007b5f98cf2f3760fd28b3e9131e68ba9e55a9b164be966fc108e859999c1f8" +checksum = "4899f40673b3a7fa556839338814a462889a283d45ad7a84922ed0ed84dba72f" dependencies = [ "crossbeam-channel", "gethostname", @@ -4457,9 +4585,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6de74b7158359b85c773436284cd0bf68f925434888d2681d3db68dc1a1e4460" +checksum = "eb6c23a2a7af5d49c843b005c02721478d2befb0844e4337239919efa1b8618f" dependencies = [ "bincode", "clap 3.2.25", @@ -4477,13 +4605,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.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a837e4272603ec6b73e72db330f3b1b3b03174b6f2f57d28daf8d702adaa35" +checksum = "f9ec5d17735265dadcdf7eae04276370cc8570945cc47a04a7972b0752897546" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.11", "bincode", "bv", "caps", @@ -4508,9 +4642,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ec090add6d789cd498291fbbcbc4207ec5d8f4df4e93cf9bd30feed14474a1" +checksum = "4d0175aa736ef2bac329de17727b783fbc7c83dee182a0fbb5c8b45316c22cae" dependencies = [ "ark-bn254", "ark-ec", @@ -4522,6 +4656,7 @@ dependencies = [ "blake3", "borsh 0.10.3", "borsh 0.9.3", + "borsh 1.5.1", "bs58 0.4.0", "bv", "bytemuck", @@ -4539,7 +4674,7 @@ dependencies = [ "log", "memoffset 0.9.0", "num-bigint 0.4.4", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "parking_lot", "rand 0.8.5", @@ -4562,9 +4697,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b0b2035bff6725d6792c2709871b3df58517e5b064fe8ae9a00aa9ec7c2804" +checksum = "983f4b793c1cb5186d2a2ed1ea460733972d294d972982a1943ab2bf6c6a218a" dependencies = [ "base64 0.21.7", "bincode", @@ -4573,7 +4708,7 @@ dependencies = [ "itertools", "libc", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "percentage", "rand 0.8.5", @@ -4590,9 +4725,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509de66ffda8fb3fc951d531a06320b2bc9a9c88792a408f79157a7123a25e17" +checksum = "5df36e5e37b2166723be77d4f6aae79a22251344f6bc7b92b96fd45e230ab943" dependencies = [ "assert_matches", "async-trait", @@ -4620,9 +4755,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb2e34874dc723285d1eedeb5d6c9b51e4b19e0b71434b5121019d21d4e5553" +checksum = "ea8dee0de77fe38ecc41384ba8fe058c04c213d0ae6feaec94e08d4b286f43da" dependencies = [ "crossbeam-channel", "futures-util", @@ -4645,9 +4780,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0a48caf146b1f226b0a049053ae77034df28818413c20528834b11d61e3c6a" +checksum = "a27f714d0c54b430ba97381053f3b2da7b5ada642dbe799dabe8546772573f85" dependencies = [ "async-mutex", "async-trait", @@ -4672,9 +4807,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b9aa7bb42651394ac4f087df364bfcf801d8d9f249e94721e1ef15240c5887" +checksum = "a40d1d7ad73ff88642e978b35ec404fb932e6499e6c5061cb53e33423bc157ac" dependencies = [ "lazy_static", "num_cpus", @@ -4682,14 +4817,14 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68904b56c0457dd688300069f825c169d30acfa4eddfd5662b0ca700437c5d78" +checksum = "9be0a98dbe7fbb6ce2b3343f2aceb5fdd8f94ce7672d01201f50bef83b8af009" dependencies = [ "console", "dialoguer", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "parking_lot", "qstring", @@ -4701,9 +4836,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48b323271070ea8e2902c101d808d54c7d910d573b02a646e0c462aa6de2dc" +checksum = "e5240a1e261c4cf8261206b76d9710f1e7b26c7b2af1e4ee7b84592c298ad9f1" dependencies = [ "async-trait", "base64 0.21.7", @@ -4727,9 +4862,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa40fc52832e790c53e27baf771926542b5b9a370c5dad59cbc31055b1e52a2b" +checksum = "023317ad467034ac4bd4ea01a95c206018a123af97814c40a5035bf9e0c4f082" dependencies = [ "base64 0.21.7", "bs58 0.4.0", @@ -4749,9 +4884,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd6be836c589018ad607193ccf27677ac8e97125c40642ab2183f23deb95a5f" +checksum = "ed8e4e5066a27c1f9b095cfc4b034860717ba0af079e975848daf58d304b81c2" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4762,10 +4897,11 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db3f3cf470ed0ec22b606f27fcaabad538486f15318abb7938e7225ca760401" +checksum = "d247839cedb3581fc3b21bfff7cca1a817fbcb5b5a1297bfff2d136a038468b6" dependencies = [ + "aquamarine", "arrayref", "base64 0.21.7", "bincode", @@ -4775,11 +4911,10 @@ dependencies = [ "byteorder", "bzip2", "crossbeam-channel", - "dashmap 4.0.2", + "dashmap", "dir-diff", "flate2", "fnv", - "fs-err", "im", "index_list", "itertools", @@ -4788,11 +4923,12 @@ dependencies = [ "lru", "lz4", "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", @@ -4803,7 +4939,6 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "siphasher", "solana-accounts-db", "solana-address-lookup-table-program", "solana-bpf-loader-program", @@ -4839,15 +4974,15 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2817e4e1190e3539c989b3b350ee306b91e63959e19638e2632cc92ac9041527" +checksum = "d0cf4419ab0807e6d7d27b7e45c0b3996caf5c2f40d6b920ce797593f96041be" dependencies = [ "assert_matches", "base64 0.21.7", "bincode", "bitflags 2.4.2", - "borsh 0.10.3", + "borsh 1.5.1", "bs58 0.4.0", "bytemuck", "byteorder", @@ -4864,9 +4999,9 @@ dependencies = [ "libsecp256k1", "log", "memmap2 0.5.10", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", - "num_enum 0.6.1", + "num_enum 0.7.2", "pbkdf2 0.11.0", "qstring", "qualifier_attr", @@ -4881,6 +5016,7 @@ dependencies = [ "serde_with", "sha2 0.10.8", "sha3 0.10.8", + "siphasher", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -4893,9 +5029,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04051488f4275df58be7abf34dc0583f4d38df72000a047c85a549c6a996acc0" +checksum = "2a19fb7874415de034a3067a71447a376be204be8f0a84a2861a65bbdb2286dd" dependencies = [ "bs58 0.4.0", "proc-macro2", @@ -4912,9 +5048,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3654be11d71a8751014b4ff07dbdaf5b513fe4876089011f96fc3cdb898e8a" +checksum = "dc21bd9a0b95931b422d32a90db7068490ff68ecfe388c79aedceb763a48f341" dependencies = [ "crossbeam-channel", "log", @@ -4928,9 +5064,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8c6ada46e6116fd58cafbb4cd65eb1129f75d4c9e1531d3d265131bf0455bc" +checksum = "5bde9fe6d14e70e85b81061e222189a368c655f1af956dac8f658748cf7fdab1" dependencies = [ "bincode", "log", @@ -4943,9 +5079,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4a9a97a9e559d4b1eaeb6a5700c9c9c109a15fdac1f7253af529677a69b39c" +checksum = "d18342730db0c08836134b226c938e380039feb219e0502a55fd5c1df793a178" dependencies = [ "async-channel", "bytes", @@ -4975,9 +5111,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b15c250192f85b386f65a4c392645a979673e0e2315f0628e6791707ca01d3" +checksum = "71aa5503922fd7116d09367b8acdc6f5375af22db4a01a084427d29655cd230a" dependencies = [ "bincode", "log", @@ -4989,9 +5125,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "603ed51b04bbe7645c2f8a532adc1cf30e74b92d321171fc381caf29836f6fe0" +checksum = "a380d99338995b308f4ecb06086a460f9b99a26ed801bb1b2f1a426764c1ed40" dependencies = [ "bincode", "log", @@ -5004,9 +5140,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd9242b9df608c1e4d8ed0a22e68e864313678aa2d6f78e3a6bb75b42859a08" +checksum = "14dd5d6a503da75fad16547c57bd7e919b2aa6ad6d73986cb8a3e76edf97acdc" dependencies = [ "async-trait", "bincode", @@ -5028,9 +5164,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53ebc2543fe6066cc3b530fce572d1a204a207fa801b258682efcf1955da683" +checksum = "892ec130ff5761ef96a271a9367cb1f3cdf64f70ec133331c491253e91d236aa" dependencies = [ "Inflector", "base64 0.21.7", @@ -5044,18 +5180,18 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-memo", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "thiserror", ] [[package]] name = "solana-udp-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49d8462ebedc0524d5c287dd7feea3ac13622b424deba4459813fff1748a9bb" +checksum = "64f6a9d9e77cfd897dda8a26c2faaf75850ecc8204b871a62eeb61819aa3d882" dependencies = [ "async-trait", "solana-connection-cache", @@ -5068,9 +5204,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ac486deb05a0c4164e892091c6c817c9f9a54d658721e316f49040ab2f2df9" +checksum = "e0785c3b70924eda59d5369ada65c1676d7bb15bdfe0d60c56a343b640fd388a" dependencies = [ "log", "rustc_version", @@ -5084,9 +5220,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d9ceea1905d41065b73d763c7d816a271d0ba9e43df6834759ec61d1560974" +checksum = "81c5d83aa3fe3a2c9a6d274604fc9752fdd747febd8d3e6340f2b2355c5b7edc" dependencies = [ "crossbeam-channel", "itertools", @@ -5103,13 +5239,13 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b87fe95b52594e21a410ec5ab00c3266ebf41997c8c28ca6765b123eaf5a475" +checksum = "a5efdfa03b77da6b38a2039758af252c6a32154a3b564d1dc5de85e36742c462" dependencies = [ "bincode", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -5125,12 +5261,12 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68964dbd32b6119a1eafcb871dbc4225e91a74f90450d6edf0c7ccc3111082fe" +checksum = "f59fb5bca66781c5ab44019821f33e83d66e1b54e65b736cfe9542e3dd2ab527" dependencies = [ "bytemuck", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "solana-program-runtime", "solana-sdk", @@ -5139,9 +5275,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d860992705578848d2a04e8a2a5b2b2d380b0be5db8cf9d0744a166e269c0ceb" +checksum = "b24acce0cfccafd57d558884d46a153400d3125e00ca802c02071a21cafcbb61" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -5153,7 +5289,7 @@ dependencies = [ "itertools", "lazy_static", "merlin", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rand 0.7.3", "serde", @@ -5218,11 +5354,27 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "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.0" @@ -5231,7 +5383,18 @@ 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]] @@ -5241,7 +5404,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn", + "spl-discriminator-syn 0.1.2", + "syn 2.0.50", +] + +[[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.50", ] @@ -5258,6 +5432,19 @@ dependencies = [ "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.50", + "thiserror", +] + [[package]] name = "spl-memo" version = "4.0.0" @@ -5277,7 +5464,20 @@ dependencies = [ "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]] @@ -5289,7 +5489,20 @@ 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", ] @@ -5305,6 +5518,18 @@ dependencies = [ "syn 2.0.50", ] +[[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.50", +] + [[package]] name = "spl-tlv-account-resolution" version = "0.4.0" @@ -5313,10 +5538,10 @@ checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" 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]] @@ -5327,25 +5552,24 @@ 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-token" -version = "3.5.0" +name = "spl-tlv-account-resolution" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" dependencies = [ - "arrayref", "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", "solana-program", - "thiserror", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-type-length-value 0.4.3", ] [[package]] @@ -5377,11 +5601,11 @@ dependencies = [ "solana-program", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-metadata-interface", + "spl-pod 0.1.0", + "spl-token", + "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "spl-type-length-value 0.3.0", "thiserror", ] @@ -5400,12 +5624,36 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", + "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", + "spl-type-length-value 0.3.0", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" +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.2", + "spl-token", + "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", ] @@ -5417,9 +5665,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]] @@ -5430,10 +5691,24 @@ 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]] @@ -5445,11 +5720,11 @@ dependencies = [ "arrayref", "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", "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", + "spl-type-length-value 0.3.0", ] [[package]] @@ -5461,11 +5736,27 @@ dependencies = [ "arrayref", "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", "spl-tlv-account-resolution 0.5.1", - "spl-type-length-value", + "spl-type-length-value 0.3.0", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "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]] @@ -5476,9 +5767,22 @@ 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]] @@ -5555,6 +5859,18 @@ dependencies = [ "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.50", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -5672,6 +5988,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" @@ -6075,12 +6397,13 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", - "spl-token 3.5.0", + "spl-associated-token-account 3.0.2", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6088,6 +6411,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6122,6 +6455,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6133,7 +6467,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index ef0774dc..07660873 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -18,6 +18,8 @@ pretty_assertions = "1.1.0" trident-derive-displayix = { path = "../fuzz/derive/display_ix", version = "0.0.1" } trident-derive-fuzz-deserialize = { path = "../fuzz/derive/fuzz_deserialize", version = "0.0.1" } trident-derive-fuzz-test-executor = { path = "../fuzz/derive/fuzz_test_executor", version = "0.0.1" } +trident-derive-accounts-snapshots = { path = "../fuzz/derive/accounts_snapshots", version = "0.0.1" } + trident-test = { path = "../test", version = "0.3.2" } trident-fuzz = { path = "../fuzz", version = "0.1.0" } diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index 45ee7d15..247c328e 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -30,6 +30,7 @@ pub mod fuzzing { pub use honggfuzz::fuzz; /// trident derive + pub use trident_derive_accounts_snapshots::AccountsSnapshots; pub use trident_derive_displayix::DisplayIx; pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; diff --git a/crates/client/src/source_code_generators/snapshot_generator.rs b/crates/client/src/source_code_generators/snapshot_generator.rs index 21e9a44a..1531916e 100644 --- a/crates/client/src/source_code_generators/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 #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/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs b/crates/client/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs index 872d64a2..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,5 +1,4 @@ use anchor_lang::prelude::*; -use fuzz_example3::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, @@ -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/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml index 80ddf1f0..1d693bab 100644 --- a/crates/fuzz/Cargo.toml +++ b/crates/fuzz/Cargo.toml @@ -37,3 +37,4 @@ 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..a8a17f11 --- /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 = "1" +quote = "1" +syn = "1" +trident-fuzz = { path = "../../", version = "0.1.0" } 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..e9879bf3 --- /dev/null +++ b/crates/fuzz/derive/accounts_snapshots/src/lib.rs @@ -0,0 +1,10 @@ +use proc_macro::TokenStream; +use quote::ToTokens; +use syn::parse_macro_input; + +#[proc_macro_derive(AccountsSnapshots)] +pub fn derive_accounts_snapshots(item: TokenStream) -> TokenStream { + parse_macro_input!(item as trident_fuzz::trident_accounts_struct::TridentAccountsStruct) + .to_token_stream() + .into() +} diff --git a/crates/fuzz/derive/fuzz_deserialize/src/lib.rs b/crates/fuzz/derive/fuzz_deserialize/src/lib.rs index 46e5b753..3ed818de 100644 --- a/crates/fuzz/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/fuzz/derive/fuzz_test_executor/src/lib.rs b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs index 6ca24177..20f466d4 100644 --- a/crates/fuzz/derive/fuzz_test_executor/src/lib.rs +++ b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs @@ -60,7 +60,7 @@ pub fn fuzz_test_executor(input: TokenStream) -> TokenStream { stats_logger.increase_successful(self.to_context_string()); snaphot.capture_after(client).unwrap(); - let (acc_before, acc_after) = snaphot.get_snapshot() + 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 diff --git a/crates/fuzz/src/data_builder.rs b/crates/fuzz/src/data_builder.rs index 286f12a0..d66caef8 100644 --- a/crates/fuzz/src/data_builder.rs +++ b/crates/fuzz/src/data_builder.rs @@ -210,6 +210,7 @@ pub trait FuzzDeserialize<'info> { fn deserialize_option( &self, + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> Result; } diff --git a/crates/fuzz/src/lib.rs b/crates/fuzz/src/lib.rs index 58831843..7b45fcf8 100644 --- a/crates/fuzz/src/lib.rs +++ b/crates/fuzz/src/lib.rs @@ -5,3 +5,4 @@ pub mod fuzzing_stats; pub mod program_test_client_blocking; pub mod snapshot; pub type AccountId = u8; +pub mod trident_accounts_struct; diff --git a/crates/fuzz/src/snapshot.rs b/crates/fuzz/src/snapshot.rs index 995ebcbf..1a1b77fd 100644 --- a/crates/fuzz/src/snapshot.rs +++ b/crates/fuzz/src/snapshot.rs @@ -98,7 +98,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 +117,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/fuzz/src/trident_accounts_struct.rs b/crates/fuzz/src/trident_accounts_struct.rs new file mode 100644 index 00000000..f60efd64 --- /dev/null +++ b/crates/fuzz/src/trident_accounts_struct.rs @@ -0,0 +1,759 @@ +use anchor_syn::{AccountField, AccountTy}; +use convert_case::{Case, Casing}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use syn::parse::{Parse, ParseStream}; +use syn::{Ident, ItemStruct, Result as ParseResult}; + +pub 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, + )?)) + } +} + +pub 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 + } + } +} +pub 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 + } +} + +pub 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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref(); + } + } else { + quote! { + let #f_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::from_account_info) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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.to_string().to_case(Case::Snake) + ), + 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/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 509c99d4..3cf2473e 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 @@ -12,6 +12,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(); @@ -58,6 +59,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-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 02f46014..5bc89c18 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -391,6 +391,7 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", + "trident-client", ] [[package]] @@ -1180,6 +1181,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" @@ -6308,6 +6318,7 @@ dependencies = [ "thiserror", "tokio", "toml 0.5.11", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6315,6 +6326,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6349,6 +6370,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", 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 b8210d00..ad9259e6 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,13 +9,15 @@ crate-type = ["cdylib", "lib"] name = "arbitrary_limit_inputs_5" [features] -default = [] +default = ["trident-fuzzing"] cpi = ["no-entrypoint"] no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +trident-fuzzing = ["trident-client"] [dependencies] anchor-lang = "0.30.1" anchor-spl = "0.30.1" +trident-client = { path = "../../../../../crates/client", optional = true } 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..4da9fe6a 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 @@ -3,6 +3,8 @@ use anchor_spl::token::{ set_authority, transfer, Mint, SetAuthority, Token, TokenAccount, Transfer, }; +use trident_client::fuzzing::AccountsSnapshots; + use crate::state::Escrow; use crate::VestingError; @@ -61,7 +63,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..ce146e32 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_client::fuzzing::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/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 129df822..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_lang::prelude::*; -use anchor_spl::token::{Mint, Token, TokenAccount}; -use arbitrary_limit_inputs_5::ID as PROGRAM_ID; -use trident_client::fuzzing::{anchor_lang, 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 e233562a..a8c51b00 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,5 +1,6 @@ pub mod arbitrary_limit_inputs_5_fuzz_instructions { - use crate::accounts_snapshots::*; + use arbitrary_limit_inputs_5::instructions::initialize::trident_fuzz_init_vesting_snapshot::InitVestingSnapshot; + use arbitrary_limit_inputs_5::instructions::withdraw::trident_fuzz_withdraw_unlocked_snapshot::WithdrawUnlockedSnapshot; use solana_sdk::native_token::LAMPORTS_PER_SOL; use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; use trident_client::fuzzing::*; 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 446ca549..1548b67d 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 @@ -3,7 +3,6 @@ use arbitrary_limit_inputs_5::ID as PROGRAM_ID; use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::FuzzInstruction; use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; use trident_client::fuzzing::*; -mod accounts_snapshots; mod fuzz_instructions; const PROGRAM_NAME: &str = "arbitrary_limit_inputs_5"; 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 86e3ecb2..22a852d9 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 @@ -9,6 +9,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(); 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 c95cb226..5d93dc8a 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,7 @@ +use anchor_lang::prelude::*; use anchor_spl::token::{Mint, Token, TokenAccount}; use incorrect_integer_arithmetic_3::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; -use anchor_lang::prelude::*; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, @@ -23,6 +23,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(); @@ -115,6 +116,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(); 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 cf102ee4..48c6f844 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 @@ -24,6 +24,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(); @@ -70,6 +71,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(); @@ -127,6 +129,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 +153,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/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 89c6e088..cc8aef74 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,6 @@ -use unauthorized_access_2::ID as PROGRAM_ID; -use trident_client::fuzzing::{anchor_lang, FuzzingError}; use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; +use unauthorized_access_2::ID as PROGRAM_ID; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub escrow: Option>, @@ -13,6 +13,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(); @@ -59,6 +60,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(); 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 ea5d9721..2042ddd2 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 @@ -12,6 +12,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(); @@ -58,6 +59,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(); From 4fdd9c72d664d5038b66fa52642233dfd4e3b5b8 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 6 Jul 2024 23:21:12 +0200 Subject: [PATCH 25/56] =?UTF-8?q?=F0=9F=94=A5=20Remove=20localnet=20subcom?= =?UTF-8?q?mand?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/cli/src/command.rs | 3 --- crates/cli/src/command/localnet.rs | 15 --------------- crates/cli/src/lib.rs | 3 --- 4 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 crates/cli/src/command/localnet.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c839c7c..0da2a630 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) - feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) - del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - feat/fuzzing moved to separate crate trident-fuzz ([#175](https://github.com/Ackee-Blockchain/trident/pull/175)) diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index 44694d4e..a6f4a400 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -10,9 +10,6 @@ pub use fuzz::{fuzz, FuzzCommand}; mod test; pub use test::test; -mod localnet; -pub use localnet::localnet; - mod init; pub use init::{init, TestsType}; diff --git a/crates/cli/src/command/localnet.rs b/crates/cli/src/command/localnet.rs deleted file mode 100644 index cae67c5a..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::___private::Commander; - -#[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/lib.rs b/crates/cli/src/lib.rs index f1173b00..d3859333 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -45,8 +45,6 @@ enum Command { #[clap(subcommand)] subcmd: FuzzCommand, }, - /// Run local test validator - Localnet, /// Initialize test environment Init { /// Specifies the types of tests for which the frameworks should be initialized. @@ -66,7 +64,6 @@ 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::Init { tests_type } => command::init(tests_type).await?, Command::Clean => command::clean().await?, } From e9ce29a39725d3a8946ac167b14e542339e3afcb Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 10 Jul 2024 11:25:31 +0200 Subject: [PATCH 26/56] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Remove=20anchor-spl?= =?UTF-8?q?=20from=20dependencies=20and=20bump=20some=20dependecies=20down?= =?UTF-8?q?=20so=20Trident=20so=20isntallation=20is=20not=20resolving=20so?= =?UTF-8?q?lana=20v2.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1352 ++++++++++++++++---------------------- Cargo.toml | 7 +- crates/client/Cargo.toml | 1 - 3 files changed, 584 insertions(+), 776 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9c043fe..ab61384e 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,7 +69,7 @@ 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", ] @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" 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", @@ -257,36 +263,47 @@ dependencies = [ "anchor-derive-serde", "anchor-derive-space", "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 2.3.0", - "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", @@ -372,9 +389,9 @@ 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" @@ -440,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", @@ -463,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", @@ -492,7 +509,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -592,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", @@ -615,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]] @@ -637,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", @@ -680,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" @@ -697,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", ] @@ -715,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", @@ -818,7 +844,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "syn_derive", ] @@ -868,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", @@ -879,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", @@ -895,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" @@ -929,13 +955,13 @@ dependencies = [ [[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]] @@ -946,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" @@ -973,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", ] @@ -992,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", ] @@ -1015,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]] @@ -1037,9 +1064,9 @@ 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", @@ -1047,7 +1074,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -1131,7 +1158,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1170,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", ] @@ -1258,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", ] @@ -1295,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" @@ -1381,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]] @@ -1405,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]] @@ -1430,13 +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", + "syn 2.0.70", ] [[package]] @@ -1446,7 +1473,7 @@ 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", @@ -1455,9 +1482,9 @@ dependencies = [ [[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" @@ -1477,7 +1504,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -1516,7 +1543,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1616,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]] @@ -1645,7 +1672,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1709,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" @@ -1727,9 +1754,9 @@ 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", ] @@ -1745,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]] @@ -1760,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]] @@ -1788,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", @@ -1804,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" @@ -1842,15 +1869,15 @@ 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", @@ -1942,7 +1969,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1959,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" @@ -2017,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", @@ -2030,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" @@ -2053,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", @@ -2063,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", ] @@ -2108,9 +2135,9 @@ dependencies = [ [[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" @@ -2138,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" @@ -2192,9 +2219,9 @@ dependencies = [ [[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", @@ -2214,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" @@ -2232,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", @@ -2344,9 +2371,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" @@ -2360,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]] @@ -2383,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", ] @@ -2402,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", ] @@ -2418,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", ] @@ -2466,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]] @@ -2543,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", @@ -2565,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" @@ -2580,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", @@ -2590,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", @@ -2600,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" @@ -2648,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", ] @@ -2681,18 +2708,18 @@ 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", @@ -2803,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", ] @@ -2847,7 +2873,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2861,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", @@ -2884,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", ] @@ -2897,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", ] @@ -2928,7 +2954,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2940,7 +2966,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2951,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", ] @@ -2975,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" @@ -3041,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", @@ -3051,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" @@ -3118,29 +3144,29 @@ dependencies = [ [[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" @@ -3249,12 +3275,12 @@ 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]] @@ -3349,7 +3375,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3469,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]] @@ -3492,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", @@ -3531,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", @@ -3556,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", @@ -3567,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", @@ -3610,7 +3645,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tower-service", "url", "wasm-bindgen", @@ -3643,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", @@ -3686,7 +3721,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.50", + "syn 2.0.70", "unicode-ident", ] @@ -3702,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" @@ -3732,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", @@ -3745,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", @@ -3788,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" @@ -3839,7 +3874,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3854,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", @@ -3867,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", @@ -3877,9 +3912,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", ] @@ -3895,38 +3930,38 @@ dependencies = [ [[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", @@ -3961,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", @@ -4002,7 +4037,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -4088,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", ] @@ -4128,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.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0acf51e7100ff312eb16c3e0f30eb82bc23de071db542c530dcb240c50239f" +checksum = "4973213a11c2e1b924b36e0c6688682b5aa4623f8d4eeaa1204c32cee524e6d6" dependencies = [ "Inflector", "base64 0.21.7", @@ -4160,18 +4195,18 @@ dependencies = [ "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", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", "thiserror", "zstd", ] [[package]] name = "solana-accounts-db" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06cc0b58c9ddb9f978ffd116728235841a3d5c35eda1bbf605d5c7eb62c7ba0e" +checksum = "74c06263320e399af20d46c8cebea7a1d5dc1bc56f31f8dfaacf7119576c48a7" dependencies = [ "arrayref", "bincode", @@ -4230,9 +4265,9 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbd31eb27345b689f1a10763a2b6686c304fe52567c5e6f0dfedf06449211dd" +checksum = "f4e57cb8f2e90361280b246f70bb7f5f86f4e4ff1ad5bbdfe18a81bea141f03a" dependencies = [ "bincode", "bytemuck", @@ -4251,9 +4286,9 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c8f3d14fbd3930a0d9c25fec5d6bd7f4e58eb63a12a2c52ce310168dddaf9d" +checksum = "7c65a9540370523f3ade7190526309337cc50f1d742b3341dfa7357da3f59a56" dependencies = [ "borsh 1.5.1", "futures", @@ -4268,9 +4303,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36b985636656b6ab830523f8340ab0b272f192148b2c92c5e7dbf4c60d70273" +checksum = "62b1dc20a7a71cf37bcbc2a3a5dfd73d7410a13850aa68d954a9c09e6a77e652" dependencies = [ "serde", "solana-sdk", @@ -4279,9 +4314,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f060504addd1cf57f45c63b44a674666117c482b1d6d39bdf293f7efc88b9638" +checksum = "d449d55d3c5c3fe4c9f0c9f790a9feabe294f8ff0b4c6b771a20b2313ad8974a" dependencies = [ "bincode", "crossbeam-channel", @@ -4299,9 +4334,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6ade96d078ce636533e5f2a96da651120da334a0af9eed6160e12c3b96035a" +checksum = "6b1a55b8533f2dc716602e7c1b2bd555d5ac598ef6e80d28a517e6f31baf042e" dependencies = [ "bincode", "byteorder", @@ -4318,9 +4353,9 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31233a00b12c799c7bd93518394fbb1d168a9a86eca6f3d7e404ca03cdace04" +checksum = "fda213af7ae26ce249120f211060d2a85d87fe367c6490ee19b70845cbd320fc" dependencies = [ "bv", "bytemuck", @@ -4336,9 +4371,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe1de38b51034aa407fdf5579935c8e7a5e43d18d294cc76230080dbcfa2bbee" +checksum = "909f4553d0b31bb5b97533a6b64cc321a4eace9112d6efbabcf4408ea1b3f1db" dependencies = [ "chrono", "clap 2.34.0", @@ -4353,9 +4388,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a53a51ccf2a444403d9d7f15b736be8571b47bb57b0dd66e35d31b16b087448" +checksum = "2242c4a0776cdaec1358d0ffc61b32131985a7b2210c491fa465d28c313eb880" dependencies = [ "dirs-next", "lazy_static", @@ -4369,9 +4404,9 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3ea750256172de8da64ed27412413d9d13fe247a3746d3271254b58e3d77aa" +checksum = "bada4ba96ef2f351363ba64ce4f592bc584ac48bb7d9da4e41303416b0a21026" dependencies = [ "Inflector", "base64 0.21.7", @@ -4396,16 +4431,16 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790ce6ac8ad0f7e3531327a7ea486433ea2d9513bbaa9e51f9ce9c687aa5c687" +checksum = "c5cc431df6cc1dd964134fa4ec7df765d3af3fae9c2148f96a3c4fb500290633" dependencies = [ "async-trait", "bincode", "dashmap", "futures", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "indicatif", "log", "quinn", @@ -4429,9 +4464,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc0d9facac6c11c0fcd565f20ec6855b7728133956ac7e71475badb04e313b3" +checksum = "9eb36ef3c3a1f38515c1ae0d255c4d6e5e635a856ac2aa1cd5f892b3db58e857" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4439,9 +4474,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56db52d5c4faa7dba6dd0d82deb89d1b442524ea241b8d88940efae656236009" +checksum = "e38b040d3a42e8f7d80c4a86bb0d49d7aed663b56b0fe0ae135d2d145fb7ae3a" dependencies = [ "bincode", "chrono", @@ -4453,15 +4488,15 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc24ca8cdf265fe38e4f43ba8d3a97368a8269a59b6e7b9be097b54a19565359" +checksum = "ae02622c63943485f0af3d0896626eaf6478e734f0b6bc61c7cc5320963c6e75" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "log", "rand 0.8.5", "rayon", @@ -4475,9 +4510,9 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10d6e9e0f0afbdbc839c4a10b1c8b34361e4a8bbe608cb2e0c3d036b02a6344" +checksum = "838532d8437d00958621d2589d6033e9c69ea95cd0936efa8964146e49dcff53" dependencies = [ "lazy_static", "log", @@ -4499,9 +4534,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fa9c8e908d743fc4b446c675d15f8290b1a400d84640f7fae6256aeea4815d" +checksum = "4867f66e9527fa44451c861c1dc6d9b2a7c7a668d7c6a297cdefbe39f4395b33" dependencies = [ "block-buffer 0.10.4", "bs58 0.4.0", @@ -4524,21 +4559,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "207d87baccbc41473f151443b8d2b8f8ba85ace1b05bef368a2cbe0858ae6a77" +checksum = "168f24d97347b85f05192df58d6be3e3047a4aadc4001bc1b9e711a5ec878eea" dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] name = "solana-loader-v4-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c8569a2fa9f9a7ec2f3760a0d4764543963a72fbd57dde91a0b2cdd9533354" +checksum = "98c426482234b7c267a5e0dfa8198442e1ffad2ad6c521f6b810949bc2719215" dependencies = [ "log", "solana-measure", @@ -4549,9 +4584,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5540574de96cac634cb9c82ba7635aab00cbc37a277d36fa1d491a43f3d6e5f8" +checksum = "a0511082fc62f2d086520fff5aa1917c389d8c840930c08ad255ae05952c08a2" dependencies = [ "env_logger", "lazy_static", @@ -4560,9 +4595,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9c106b7bb39e23d9fddafababe5b7e489cad207a5bd6e06d46e66f9c88647fe" +checksum = "be55a3df105431d25f86f2a7da0cbbde5f54c1f0782ca59367ea4a8037bc6797" dependencies = [ "log", "solana-sdk", @@ -4570,9 +4605,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4899f40673b3a7fa556839338814a462889a283d45ad7a84922ed0ed84dba72f" +checksum = "ddec097ed7572804389195128dbd57958b427829153c6cd8ec3343c86fe3cd22" dependencies = [ "crossbeam-channel", "gethostname", @@ -4585,9 +4620,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb6c23a2a7af5d49c843b005c02721478d2befb0844e4337239919efa1b8618f" +checksum = "258fa7c29fb7605b8d2ed89aa0d43c640d14f4147ad1f5b3fdad19a1ac145ca5" dependencies = [ "bincode", "clap 3.2.25", @@ -4613,9 +4648,9 @@ checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" [[package]] name = "solana-perf" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9ec5d17735265dadcdf7eae04276370cc8570945cc47a04a7972b0752897546" +checksum = "ca422edcf16a6e64003ca118575ea641f7b750f14a0ad28c71dd84f33dcb912a" dependencies = [ "ahash 0.8.11", "bincode", @@ -4642,9 +4677,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0175aa736ef2bac329de17727b783fbc7c83dee182a0fbb5c8b45316c22cae" +checksum = "2bc5a636dc75e5c25651e34f7a36afc9ae60d38166687c5b0375abb580ac81a2" dependencies = [ "ark-bn254", "ark-ec", @@ -4652,7 +4687,7 @@ 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", @@ -4664,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", @@ -4672,8 +4707,8 @@ dependencies = [ "libsecp256k1", "light-poseidon", "log", - "memoffset 0.9.0", - "num-bigint 0.4.4", + "memoffset 0.9.1", + "num-bigint 0.4.6", "num-derive 0.4.2", "num-traits", "parking_lot", @@ -4697,9 +4732,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "983f4b793c1cb5186d2a2ed1ea460733972d294d972982a1943ab2bf6c6a218a" +checksum = "bf373c3da0387f47fee4c5ed2465a9628b9db026a62211a692a9285aa9251544" dependencies = [ "base64 0.21.7", "bincode", @@ -4725,9 +4760,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df36e5e37b2166723be77d4f6aae79a22251344f6bc7b92b96fd45e230ab943" +checksum = "9194b8744c5b135401ab4a2923a1072d3a67697bd50f7450a4ed5302f36a6999" dependencies = [ "assert_matches", "async-trait", @@ -4755,9 +4790,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8dee0de77fe38ecc41384ba8fe058c04c213d0ae6feaec94e08d4b286f43da" +checksum = "97b9abc76168d19927561db6a3685b98752bd0961b4ce4f8b7f85ee12238c017" dependencies = [ "crossbeam-channel", "futures-util", @@ -4780,9 +4815,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27f714d0c54b430ba97381053f3b2da7b5ada642dbe799dabe8546772573f85" +checksum = "7952c5306a0be5f5276448cd20246b31265bfa884f29a077a24303c6a16aeb34" dependencies = [ "async-mutex", "async-trait", @@ -4807,9 +4842,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40d1d7ad73ff88642e978b35ec404fb932e6499e6c5061cb53e33423bc157ac" +checksum = "a4fa0cc66f8e73d769bca2ede3012ba2ef8ab67963e832808665369f2cf81743" dependencies = [ "lazy_static", "num_cpus", @@ -4817,9 +4852,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be0a98dbe7fbb6ce2b3343f2aceb5fdd8f94ce7672d01201f50bef83b8af009" +checksum = "289803796d4ff7b4699504d3ab9e9d9c5205ea3892b2ebe397b377494dbd75d4" dependencies = [ "console", "dialoguer", @@ -4836,9 +4871,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5240a1e261c4cf8261206b76d9710f1e7b26c7b2af1e4ee7b84592c298ad9f1" +checksum = "6cb55a08018776a62ecff52139fbcdab1a7baa4e8f077202be58156e8dde4d5f" dependencies = [ "async-trait", "base64 0.21.7", @@ -4862,9 +4897,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023317ad467034ac4bd4ea01a95c206018a123af97814c40a5035bf9e0c4f082" +checksum = "72a8403038f4d6ab65bc7e7afb3afe8d9824c592232553c5cef55cf3de36025d" dependencies = [ "base64 0.21.7", "bs58 0.4.0", @@ -4878,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.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed8e4e5066a27c1f9b095cfc4b034860717ba0af079e975848daf58d304b81c2" +checksum = "4caca735caf76d51c074c3bacbfe38094bf7f92cfbe7b5b13f3bc4946e64f889" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4897,9 +4932,9 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d247839cedb3581fc3b21bfff7cca1a817fbcb5b5a1297bfff2d136a038468b6" +checksum = "b699943045665038bfa4e76dd2582b4c390f1aec6ab5edef36da43afe3469f1d" dependencies = [ "aquamarine", "arrayref", @@ -4974,14 +5009,14 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0cf4419ab0807e6d7d27b7e45c0b3996caf5c2f40d6b920ce797593f96041be" +checksum = "df43d3a1e1637397ab43cbc216a5a8f977ec8a3cc3f3ae8c3851c83a3255dbcf" dependencies = [ "assert_matches", "base64 0.21.7", "bincode", - "bitflags 2.4.2", + "bitflags 2.6.0", "borsh 1.5.1", "bs58 0.4.0", "bytemuck", @@ -5029,15 +5064,15 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a19fb7874415de034a3067a71447a376be204be8f0a84a2861a65bbdb2286dd" +checksum = "86c76414183a325038ff020b22c07d1e9d2da0703ddc0244acfed37ee2921d96" dependencies = [ "bs58 0.4.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5048,9 +5083,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc21bd9a0b95931b422d32a90db7068490ff68ecfe388c79aedceb763a48f341" +checksum = "e056d865d22548bb7228121e118aa632486fc1a33a100961e5e98b5663371384" dependencies = [ "crossbeam-channel", "log", @@ -5064,9 +5099,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bde9fe6d14e70e85b81061e222189a368c655f1af956dac8f658748cf7fdab1" +checksum = "c5dd1bc07beb75da5df5e07301d3d0d6104872c9afade22b910af9061fb4bc15" dependencies = [ "bincode", "log", @@ -5079,16 +5114,16 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18342730db0c08836134b226c938e380039feb219e0502a55fd5c1df793a178" +checksum = "fad1bdb955ec6d23a1dbf87e403ff3e610d68616275693125a893d7ed4b2d323" dependencies = [ "async-channel", "bytes", "crossbeam-channel", "futures-util", "histogram", - "indexmap 2.2.3", + "indexmap 2.2.6", "itertools", "libc", "log", @@ -5101,6 +5136,7 @@ dependencies = [ "rand 0.8.5", "rcgen", "rustls", + "smallvec", "solana-metrics", "solana-perf", "solana-sdk", @@ -5111,9 +5147,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71aa5503922fd7116d09367b8acdc6f5375af22db4a01a084427d29655cd230a" +checksum = "78733745268c96d5a29c09cde9f0a6c9d662abba43e661b75dd858da8e3d0b2e" dependencies = [ "bincode", "log", @@ -5125,9 +5161,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a380d99338995b308f4ecb06086a460f9b99a26ed801bb1b2f1a426764c1ed40" +checksum = "bc301310ba0755c449a8800136f67f8ad14419b366404629894cd10021495360" dependencies = [ "bincode", "log", @@ -5140,14 +5176,14 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dd5d6a503da75fad16547c57bd7e919b2aa6ad6d73986cb8a3e76edf97acdc" +checksum = "fb887bd5078ff015e103e9ee54a6713380590efa8ff1804b3a653f07188928c6" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "indicatif", "log", "rayon", @@ -5164,9 +5200,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "892ec130ff5761ef96a271a9367cb1f3cdf64f70ec133331c491253e91d236aa" +checksum = "4a0cdfdf63192fb60de094fae8e81159e4e3e9aac9659fe3f9ef0e707023fb32" dependencies = [ "Inflector", "base64 0.21.7", @@ -5180,18 +5216,18 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account 2.3.0", + "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.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f6a9d9e77cfd897dda8a26c2faaf75850ecc8204b871a62eeb61819aa3d882" +checksum = "3ea0d6d8d66e36371577f51c4d1d6192a66f1fa4efe7161a36d94677640dcadb" dependencies = [ "async-trait", "solana-connection-cache", @@ -5204,9 +5240,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0785c3b70924eda59d5369ada65c1676d7bb15bdfe0d60c56a343b640fd388a" +checksum = "6f4c2f531c22ce806b211118be8928a791425f97de4592371fb57b246ed33e34" dependencies = [ "log", "rustc_version", @@ -5220,9 +5256,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c5d83aa3fe3a2c9a6d274604fc9752fdd747febd8d3e6340f2b2355c5b7edc" +checksum = "28ab95a5d19ff0464def1777adaae5a74e1edc9e6818103064c18fdc2643f6cb" dependencies = [ "crossbeam-channel", "itertools", @@ -5239,9 +5275,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5efdfa03b77da6b38a2039758af252c6a32154a3b564d1dc5de85e36742c462" +checksum = "6d8a6486017e71a3714a8e1a635e17209135cc20535ba9808ccf106d80ff6e8b" dependencies = [ "bincode", "log", @@ -5261,9 +5297,9 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f59fb5bca66781c5ab44019821f33e83d66e1b54e65b736cfe9542e3dd2ab527" +checksum = "f1e3dfb2deb449f7eb1dbd0c7e66dd95ec7b1303a5788673f9fbc9b5a5ea59f2" dependencies = [ "bytemuck", "num-derive 0.4.2", @@ -5275,9 +5311,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b24acce0cfccafd57d558884d46a153400d3125e00ca802c02071a21cafcbb61" +checksum = "513407f88394e437b4ff5aad892bc5bf51a655ae2401e6e63549734d3695c46f" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -5355,23 +5391,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", - "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", + "spl-token-2022", "thiserror", ] @@ -5383,18 +5403,7 @@ checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", "solana-program", - "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", + "spl-discriminator-derive", ] [[package]] @@ -5404,19 +5413,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn 0.1.2", - "syn 2.0.50", -] - -[[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.50", + "spl-discriminator-syn", + "syn 2.0.70", ] [[package]] @@ -5428,20 +5426,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.50", - "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.50", + "syn 2.0.70", "thiserror", ] @@ -5464,20 +5449,7 @@ dependencies = [ "bytemuck", "solana-program", "solana-zk-token-sdk", - "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", + "spl-program-error", ] [[package]] @@ -5489,20 +5461,7 @@ 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.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", + "spl-program-error-derive", "thiserror", ] @@ -5515,33 +5474,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.50", -] - -[[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.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 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-type-length-value 0.3.0", + "syn 2.0.70", ] [[package]] @@ -5552,24 +5485,10 @@ 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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" -dependencies = [ - "bytemuck", - "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", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -5587,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 0.1.0", - "spl-token", - "spl-token-metadata-interface 0.2.0", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value 0.3.0", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5624,36 +5521,12 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod 0.1.0", + "spl-pod", "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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" -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.2", - "spl-token", - "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", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", "thiserror", ] @@ -5665,22 +5538,9 @@ 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.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", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -5691,40 +5551,10 @@ 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.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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -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.4.0", - "spl-type-length-value 0.3.0", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -5736,27 +5566,11 @@ 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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "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", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", ] [[package]] @@ -5767,22 +5581,9 @@ 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.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", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -5803,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" @@ -5850,9 +5657,9 @@ 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", @@ -5868,7 +5675,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5912,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", @@ -5958,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", @@ -6012,7 +5819,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -6023,7 +5830,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "test-case-core", ] @@ -6044,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]] @@ -6074,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", @@ -6095,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", @@ -6124,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", ] @@ -6139,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", @@ -6158,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]] @@ -6195,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", @@ -6236,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]] @@ -6260,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" @@ -6270,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", ] @@ -6281,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", ] @@ -6312,7 +6118,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -6367,7 +6173,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6397,7 +6202,7 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account 3.0.2", + "spl-associated-token-account", "spl-token", "syn 1.0.109", "thiserror", @@ -6545,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" @@ -6576,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" @@ -6604,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", @@ -6651,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", @@ -6682,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", @@ -6692,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", @@ -6719,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", @@ -6729,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", @@ -6789,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]] @@ -6808,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]] @@ -6826,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]] @@ -6846,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]] @@ -6867,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" @@ -6879,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" @@ -6891,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" @@ -6903,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" @@ -6915,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" @@ -6927,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" @@ -6939,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" @@ -7008,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]] @@ -7043,7 +6855,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -7067,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 43dae98c..72e56de1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,6 @@ resolver = "1" # ANCHOR anchor-client = ">=0.29.0" anchor-syn = ">=0.29.0" -anchor-spl = ">=0.29.0" anchor-lang = ">=0.29.0" @@ -21,7 +20,5 @@ 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 = "3.0.2", features = [ - "no-entrypoint", -] } -spl-token = { version = "4.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "2", features = ["no-entrypoint"] } +spl-token = { version = "4", features = ["no-entrypoint"] } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 07660873..648d1cdd 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -26,7 +26,6 @@ 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 = { workspace = true } anchor-lang = { workspace = true, features = ["init-if-needed"] } anchor-syn = { workspace = true } anchor-client = { workspace = true, features = ["async"] } From c2a84acd830d73a5234f8b49521a1732462e71a9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 10 Jul 2024 12:13:06 +0200 Subject: [PATCH 27/56] =?UTF-8?q?=F0=9F=92=9A=20Update=20pipelines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/setup-trident/action.yml | 17 ++++++++++++++ .github/workflows/run_fuzz_example.yml | 28 +++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 .github/actions/setup-trident/action.yml 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/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index 907f6dba..2476fd28 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -13,29 +13,45 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 + - name: Set Anchor Version run: echo "ANCHOR_VERSION=0.29.0" >> $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 - - uses: Swatinem/rust-cache@v2 - name: Cache Rust and it's packages + - name: Test Fuzz working-directory: examples/fuzz-tests/unchecked-arithmetic-0 - run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 + 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 - - uses: Swatinem/rust-cache@v2 - name: Cache Rust and it's packages + - name: Test Fuzz working-directory: examples/fuzz-tests/arbitrary-limit-inputs-5 - run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 + run: trident fuzz run fuzz_0 From d62652aa7da52fe4c69e910438f548f356d67e49 Mon Sep 17 00:00:00 2001 From: cryptopapi997 <38372048+cryptopapi997@users.noreply.github.com> Date: Wed, 29 May 2024 13:48:59 +0200 Subject: [PATCH 28/56] feat/add more specific err message for invalid struct (#164) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md updated features * 📝 update urls in readme * 📌 bump crate versions * Update README.md added break * 🚑️ update docs before release * 📝 fix discord link * 📝 (add mike): Add mike * add more specific err message * add missing name on instruction struct too * Update index.md * Update index.md * rm main.html --------- Co-authored-by: Adam Hrazdira <34861877+Ikrk@users.noreply.github.com> Co-authored-by: Emre Ekinci <83828886+ekincixyz@users.noreply.github.com> Co-authored-by: lukacan --- crates/client/src/idl.rs | 47 +++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 20 deletions(-) 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; From 0df48ed4266b67653232f0f9e52917eeb752d32e Mon Sep 17 00:00:00 2001 From: andrejlukacovic <37964423+lukacan@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:57:00 +0200 Subject: [PATCH 29/56] =?UTF-8?q?=E2=9C=A8=20feat/added=20optional=20fuzzi?= =?UTF-8?q?ng=20statistics=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Optionaly show stats during fuzzing session * 🐛 (store failed txs): Store failex txs * 🩹 Simplified stats logging * 📝 Added fuzzing stats to docs * ✨ Added failed invariants check stats --------- Co-authored-by: Ikrk --- CHANGELOG.md | 1 + Cargo.lock | 55 ++++- crates/client/Cargo.toml | 1 + .../derive/fuzz_test_executor/src/lib.rs | 52 +++-- crates/client/src/commander.rs | 221 +++++++++++++----- crates/client/src/config.rs | 143 +++++++++++- crates/client/src/fuzzer/fuzzing_stats.rs | 145 ++++++++++++ crates/client/src/fuzzer/mod.rs | 1 + crates/client/src/lib.rs | 1 + crates/client/src/templates/Trident.toml.tmpl | 3 + crates/client/src/test_generator.rs | 2 +- .../docs/fuzzing/fuzzing-run-debug.md | 37 +-- .../arbitrary-custom-types-4/Cargo.lock | 67 +++++- .../arbitrary-custom-types-4/Trident.toml | 3 + .../arbitrary-limit-inputs-5/Trident.toml | 3 + examples/fuzz-tests/hello_world/Trident.toml | 3 + .../Trident.toml | 3 + .../incorrect-ix-sequence-1/Trident.toml | 3 + .../unauthorized-access-2/Trident.toml | 3 + .../unchecked-arithmetic-0/Trident.toml | 3 + .../integration-tests/escrow/Trident.toml | 3 + .../integration-tests/turnstile/Trident.toml | 3 + 22 files changed, 660 insertions(+), 96 deletions(-) create mode 100644 crates/client/src/fuzzer/fuzzing_stats.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index c7c0f080..c84d9f5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) ## [0.6.0] - 2024-05-20 ### Added diff --git a/Cargo.lock b/Cargo.lock index ea513a80..fc817579 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1140,7 +1140,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", @@ -1273,6 +1273,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" @@ -1644,6 +1665,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.33" @@ -3121,6 +3148,20 @@ dependencies = [ "syn 1.0.109", ] +[[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" @@ -5609,6 +5650,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" @@ -6010,6 +6062,7 @@ dependencies = [ "macrotest", "pathdiff", "pretty_assertions", + "prettytable", "proc-macro2", "quinn-proto", "quote", diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 6ae6cea2..4440c68f 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -80,3 +80,4 @@ solana-bpf-loader-program = "1.16" solana-program = "1.16" solana-sdk-macro = "1.16" solana-system-program = "1.16" +prettytable = "0.10.0" diff --git a/crates/client/derive/fuzz_test_executor/src/lib.rs b/crates/client/derive/fuzz_test_executor/src/lib.rs index 22298327..6ca24177 100644 --- a/crates/client/derive/fuzz_test_executor/src/lib.rs +++ b/crates/client/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() + .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/commander.rs b/crates/client/src/commander.rs index a2346ffd..b5a3c923 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -19,6 +19,8 @@ use tokio::{ }; use crate::constants::*; +use crate::fuzzing_stats::FuzzingStatistics; +use tokio::io::AsyncBufReadExt; #[derive(Error, Debug)] pub enum Error { @@ -153,7 +155,11 @@ 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 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,34 @@ 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("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("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) { @@ -236,27 +240,54 @@ impl Commander { 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("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("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 { @@ -270,6 +301,87 @@ 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() { + println!("Honggfuzz exited with an error!"); + } + }, + 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] @@ -286,14 +398,9 @@ 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") 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/fuzzing_stats.rs b/crates/client/src/fuzzer/fuzzing_stats.rs new file mode 100644 index 00000000..f49403de --- /dev/null +++ b/crates/client/src/fuzzer/fuzzing_stats.rs @@ -0,0 +1,145 @@ +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/client/src/fuzzer/mod.rs b/crates/client/src/fuzzer/mod.rs index fc1a9b39..b478cf71 100644 --- a/crates/client/src/fuzzer/mod.rs +++ b/crates/client/src/fuzzer/mod.rs @@ -1,6 +1,7 @@ pub mod accounts_storage; pub mod data_builder; pub mod fuzzer_generator; +pub mod fuzzing_stats; #[cfg(feature = "fuzzing")] pub mod program_test_client_blocking; pub mod snapshot; diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index cb07f622..c8072b96 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -42,6 +42,7 @@ pub mod fuzzing { 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::fuzzing_stats::FuzzingStatistics; pub use super::fuzzer::program_test_client_blocking::ProgramEntry; pub use super::fuzzer::program_test_client_blocking::ProgramTestClientBlocking; 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/test_generator.rs b/crates/client/src/test_generator.rs index 47b022e7..b4d7aece 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -609,7 +609,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/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/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index 970c4fc5..42ab1daa 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -1096,7 +1096,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", @@ -1229,6 +1229,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 +1617,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" @@ -2278,6 +2305,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.6", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -3083,6 +3121,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" @@ -5607,6 +5659,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" @@ -5999,6 +6062,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", @@ -6014,6 +6078,7 @@ dependencies = [ "solana-bpf-loader-program", "solana-cli-output", "solana-program", + "solana-logger", "solana-program-runtime", "solana-program-test", "solana-sdk", 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-limit-inputs-5/Trident.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/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.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/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-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/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/unchecked-arithmetic-0/Trident.toml b/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml +++ b/examples/fuzz-tests/unchecked-arithmetic-0/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.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/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 From 8c41170b05a32d9b8031a8d9961cc3b069a01f17 Mon Sep 17 00:00:00 2001 From: Ikrk Date: Wed, 29 May 2024 15:35:13 +0200 Subject: [PATCH 30/56] =?UTF-8?q?=F0=9F=90=9B=20Snapshot's=20zeroed=20acco?= =?UTF-8?q?unt=20as=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/client/src/fuzzer/snapshot_generator.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c84d9f5f..969566f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) ## [0.6.0] - 2024-05-20 diff --git a/crates/client/src/fuzzer/snapshot_generator.rs b/crates/client/src/fuzzer/snapshot_generator.rs index 252649b5..78c2ba52 100644 --- a/crates/client/src/fuzzer/snapshot_generator.rs +++ b/crates/client/src/fuzzer/snapshot_generator.rs @@ -232,7 +232,7 @@ fn is_optional(parsed_field: &AccountField) -> 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. From ff6f4dd5de440bdec1f2a25ec25bfc5d876004e9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 26 Jun 2024 10:13:34 +0200 Subject: [PATCH 31/56] =?UTF-8?q?=F0=9F=94=A5=20remove=20explorer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/lint.yml | 22 - .vscode/settings.json | 1 - Cargo.lock | 72 -- Cargo.toml | 14 +- crates/cli/Cargo.toml | 1 - crates/cli/src/command.rs | 3 - crates/cli/src/command/explorer.rs | 204 ---- crates/cli/src/command/explorer/account.rs | 37 - crates/cli/src/command/explorer/program.rs | 25 - .../cli/src/command/explorer/transaction.rs | 43 - crates/cli/src/lib.rs | 7 - crates/explorer/Cargo.toml | 33 - crates/explorer/src/account.rs | 216 ---- crates/explorer/src/config.rs | 64 -- crates/explorer/src/display.rs | 23 - crates/explorer/src/error.rs | 25 - crates/explorer/src/lib.rs | 11 - crates/explorer/src/output.rs | 365 ------- crates/explorer/src/parse.rs | 145 --- .../src/parse/associated_token_account.rs | 96 -- crates/explorer/src/parse/bpf_loader.rs | 98 -- .../src/parse/bpf_upgradeable_loader.rs | 420 -------- crates/explorer/src/parse/memo.rs | 42 - crates/explorer/src/parse/stake.rs | 934 ------------------ crates/explorer/src/parse/system.rs | 540 ---------- crates/explorer/src/parse/token.rs | 651 ------------ crates/explorer/src/parse/vote.rs | 470 --------- crates/explorer/src/program.rs | 257 ----- crates/explorer/src/transaction.rs | 788 --------------- 29 files changed, 1 insertion(+), 5606 deletions(-) delete mode 100644 crates/cli/src/command/explorer.rs delete mode 100644 crates/cli/src/command/explorer/account.rs delete mode 100644 crates/cli/src/command/explorer/program.rs delete mode 100644 crates/cli/src/command/explorer/transaction.rs delete mode 100644 crates/explorer/Cargo.toml delete mode 100644 crates/explorer/src/account.rs delete mode 100644 crates/explorer/src/config.rs delete mode 100644 crates/explorer/src/display.rs delete mode 100644 crates/explorer/src/error.rs delete mode 100644 crates/explorer/src/lib.rs delete mode 100644 crates/explorer/src/output.rs delete mode 100644 crates/explorer/src/parse.rs delete mode 100644 crates/explorer/src/parse/associated_token_account.rs delete mode 100644 crates/explorer/src/parse/bpf_loader.rs delete mode 100644 crates/explorer/src/parse/bpf_upgradeable_loader.rs delete mode 100644 crates/explorer/src/parse/memo.rs delete mode 100644 crates/explorer/src/parse/stake.rs delete mode 100644 crates/explorer/src/parse/system.rs delete mode 100644 crates/explorer/src/parse/token.rs delete mode 100644 crates/explorer/src/parse/vote.rs delete mode 100644 crates/explorer/src/program.rs delete mode 100644 crates/explorer/src/transaction.rs 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/.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/Cargo.lock b/Cargo.lock index fc817579..a774bc81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2995,48 +2995,6 @@ 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" @@ -6035,7 +5993,6 @@ dependencies = [ "solana-sdk", "tokio", "trident-client", - "trident-explorer", ] [[package]] @@ -6123,35 +6080,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "trident-explorer" -version = "0.3.2" -dependencies = [ - "base64 0.13.1", - "bincode", - "bs58 0.5.0", - "chrono", - "console", - "num-derive 0.4.2", - "num-traits", - "phf", - "pretty-hex", - "serde", - "serde_json", - "solana-account-decoder", - "solana-cli-config", - "solana-client", - "solana-logger", - "solana-program", - "solana-sdk", - "solana-transaction-status", - "solana-vote-program", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "thiserror", -] - [[package]] name = "trident-test" version = "0.3.2" diff --git a/Cargo.toml b/Cargo.toml index b13b50cb..7c80c445 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/cli", "crates/client", "crates/explorer", "crates/test"] +members = ["crates/cli", "crates/client", "crates/test"] exclude = ["examples/"] resolver = "1" @@ -7,19 +7,13 @@ 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" @@ -43,12 +37,6 @@ 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"] } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 353c32e3..689bd712 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -14,4 +14,3 @@ anyhow = { workspace = true } fehler = { workspace = true } solana-sdk = { workspace = true } trident-client = { workspace = true } -trident-explorer = { workspace = true } diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index f21c1392..44694d4e 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -13,9 +13,6 @@ pub use test::test; mod localnet; pub use localnet::localnet; -mod explorer; -pub use explorer::{explorer, ExplorerCommand}; - mod init; pub use init::{init, TestsType}; 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/lib.rs b/crates/cli/src/lib.rs index 5aef3fac..f1173b00 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -7,7 +7,6 @@ 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; @@ -48,11 +47,6 @@ enum Command { }, /// 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. @@ -73,7 +67,6 @@ pub async fn start() { 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::Clean => command::clean().await?, } 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(()) - } -} From 05abcc169d80105c5b3cc311eb268fe57d8f63ae Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 26 Jun 2024 10:38:33 +0200 Subject: [PATCH 32/56] =?UTF-8?q?=F0=9F=94=A5=20remove=20tests=20for=20der?= =?UTF-8?q?ive=20macros=20and=20update=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../fuzzer_macros/fuzz_display_ix.expanded.rs | 62 ----- .../fuzzer_macros/fuzz_display_ix.rs | 41 --- .../fuzz_fuzz_deserialize.expanded.rs | 58 ----- .../fuzzer_macros/fuzz_fuzz_deserialize.rs | 41 --- .../fuzz_fuzz_test_executor.expanded.rs | 243 ------------------ .../fuzzer_macros/fuzz_fuzz_test_executor.rs | 41 --- .../fuzz_fuzz_trident.expanded.rs | 25 -- .../fuzzer_macros/fuzz_fuzz_trident.rs | 12 - crates/client/tests/test_fuzz.rs | 39 --- 10 files changed, 1 insertion(+), 562 deletions(-) delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.expanded.rs delete mode 100644 crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 969566f1..2adc50cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) 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..fc278399 100644 --- a/crates/client/tests/test_fuzz.rs +++ b/crates/client/tests/test_fuzz.rs @@ -59,42 +59,3 @@ async fn test_snapshots_and_instructions() { 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"); -} From 91d9036a6f44725480606c460be29dc9cf2e930f Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 23 May 2024 14:55:00 +0200 Subject: [PATCH 33/56] =?UTF-8?q?=F0=9F=92=9A=20test=20fuzzing=20pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/setup-honggfuzz/action.yml | 23 +++++++++++++++++ .github/workflows/run_fuzz_example.yml | 25 +++++++++++++++++++ CHANGELOG.md | 3 ++- crates/client/src/commander.rs | 7 +++--- .../unchecked-arithmetic-0/Trident.toml | 6 ++--- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 .github/actions/setup-honggfuzz/action.yml create mode 100644 .github/workflows/run_fuzz_example.yml 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/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml new file mode 100644 index 00000000..e8d07b8b --- /dev/null +++ b/.github/workflows/run_fuzz_example.yml @@ -0,0 +1,25 @@ +name: Test Fuzz Tests + +on: + workflow_dispatch: + pull_request: + +env: + SOLANA_CLI_VERSION: 1.18.12 + ANCHOR_VERSION: 0.29.0 + HONGGFUZZ_VERSION: 0.5.55 + +jobs: + run_fuzz_example: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/setup-rust/ + - uses: ./.github/actions/setup-solana/ + - uses: ./.github/actions/setup-honggfuzz/ + id: rust-setup + - uses: Swatinem/rust-cache@v2 + name: Cache Rust and it's packages + - name: Test Fuzz + working-directory: examples/fuzz-tests/unchecked-arithmetic-0 + run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2adc50cf..d525ceb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased -- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) +- fix/in case of fuzzing failure throw error instead of only printing message([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) +- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index b5a3c923..dd8d2418 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -223,7 +223,7 @@ impl Commander { "The crash directory {} contains new fuzz test crashes. Exiting!", crash_dir.to_string_lossy() ); - process::exit(1); + process::exit(99); } } } @@ -292,7 +292,7 @@ impl Commander { res = child.wait() => match res { Ok(status) => if !status.success() { - println!("Honggfuzz exited with an error!"); + throw!(Error::FuzzingFailed); }, Err(_) => throw!(Error::FuzzingFailed), }, @@ -358,7 +358,7 @@ impl Commander { match res { Ok(status) => { if !status.success() { - println!("Honggfuzz exited with an error!"); + throw!(Error::FuzzingFailed); } }, Err(_) => throw!(Error::FuzzingFailed), @@ -367,7 +367,6 @@ impl Commander { _ = 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 diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml b/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml index a398402c..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"]). @@ -38,4 +38,4 @@ save_all = 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 +fuzzing_with_stats = true From 8a51e3352e532c5975011b55d5a66ccaec03d752 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 26 Jun 2024 22:30:58 +0200 Subject: [PATCH 34/56] =?UTF-8?q?=F0=9F=93=8C=20unify=20exports=20from=20t?= =?UTF-8?q?rident?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- crates/cli/src/command/build.rs | 2 +- crates/cli/src/command/clean.rs | 2 +- crates/cli/src/command/fuzz.rs | 2 +- crates/cli/src/command/init.rs | 2 +- crates/cli/src/command/keypair.rs | 2 +- crates/cli/src/command/localnet.rs | 2 +- crates/cli/src/command/test.rs | 2 +- crates/client/src/client.rs | 4 +- crates/client/src/commander.rs | 8 +- crates/client/src/fuzzer/accounts_storage.rs | 3 +- crates/client/src/fuzzer/data_builder.rs | 4 +- crates/client/src/fuzzer/error.rs | 2 + crates/client/src/fuzzer/fuzzing_stats.rs | 2 + .../fuzzer/program_test_client_blocking.rs | 11 +- crates/client/src/fuzzer/snapshot.rs | 4 +- .../client/src/fuzzer/snapshot_generator.rs | 4 +- crates/client/src/lib.rs | 172 ++++++++++-------- crates/client/src/temp_clone.rs | 3 +- .../src/templates/trident-tests/test.rs | 3 +- .../src/templates/trident-tests/test_fuzz.rs | 2 +- crates/client/src/test_generator.rs | 7 +- crates/client/src/tester.rs | 2 +- .../expected_accounts_snapshots.rs | 4 +- crates/client/tests/test_fuzz.rs | 17 +- crates/client/tests/test_program_client.rs | 8 +- crates/test/src/lib.rs | 14 +- crates/test/tests/expand/basic.expanded.rs | 14 +- .../test/tests/expand/with_root.expanded.rs | 14 +- .../arbitrary-custom-types-4/Cargo.lock | 3 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../arbitrary-limit-inputs-5/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- examples/fuzz-tests/hello_world/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 5 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../incorrect-integer-arithmetic-3/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../incorrect-ix-sequence-1/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../unauthorized-access-2/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../unchecked-arithmetic-0/Cargo.lock | 66 ++++++- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- .../escrow/.program_client/src/lib.rs | 3 +- examples/integration-tests/escrow/Cargo.lock | 66 ++++++- .../trident-tests/poc_tests/tests/test.rs | 8 +- .../turnstile/.program_client/src/lib.rs | 3 +- .../integration-tests/turnstile/Cargo.lock | 66 ++++++- .../trident-tests/poc_tests/tests/test.rs | 7 +- 56 files changed, 745 insertions(+), 183 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d525ceb5..8b8e42dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased -- fix/in case of fuzzing failure throw error instead of only printing message([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) +- feat/unify dependencies provided by the Trident ([#172](https://github.com/Ackee-Blockchain/trident/pull/172)) +- fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) - del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) - feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) diff --git a/crates/cli/src/command/build.rs b/crates/cli/src/command/build.rs index c71d4e43..11a3ab4c 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; 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/fuzz.rs b/crates/cli/src/command/fuzz.rs index 87b74507..e398882f 100644 --- a/crates/cli/src/command/fuzz.rs +++ b/crates/cli/src/command/fuzz.rs @@ -2,7 +2,7 @@ use anyhow::{bail, Error}; use clap::Subcommand; use fehler::throws; -use trident_client::{Commander, TestGenerator}; +use trident_client::___private::{Commander, TestGenerator}; use crate::_discover; diff --git a/crates/cli/src/command/init.rs b/crates/cli/src/command/init.rs index bf4c4c88..182f081d 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; 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 index 9cb4973d..cae67c5a 100644 --- a/crates/cli/src/command/localnet.rs +++ b/crates/cli/src/command/localnet.rs @@ -1,7 +1,7 @@ use anyhow::Error; use fehler::throws; use tokio::signal; -use trident_client::*; +use trident_client::___private::Commander; #[throws] pub async fn localnet() { 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/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 dd8d2418..70b12c62 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,7 +17,7 @@ use tokio::{ }; use crate::constants::*; -use crate::fuzzing_stats::FuzzingStatistics; +use crate::fuzzer::fuzzing_stats::FuzzingStatistics; use tokio::io::AsyncBufReadExt; #[derive(Error, Debug)] diff --git a/crates/client/src/fuzzer/accounts_storage.rs b/crates/client/src/fuzzer/accounts_storage.rs index 01e2ef11..226623dc 100644 --- a/crates/client/src/fuzzer/accounts_storage.rs +++ b/crates/client/src/fuzzer/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::fuzzer::{data_builder::FuzzClient, AccountId}; pub struct PdaStore { pub pubkey: Pubkey, diff --git a/crates/client/src/fuzzer/data_builder.rs b/crates/client/src/fuzzer/data_builder.rs index 174611dc..b9d1238a 100644 --- a/crates/client/src/fuzzer/data_builder.rs +++ b/crates/client/src/fuzzer/data_builder.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + 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; @@ -13,7 +15,7 @@ use std::collections::HashMap; use std::error::Error; use std::fmt::Display; -use crate::error::*; +use crate::fuzzer::error::*; pub struct FuzzData { pub pre_ixs: Vec, diff --git a/crates/client/src/fuzzer/error.rs b/crates/client/src/fuzzer/error.rs index cc488669..4058519c 100644 --- a/crates/client/src/fuzzer/error.rs +++ b/crates/client/src/fuzzer/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/client/src/fuzzer/fuzzing_stats.rs b/crates/client/src/fuzzer/fuzzing_stats.rs index f49403de..d1ac5c62 100644 --- a/crates/client/src/fuzzer/fuzzing_stats.rs +++ b/crates/client/src/fuzzer/fuzzing_stats.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + use prettytable::{row, Table}; use std::collections::HashMap; diff --git a/crates/client/src/fuzzer/program_test_client_blocking.rs b/crates/client/src/fuzzer/program_test_client_blocking.rs index f31858a2..3ba74105 100644 --- a/crates/client/src/fuzzer/program_test_client_blocking.rs +++ b/crates/client/src/fuzzer/program_test_client_blocking.rs @@ -1,9 +1,10 @@ -use crate::fuzzing::ProgramTest; -use crate::fuzzing::{ProgramTestContext, SYSTEM_PROGRAM_ID}; -use crate::solana_sdk::account::Account; 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 +13,8 @@ use solana_sdk::{ use spl_token::state::Mint; use tokio::runtime::Builder; -use crate::data_builder::FuzzClient; -use crate::error::*; +use crate::fuzzer::data_builder::FuzzClient; +use crate::fuzzer::error::*; pub type ProgramEntry = for<'info> fn( program_id: &Pubkey, diff --git a/crates/client/src/fuzzer/snapshot.rs b/crates/client/src/fuzzer/snapshot.rs index 69cdfe73..46d6c0a6 100644 --- a/crates/client/src/fuzzer/snapshot.rs +++ b/crates/client/src/fuzzer/snapshot.rs @@ -4,8 +4,8 @@ use anchor_client::anchor_lang::solana_program::account_info::Account as Acc; use anchor_client::anchor_lang::solana_program::account_info::AccountInfo; use solana_sdk::{account::Account, instruction::AccountMeta}; -use crate::data_builder::{FuzzClient, FuzzDeserialize}; -use crate::error::*; +use crate::fuzzer::data_builder::{FuzzClient, FuzzDeserialize}; +use crate::fuzzer::error::*; pub struct Snapshot<'info, T> { before: Vec>, before_acc_inf: Vec>>, diff --git a/crates/client/src/fuzzer/snapshot_generator.rs b/crates/client/src/fuzzer/snapshot_generator.rs index 78c2ba52..21e9a44a 100644 --- a/crates/client/src/fuzzer/snapshot_generator.rs +++ b/crates/client/src/fuzzer/snapshot_generator.rs @@ -66,8 +66,8 @@ pub fn generate_snapshots_code(programs_data: &[ProgramData]) -> Result { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, diff --git a/crates/client/tests/test_fuzz.rs b/crates/client/tests/test_fuzz.rs index fc278399..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,14 +49,15 @@ 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); diff --git a/crates/client/tests/test_program_client.rs b/crates/client/tests/test_program_client.rs index 3b082355..c9d8cc71 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,9 @@ 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::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/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/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index 42ab1daa..ed4099fa 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -2311,7 +2311,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", ] @@ -6078,7 +6078,6 @@ dependencies = [ "solana-bpf-loader-program", "solana-cli-output", "solana-program", - "solana-logger", "solana-program-runtime", "solana-program-test", "solana-sdk", 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..509c99d4 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,6 @@ +use anchor_lang::prelude::*; use arbitrary_custom_types_4::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 InitializeSnapshot<'info> { pub counter: Option>, pub user: Signer<'info>, 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-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 3eec7e31..905b4c1f 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -1097,7 +1097,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", @@ -1230,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" @@ -1597,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" @@ -2280,6 +2307,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" @@ -3085,6 +3123,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" @@ -5609,6 +5661,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" @@ -6001,6 +6064,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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 index 1aa9daaf..129df822 100644 --- 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 @@ -1,7 +1,7 @@ +use anchor_lang::prelude::*; 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; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, 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..e233562a 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,8 @@ pub mod arbitrary_limit_inputs_5_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/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 6deb6646..0a36493a 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2278,6 +2305,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" @@ -3083,6 +3121,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" @@ -5607,6 +5659,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" @@ -5999,6 +6062,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..86e3ecb2 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,7 @@ +use anchor_lang::prelude::*; use hello_world::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 InitializeSnapshot<'info> { pub author: Signer<'info>, pub hello_world_account: Option>, 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/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 187583d8..babc39bb 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2280,6 +2307,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" @@ -3085,6 +3123,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" @@ -5609,6 +5661,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" @@ -6001,6 +6064,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..c95cb226 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,7 @@ 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}; +use anchor_lang::prelude::*; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, 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-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index bfd6cc05..b8f170c6 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2278,6 +2305,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" @@ -3083,6 +3121,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" @@ -5607,6 +5659,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" @@ -5999,6 +6062,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..cf102ee4 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,6 @@ +use anchor_lang::prelude::*; use incorrect_ix_sequence_1::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 InitializeSnapshot<'info> { pub author: Signer<'info>, pub state: Option>, 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/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index be9f2937..28bb7ba5 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2271,6 +2298,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" @@ -3076,6 +3114,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" @@ -5600,6 +5652,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" @@ -5992,6 +6055,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..89c6e088 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,6 @@ -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; use unauthorized_access_2::ID as PROGRAM_ID; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; +use anchor_lang::prelude::*; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub escrow: Option>, 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/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index 45fac246..15e2a586 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -1089,7 +1089,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", @@ -1222,6 +1222,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 +1610,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" @@ -2271,6 +2298,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" @@ -3076,6 +3114,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" @@ -5600,6 +5652,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" @@ -5992,6 +6055,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quinn-proto", "quote", 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..ea5d9721 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,5 +1,5 @@ -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; use unchecked_arithmetic_0::ID as PROGRAM_ID; pub struct InitializeSnapshot<'info> { pub counter: Option>, 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/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-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-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?; From 231ff2ba51c9b747da9c707ba9d18c501398e4e3 Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 27 Jun 2024 17:07:34 +0200 Subject: [PATCH 35/56] =?UTF-8?q?=F0=9F=93=8C=20unify=20dependencies,=20an?= =?UTF-8?q?d=20remove=20unused?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 28 +++++--------- Cargo.toml | 52 ++++++++----------------- crates/cli/Cargo.toml | 17 ++++++--- crates/client/Cargo.toml | 82 ++++++++++++++++++++-------------------- crates/test/Cargo.toml | 8 ++-- 5 files changed, 82 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a774bc81..e04b1647 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -339,24 +339,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", ] @@ -1108,9 +1108,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" @@ -6014,16 +6014,13 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", - "macrotest", "pathdiff", "pretty_assertions", "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6032,14 +6029,10 @@ dependencies = [ "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", @@ -6086,7 +6079,6 @@ version = "0.3.2" dependencies = [ "darling 0.13.4", "macrotest", - "proc-macro2", "quote", "syn 1.0.109", ] @@ -6229,9 +6221,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" diff --git a/Cargo.toml b/Cargo.toml index 7c80c445..9d8147d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,39 +5,19 @@ resolver = "1" [workspace.dependencies] -trident-test = { path = "./crates/test", version = "0.3.2" } -trident-client = { path = "./crates/client", version = "0.6.0" } -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-program = "1.16" -spl-token = "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" -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 = { version = ">=0.29.0" } +anchor-syn = { version = ">=0.29.0" } +anchor-spl = { version = ">=0.29.0" } +anchor-lang = { version = ">=0.29.0" } +# SOLANA +solana-sdk = "1.16" +solana-cli-output = "1.16" +solana-transaction-status = "1.16" +solana-account-decoder = "1.16" +solana-program = "1.16" +solana-banks-client = "1.16" +solana-program-runtime = "1.16" +solana-program-test = "1.16" +spl-token = "4.0.0" +spl-associated-token-account = "2.0.0" diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 689bd712..38a3435b 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -8,9 +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 +trident-client = { path = "../client", version = "0.6.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/client/Cargo.toml b/crates/client/Cargo.toml index 4440c68f..022ab825 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -20,64 +20,64 @@ anyhow = { version = "1.0.45", features = ["std"], default-features = false } [dev-dependencies] pretty_assertions = "1.1.0" -macrotest = "1.0.9" [dependencies] +# TRIDENT 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-test = { path = "../test", version = "0.3.2" } + + +# 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-spl = { workspace = true, features = ["idl-build"] } +anchor-lang = { workspace = true, features = ["idl-build", "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 } +solana-banks-client = { workspace = true } +solana-program-runtime = { workspace = true, optional = true } +solana-program-test = { workspace = true, optional = true } + + +# HONGGFUZZ honggfuzz = { version = "0.5.55", optional = true } +# ARBITRARY arbitrary = { version = "1.3.0", features = ["derive"] } -solana-program-test = { version = "1.16", optional = 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", optional = true } -solana-program-runtime = { version = "1.16", optional = true } -shellexpand = { workspace = true } 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" prettytable = "0.10.0" diff --git a/crates/test/Cargo.toml b/crates/test/Cargo.toml index 2136b2d4..d1593e22 100644 --- a/crates/test/Cargo.toml +++ b/crates/test/Cargo.toml @@ -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" From 3537f8ab1e6824e984187cb9051b4a281885ca5d Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 28 Jun 2024 09:08:31 +0200 Subject: [PATCH 36/56] =?UTF-8?q?=F0=9F=8E=A8=20move=20fuzz=20to=20separat?= =?UTF-8?q?e=20crate=20and=20update=20examples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Cargo.lock | 53 +++++++++++++++---- Cargo.toml | 2 +- crates/client/Cargo.toml | 18 ++----- crates/client/src/commander.rs | 2 +- crates/client/src/lib.rs | 33 ++++++------ .../fuzzer_generator.rs | 0 .../client/src/source_code_generators/mod.rs | 3 ++ .../program_client_generator.rs | 0 .../snapshot_generator.rs | 0 crates/client/src/test_generator.rs | 13 ++--- crates/client/tests/test_program_client.rs | 5 +- crates/fuzz/Cargo.toml | 39 ++++++++++++++ .../derive/display_ix/Cargo.toml | 0 .../derive/display_ix/src/lib.rs | 0 .../derive/fuzz_deserialize/Cargo.toml | 0 .../derive/fuzz_deserialize/src/lib.rs | 0 .../derive/fuzz_test_executor/Cargo.toml | 0 .../derive/fuzz_test_executor/src/lib.rs | 0 .../fuzzer => fuzz/src}/accounts_storage.rs | 2 +- .../src/fuzzer => fuzz/src}/data_builder.rs | 6 +-- .../{client/src/fuzzer => fuzz/src}/error.rs | 0 .../src/fuzzer => fuzz/src}/fuzzing_stats.rs | 0 .../src/fuzzer/mod.rs => fuzz/src/lib.rs} | 8 +-- .../src}/program_test_client_blocking.rs | 4 +- .../src/fuzzer => fuzz/src}/snapshot.rs | 8 +-- .../arbitrary-custom-types-4/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../arbitrary-limit-inputs-5/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- examples/fuzz-tests/hello_world/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../incorrect-integer-arithmetic-3/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../incorrect-ix-sequence-1/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../unauthorized-access-2/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- .../unchecked-arithmetic-0/Cargo.lock | 35 ++++++++---- .../fuzz_tests/fuzz_0/test_fuzz.rs | 2 +- 40 files changed, 312 insertions(+), 144 deletions(-) rename crates/client/src/{fuzzer => source_code_generators}/fuzzer_generator.rs (100%) create mode 100644 crates/client/src/source_code_generators/mod.rs rename crates/client/src/{ => source_code_generators}/program_client_generator.rs (100%) rename crates/client/src/{fuzzer => source_code_generators}/snapshot_generator.rs (100%) create mode 100644 crates/fuzz/Cargo.toml rename crates/{client => fuzz}/derive/display_ix/Cargo.toml (100%) rename crates/{client => fuzz}/derive/display_ix/src/lib.rs (100%) rename crates/{client => fuzz}/derive/fuzz_deserialize/Cargo.toml (100%) rename crates/{client => fuzz}/derive/fuzz_deserialize/src/lib.rs (100%) rename crates/{client => fuzz}/derive/fuzz_test_executor/Cargo.toml (100%) rename crates/{client => fuzz}/derive/fuzz_test_executor/src/lib.rs (100%) rename crates/{client/src/fuzzer => fuzz/src}/accounts_storage.rs (98%) rename crates/{client/src/fuzzer => fuzz/src}/data_builder.rs (98%) rename crates/{client/src/fuzzer => fuzz/src}/error.rs (100%) rename crates/{client/src/fuzzer => fuzz/src}/fuzzing_stats.rs (100%) rename crates/{client/src/fuzzer/mod.rs => fuzz/src/lib.rs} (66%) rename crates/{client/src/fuzzer => fuzz/src}/program_test_client_blocking.rs (98%) rename crates/{client/src/fuzzer => fuzz/src}/snapshot.rs (94%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b8e42dc..2e35045b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- 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)) - fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) - del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) diff --git a/Cargo.lock b/Cargo.lock index e04b1647..0490b437 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2120,13 +2120,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", ] @@ -2549,6 +2549,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" @@ -4031,7 +4040,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.3.3", "num-traits", @@ -4163,7 +4172,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.6.1", "rand 0.8.5", @@ -4353,7 +4362,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4758,7 +4767,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.3.3", "num-traits", @@ -4834,7 +4843,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", @@ -6017,7 +6026,6 @@ dependencies = [ "log", "pathdiff", "pretty_assertions", - "prettytable", "proc-macro2", "quinn-proto", "quote", @@ -6028,9 +6036,7 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", "solana-cli-output", - "solana-program-runtime", "solana-program-test", "solana-sdk", "solana-transaction-status", @@ -6043,6 +6049,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6073,6 +6080,30 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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" diff --git a/Cargo.toml b/Cargo.toml index 9d8147d5..1f2cb53f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/cli", "crates/client", "crates/test"] +members = ["crates/cli", "crates/client", "crates/test", "crates/fuzz"] exclude = ["examples/"] resolver = "1" diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 022ab825..e3e8f6a4 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -8,12 +8,7 @@ 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", -] +fuzzing = ["dep:solana-program-test", "dep:honggfuzz", "quinn-proto/arbitrary"] [build-dependencies] anyhow = { version = "1.0.45", features = ["std"], default-features = false } @@ -23,11 +18,11 @@ pretty_assertions = "1.1.0" [dependencies] # TRIDENT -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-derive-displayix = { path = "../fuzz/derive/display_ix", version = "0.0.1" } +trident-derive-fuzz-deserialize = { path = "../fuzz/derive/fuzz_deserialize", version = "0.0.1" } +trident-derive-fuzz-test-executor = { path = "../fuzz/derive/fuzz_test_executor", version = "0.0.1" } trident-test = { path = "../test", version = "0.3.2" } - +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 @@ -44,8 +39,6 @@ solana-transaction-status = { workspace = true } solana-account-decoder = { workspace = true } spl-token = { workspace = true } spl-associated-token-account = { workspace = true } -solana-banks-client = { workspace = true } -solana-program-runtime = { workspace = true, optional = true } solana-program-test = { workspace = true, optional = true } @@ -80,4 +73,3 @@ quinn-proto = { version = "0.10.6", optional = true } pathdiff = "0.2.1" indicatif = "0.17.8" regex = "1.10.3" -prettytable = "0.10.0" diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index 70b12c62..27208c78 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -17,8 +17,8 @@ use tokio::{ }; use crate::constants::*; -use crate::fuzzer::fuzzing_stats::FuzzingStatistics; use tokio::io::AsyncBufReadExt; +use trident_fuzz::fuzzing_stats::FuzzingStatistics; #[derive(Error, Debug)] pub enum Error { diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index a4f03f41..df0d0539 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -35,24 +35,24 @@ pub mod fuzzing { pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; + pub use trident_fuzz::convert_entry; + pub use trident_fuzz::fuzz_trident; + pub use trident_fuzz::show_account; /// trident macros - pub use super::fuzzer::*; - pub use crate::convert_entry; - pub use crate::fuzz_trident; - pub use crate::show_account; + pub use trident_fuzz::*; - pub use super::fuzzer::program_test_client_blocking::ProgramEntry; pub use solana_program_test::processor; + pub use trident_fuzz::program_test_client_blocking::ProgramEntry; - /// trident methods - 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::error::*; - pub use super::fuzzer::fuzzing_stats::FuzzingStatistics; - pub use super::fuzzer::program_test_client_blocking::ProgramTestClientBlocking; - pub use super::fuzzer::snapshot::Snapshot; pub use super::temp_clone::*; + /// trident methods + pub use trident_fuzz::accounts_storage::*; + pub use trident_fuzz::data_builder::build_ix_fuzz_data; + pub use trident_fuzz::data_builder::*; + pub use trident_fuzz::error::*; + pub use trident_fuzz::fuzzing_stats::FuzzingStatistics; + pub use trident_fuzz::program_test_client_blocking::ProgramTestClientBlocking; + pub use trident_fuzz::snapshot::Snapshot; pub use std::cell::RefCell; pub use std::collections::HashMap; @@ -92,11 +92,10 @@ mod client; mod commander; mod config; mod error_reporter; -mod fuzzer; mod idl; mod keys; -mod program_client_generator; mod reader; +mod source_code_generators; mod temp_clone; mod test_generator; mod tester; @@ -108,12 +107,10 @@ pub mod ___private { pub use super::commander::Error; pub use super::commander::LocalnetHandle; pub use super::error_reporter::*; - pub use super::fuzzer::fuzzer_generator; - pub use super::fuzzer::snapshot_generator; pub use super::idl::*; pub use super::keys::*; - pub use super::program_client_generator::*; 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; 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 100% rename from crates/client/src/fuzzer/snapshot_generator.rs rename to crates/client/src/source_code_generators/snapshot_generator.rs diff --git a/crates/client/src/test_generator.rs b/crates/client/src/test_generator.rs index c312980b..73bce8e7 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -1,11 +1,12 @@ use crate::{ commander::{Commander, Error as CommanderError}, - fuzzer, idl::IdlProgram, - program_client_generator, }; -use crate::fuzzer::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::*}; @@ -491,7 +492,7 @@ impl TestGenerator { // 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 = 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) @@ -499,8 +500,8 @@ impl TestGenerator { // // 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 = 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) diff --git a/crates/client/tests/test_program_client.rs b/crates/client/tests/test_program_client.rs index c9d8cc71..c1cc7a58 100644 --- a/crates/client/tests/test_program_client.rs +++ b/crates/client/tests/test_program_client.rs @@ -34,7 +34,10 @@ 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::generate_source_code(&program_data, &use_modules); + let client_code = trident_client::___private::program_client_generator::generate_source_code( + &program_data, + &use_modules, + ); let client_code = trident_client::___private::Commander::format_program_code(&client_code).await?; diff --git a/crates/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml new file mode 100644 index 00000000..704c8dc9 --- /dev/null +++ b/crates/fuzz/Cargo.toml @@ -0,0 +1,39 @@ +[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 = ["idl-build", "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" diff --git a/crates/client/derive/display_ix/Cargo.toml b/crates/fuzz/derive/display_ix/Cargo.toml similarity index 100% rename from crates/client/derive/display_ix/Cargo.toml rename to crates/fuzz/derive/display_ix/Cargo.toml 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 100% rename from crates/client/derive/fuzz_deserialize/Cargo.toml rename to crates/fuzz/derive/fuzz_deserialize/Cargo.toml diff --git a/crates/client/derive/fuzz_deserialize/src/lib.rs b/crates/fuzz/derive/fuzz_deserialize/src/lib.rs similarity index 100% rename from crates/client/derive/fuzz_deserialize/src/lib.rs rename to crates/fuzz/derive/fuzz_deserialize/src/lib.rs diff --git a/crates/client/derive/fuzz_test_executor/Cargo.toml b/crates/fuzz/derive/fuzz_test_executor/Cargo.toml similarity index 100% rename from crates/client/derive/fuzz_test_executor/Cargo.toml rename to crates/fuzz/derive/fuzz_test_executor/Cargo.toml diff --git a/crates/client/derive/fuzz_test_executor/src/lib.rs b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs similarity index 100% rename from crates/client/derive/fuzz_test_executor/src/lib.rs rename to crates/fuzz/derive/fuzz_test_executor/src/lib.rs 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 226623dc..03e893f1 100644 --- a/crates/client/src/fuzzer/accounts_storage.rs +++ b/crates/fuzz/src/accounts_storage.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use solana_sdk::{pubkey::Pubkey, signature::Keypair}; -use crate::fuzzer::{data_builder::FuzzClient, AccountId}; +use crate::{data_builder::FuzzClient, AccountId}; pub struct PdaStore { pub pubkey: Pubkey, diff --git a/crates/client/src/fuzzer/data_builder.rs b/crates/fuzz/src/data_builder.rs similarity index 98% rename from crates/client/src/fuzzer/data_builder.rs rename to crates/fuzz/src/data_builder.rs index b9d1238a..286f12a0 100644 --- a/crates/client/src/fuzzer/data_builder.rs +++ b/crates/fuzz/src/data_builder.rs @@ -1,8 +1,8 @@ #![allow(dead_code)] -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 anchor_lang::solana_program::account_info::{Account as Acc, AccountInfo}; +use anchor_lang::solana_program::hash::Hash; use arbitrary::Arbitrary; use arbitrary::Unstructured; use solana_sdk::account::{Account, AccountSharedData}; @@ -15,7 +15,7 @@ use std::collections::HashMap; use std::error::Error; use std::fmt::Display; -use crate::fuzzer::error::*; +use crate::error::*; pub struct FuzzData { pub pre_ixs: Vec, diff --git a/crates/client/src/fuzzer/error.rs b/crates/fuzz/src/error.rs similarity index 100% rename from crates/client/src/fuzzer/error.rs rename to crates/fuzz/src/error.rs diff --git a/crates/client/src/fuzzer/fuzzing_stats.rs b/crates/fuzz/src/fuzzing_stats.rs similarity index 100% rename from crates/client/src/fuzzer/fuzzing_stats.rs rename to crates/fuzz/src/fuzzing_stats.rs diff --git a/crates/client/src/fuzzer/mod.rs b/crates/fuzz/src/lib.rs similarity index 66% rename from crates/client/src/fuzzer/mod.rs rename to crates/fuzz/src/lib.rs index b478cf71..4c2a43e6 100644 --- a/crates/client/src/fuzzer/mod.rs +++ b/crates/fuzz/src/lib.rs @@ -1,12 +1,8 @@ pub mod accounts_storage; pub mod data_builder; -pub mod fuzzer_generator; +pub mod error; pub mod fuzzing_stats; -#[cfg(feature = "fuzzing")] +// #[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/fuzzer/program_test_client_blocking.rs b/crates/fuzz/src/program_test_client_blocking.rs similarity index 98% rename from crates/client/src/fuzzer/program_test_client_blocking.rs rename to crates/fuzz/src/program_test_client_blocking.rs index 3ba74105..5cc4d455 100644 --- a/crates/client/src/fuzzer/program_test_client_blocking.rs +++ b/crates/fuzz/src/program_test_client_blocking.rs @@ -13,8 +13,8 @@ use solana_sdk::{ use spl_token::state::Mint; use tokio::runtime::Builder; -use crate::fuzzer::data_builder::FuzzClient; -use crate::fuzzer::error::*; +use crate::data_builder::FuzzClient; +use crate::error::*; pub type ProgramEntry = for<'info> fn( program_id: &Pubkey, diff --git a/crates/client/src/fuzzer/snapshot.rs b/crates/fuzz/src/snapshot.rs similarity index 94% rename from crates/client/src/fuzzer/snapshot.rs rename to crates/fuzz/src/snapshot.rs index 46d6c0a6..995ebcbf 100644 --- a/crates/client/src/fuzzer/snapshot.rs +++ b/crates/fuzz/src/snapshot.rs @@ -1,11 +1,11 @@ #![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::fuzzer::data_builder::{FuzzClient, FuzzDeserialize}; -use crate::fuzzer::error::*; +use crate::data_builder::{FuzzClient, FuzzDeserialize}; +use crate::error::*; pub struct Snapshot<'info, T> { before: Vec>, before_acc_inf: Vec>>, diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index ed4099fa..b417797a 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -6059,14 +6059,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6074,15 +6071,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", @@ -6093,6 +6084,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6123,12 +6115,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..ee2f1d14 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 @@ -3,7 +3,7 @@ use arbitrary_custom_types_4::ID as PROGRAM_ID; use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::FuzzInstruction; 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; diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 905b4c1f..e72692c4 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -6061,14 +6061,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6076,15 +6073,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", @@ -6095,6 +6086,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6125,12 +6117,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..446ca549 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 @@ -2,7 +2,7 @@ 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 fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 0a36493a..9ae2578c 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -6059,14 +6059,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6074,15 +6071,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", @@ -6093,6 +6084,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6123,12 +6115,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..c239068c 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 @@ -2,7 +2,7 @@ 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 trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index babc39bb..0373f44d 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -6061,14 +6061,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6076,15 +6073,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", @@ -6095,6 +6086,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6125,12 +6117,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..13704dbc 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 @@ -2,7 +2,7 @@ use fuzz_instructions::incorrect_integer_arithmetic_3_fuzz_instructions::FuzzIns 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 trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index b8f170c6..014ca308 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -6059,14 +6059,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6074,15 +6071,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", @@ -6093,6 +6084,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6123,12 +6115,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..a0b6b879 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 @@ -2,7 +2,7 @@ use fuzz_instructions::incorrect_ix_sequence_1_fuzz_instructions::FuzzInstructio 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 trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index 28bb7ba5..1a11cc23 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -6052,14 +6052,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6067,15 +6064,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", @@ -6086,6 +6077,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6116,12 +6108,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..f9189619 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,6 +1,6 @@ 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 trident_client::fuzzing::*; use unauthorized_access_2::entry; use unauthorized_access_2::ID as PROGRAM_ID; mod accounts_snapshots; diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index 15e2a586..dc789acb 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -6052,14 +6052,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", - "prettytable", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6067,15 +6064,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", @@ -6086,6 +6077,7 @@ dependencies = [ "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] @@ -6116,12 +6108,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "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-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..29b1c0ca 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,6 +1,6 @@ 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 trident_client::fuzzing::*; use unchecked_arithmetic_0::entry; use unchecked_arithmetic_0::ID as PROGRAM_ID; mod accounts_snapshots; From cc66b571748e6633b23bb6a576242b2b69df66fb Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 5 Jul 2024 01:10:30 +0200 Subject: [PATCH 37/56] =?UTF-8?q?=F0=9F=94=A5=20Remove=20fuzzing=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/client/Cargo.toml | 9 +++------ crates/client/src/lib.rs | 1 - .../src/templates/trident-tests/Cargo_fuzz.toml.tmpl | 1 - crates/fuzz/src/lib.rs | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../hello_world/trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../trident-tests/fuzz_tests/Cargo.toml | 1 - 12 files changed, 4 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e35045b..9dd0851a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - 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)) - fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index e3e8f6a4..7d56d7f6 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -7,9 +7,6 @@ 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"] - [build-dependencies] anyhow = { version = "1.0.45", features = ["std"], default-features = false } @@ -39,11 +36,11 @@ solana-transaction-status = { workspace = true } solana-account-decoder = { workspace = true } spl-token = { workspace = true } spl-associated-token-account = { workspace = true } -solana-program-test = { workspace = true, optional = true } +solana-program-test = { workspace = true } # HONGGFUZZ -honggfuzz = { version = "0.5.55", optional = true } +honggfuzz = { version = "0.5.55" } # ARBITRARY arbitrary = { version = "1.3.0", features = ["derive"] } @@ -69,7 +66,7 @@ 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", optional = true } +quinn-proto = { version = "0.10.6", features = ["arbitrary"] } pathdiff = "0.2.1" indicatif = "0.17.8" regex = "1.10.3" diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index df0d0539..45ee7d15 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -4,7 +4,6 @@ //! Trident could be useful for writing Rust dApps, too. /// Aimed for the fuzz tests -#[cfg(feature = "fuzzing")] pub mod fuzzing { /// anchor_lang pub use anchor_lang; 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..a9473d4e 100644 --- a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl @@ -14,4 +14,3 @@ assert_matches = "1.4.0" [dependencies.trident-client] version = "0.6.0" -features=["fuzzing"] diff --git a/crates/fuzz/src/lib.rs b/crates/fuzz/src/lib.rs index 4c2a43e6..58831843 100644 --- a/crates/fuzz/src/lib.rs +++ b/crates/fuzz/src/lib.rs @@ -2,7 +2,6 @@ pub mod accounts_storage; pub mod data_builder; pub mod error; pub mod fuzzing_stats; -// #[cfg(feature = "fuzzing")] pub mod program_test_client_blocking; pub mod snapshot; pub type AccountId = u8; 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..a1a9df14 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 @@ -15,7 +15,6 @@ 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-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..24bac75d 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 @@ -16,7 +16,6 @@ anchor-spl = "0.29.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.arbitrary-limit-inputs-5] path = "../../programs/arbitrary-limit-inputs-5" 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..990fc1ec 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 @@ -15,7 +15,6 @@ 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/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..62ccf841 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 @@ -16,7 +16,6 @@ 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-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..5757ccf1 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 @@ -15,7 +15,6 @@ 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/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml index ffffdf00..8fd386ad 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 @@ -15,7 +15,6 @@ 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/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml index 21b589bd..ee0baec3 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 @@ -15,7 +15,6 @@ assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.unchecked-arithmetic-0] path = "../../programs/unchecked-arithmetic-0" From 9f6fed5be219e9e11c018181aec2b534aacda67a Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 5 Jul 2024 13:59:29 +0200 Subject: [PATCH 38/56] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Modify=20dependencie?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit removed anchor idl feature flags , increased minimal solana ver. to 1.17.4 --- .github/workflows/run_fuzz_example.yml | 2 +- Cargo.lock | 53 +++- Cargo.toml | 32 +- crates/client/Cargo.toml | 4 +- .../trident-tests/Cargo_fuzz.toml.tmpl | 2 +- crates/fuzz/Cargo.toml | 2 +- .../arbitrary-custom-types-4/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../arbitrary-limit-inputs-5/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- examples/fuzz-tests/hello_world/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../incorrect-integer-arithmetic-3/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../incorrect-ix-sequence-1/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../unauthorized-access-2/Cargo.lock | 78 ++++- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../unchecked-arithmetic-0/Cargo.lock | 293 +++++++++++++++--- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- 20 files changed, 682 insertions(+), 188 deletions(-) diff --git a/.github/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index e8d07b8b..80773023 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -7,7 +7,7 @@ on: env: SOLANA_CLI_VERSION: 1.18.12 ANCHOR_VERSION: 0.29.0 - HONGGFUZZ_VERSION: 0.5.55 + HONGGFUZZ_VERSION: 0.5.56 jobs: run_fuzz_example: diff --git a/Cargo.lock b/Cargo.lock index 0490b437..8ebbed4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2789,6 +2788,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2807,6 +2815,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4008,7 +4028,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -5026,7 +5046,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5198,7 +5218,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5313,6 +5333,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5343,7 +5378,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5366,7 +5401,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6041,7 +6076,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6098,7 +6133,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 1f2cb53f..43dae98c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,18 +6,22 @@ resolver = "1" [workspace.dependencies] # ANCHOR -anchor-client = { version = ">=0.29.0" } -anchor-syn = { version = ">=0.29.0" } -anchor-spl = { version = ">=0.29.0" } -anchor-lang = { version = ">=0.29.0" } +anchor-client = ">=0.29.0" +anchor-syn = ">=0.29.0" +anchor-spl = ">=0.29.0" +anchor-lang = ">=0.29.0" + + # SOLANA -solana-sdk = "1.16" -solana-cli-output = "1.16" -solana-transaction-status = "1.16" -solana-account-decoder = "1.16" -solana-program = "1.16" -solana-banks-client = "1.16" -solana-program-runtime = "1.16" -solana-program-test = "1.16" -spl-token = "4.0.0" -spl-associated-token-account = "2.0.0" +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 = "3.0.2", features = [ + "no-entrypoint", +] } +spl-token = { version = "4.0.0", features = ["no-entrypoint"] } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 7d56d7f6..ef0774dc 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -24,8 +24,8 @@ 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 = { workspace = true, features = ["idl-build"] } -anchor-lang = { workspace = true, features = ["idl-build", "init-if-needed"] } +anchor-spl = { workspace = true } +anchor-lang = { workspace = true, features = ["init-if-needed"] } anchor-syn = { workspace = true } anchor-client = { workspace = true, features = ["async"] } 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 a9473d4e..be583182 100644 --- a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl @@ -7,7 +7,7 @@ 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" diff --git a/crates/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml index 704c8dc9..80ddf1f0 100644 --- a/crates/fuzz/Cargo.toml +++ b/crates/fuzz/Cargo.toml @@ -18,7 +18,7 @@ solana-program-runtime = { workspace = true } solana-program-test = { workspace = true } # ANCHOR -anchor-lang = { workspace = true, features = ["idl-build", "init-if-needed"] } +anchor-lang = { workspace = true, features = ["init-if-needed"] } anchor-syn = { workspace = true } diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index b417797a..bf55e703 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2089,13 +2088,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", ] @@ -2521,6 +2520,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" @@ -2785,6 +2793,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2803,6 +2820,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4032,7 +4061,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4063,7 +4092,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4198,7 +4227,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4384,7 +4413,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4795,7 +4824,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4871,7 +4900,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5056,7 +5085,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5228,7 +5257,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5343,6 +5372,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5373,7 +5417,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5396,7 +5440,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6076,7 +6120,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6133,7 +6177,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 a1a9df14..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index e72692c4..757154d8 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2091,13 +2090,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", ] @@ -2523,6 +2522,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" @@ -2787,6 +2795,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2805,6 +2822,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4034,7 +4063,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4065,7 +4094,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4200,7 +4229,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4386,7 +4415,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4797,7 +4826,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4873,7 +4902,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5058,7 +5087,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5230,7 +5259,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5345,6 +5374,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5375,7 +5419,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5398,7 +5442,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6078,7 +6122,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6135,7 +6179,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 24bac75d..3a6c4c05 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,7 +9,7 @@ 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" diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 9ae2578c..cc3414db 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2089,13 +2088,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", ] @@ -2521,6 +2520,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" @@ -2785,6 +2793,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2803,6 +2820,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4032,7 +4061,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4063,7 +4092,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4198,7 +4227,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4384,7 +4413,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4795,7 +4824,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4871,7 +4900,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5056,7 +5085,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5228,7 +5257,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5343,6 +5372,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5373,7 +5417,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5396,7 +5440,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6076,7 +6120,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6133,7 +6177,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 990fc1ec..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 0373f44d..6f768dd0 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2083,13 +2082,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", ] @@ -2523,6 +2522,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" @@ -2787,6 +2795,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2805,6 +2822,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4034,7 +4063,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4065,7 +4094,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4200,7 +4229,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4386,7 +4415,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4797,7 +4826,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4873,7 +4902,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5058,7 +5087,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5230,7 +5259,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5345,6 +5374,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5375,7 +5419,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5398,7 +5442,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6078,7 +6122,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6135,7 +6179,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 62ccf841..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,7 +9,7 @@ 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" diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index 014ca308..043a55b9 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2082,13 +2081,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", ] @@ -2521,6 +2520,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" @@ -2785,6 +2793,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2803,6 +2820,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4032,7 +4061,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4063,7 +4092,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4198,7 +4227,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4384,7 +4413,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4795,7 +4824,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4871,7 +4900,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5056,7 +5085,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5228,7 +5257,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5343,6 +5372,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5373,7 +5417,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5396,7 +5440,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6076,7 +6120,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6133,7 +6177,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 5757ccf1..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index 1a11cc23..11b32513 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", @@ -276,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 0.9.0", ] @@ -2082,13 +2081,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", ] @@ -2514,6 +2513,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" @@ -2778,6 +2786,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + [[package]] name = "num_enum" version = "0.6.1" @@ -2796,6 +2813,18 @@ dependencies = [ "num_enum_derive 0.7.2", ] +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4025,7 +4054,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -4056,7 +4085,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4191,7 +4220,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4377,7 +4406,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4788,7 +4817,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4864,7 +4893,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5049,7 +5078,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5221,7 +5250,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token", + "spl-token 4.0.0", "spl-token-2022 1.0.0", "thiserror", ] @@ -5336,6 +5365,21 @@ dependencies = [ "spl-type-length-value", ] +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.5.11", + "solana-program", + "thiserror", +] + [[package]] name = "spl-token" version = "4.0.0" @@ -5366,7 +5410,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5389,7 +5433,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token", + "spl-token 4.0.0", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6069,7 +6113,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", @@ -6126,7 +6170,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token", + "spl-token 3.5.0", "syn 1.0.109", "thiserror", "tokio", 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 8fd386ad..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index dc789acb..c7ea855f 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", @@ -275,7 +274,7 @@ checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" dependencies = [ "anchor-lang", "solana-program", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token", "spl-token-2022 0.9.0", ] @@ -2082,13 +2081,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", ] @@ -2514,6 +2513,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" @@ -4027,8 +4035,8 @@ 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", ] @@ -4056,7 +4064,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4191,7 +4199,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4377,7 +4385,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4788,7 +4796,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4864,7 +4872,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5047,7 +5055,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", @@ -5226,6 +5234,22 @@ 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.0", + "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" @@ -5234,7 +5258,18 @@ checksum = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" 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]] @@ -5244,7 +5279,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn", + "spl-discriminator-syn 0.1.2", + "syn 2.0.60", +] + +[[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.60", ] @@ -5261,6 +5307,19 @@ dependencies = [ "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.60", + "thiserror", +] + [[package]] name = "spl-memo" version = "4.0.0" @@ -5280,7 +5339,20 @@ dependencies = [ "bytemuck", "solana-program", "solana-zk-token-sdk", - "spl-program-error", + "spl-program-error 0.3.1", +] + +[[package]] +name = "spl-pod" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ce669f48cf2eca1ec518916d8725596bfb655beb1c74374cf71dc6cb773c9" +dependencies = [ + "borsh 1.5.0", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error 0.4.1", ] [[package]] @@ -5292,7 +5364,20 @@ 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", ] @@ -5308,6 +5393,18 @@ dependencies = [ "syn 2.0.60", ] +[[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.60", +] + [[package]] name = "spl-tlv-account-resolution" version = "0.4.0" @@ -5316,10 +5413,10 @@ checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", + "spl-type-length-value 0.3.1", ] [[package]] @@ -5330,10 +5427,24 @@ checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", + "spl-type-length-value 0.3.1", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" +dependencies = [ + "bytemuck", + "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]] @@ -5365,11 +5476,11 @@ dependencies = [ "solana-program", "solana-zk-token-sdk", "spl-memo", - "spl-pod", + "spl-pod 0.1.1", "spl-token", - "spl-token-metadata-interface", + "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "spl-type-length-value 0.3.1", "thiserror", ] @@ -5388,12 +5499,36 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", + "spl-pod 0.1.1", "spl-token", - "spl-token-group-interface", - "spl-token-metadata-interface", + "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", + "spl-type-length-value 0.3.1", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" +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.2", + "spl-token", + "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", ] @@ -5405,9 +5540,22 @@ checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", +] + +[[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]] @@ -5418,10 +5566,24 @@ checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", + "spl-type-length-value 0.3.1", +] + +[[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.0", + "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]] @@ -5433,11 +5595,11 @@ dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", + "spl-type-length-value 0.3.1", ] [[package]] @@ -5449,11 +5611,27 @@ dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", "spl-tlv-account-resolution 0.5.2", - "spl-type-length-value", + "spl-type-length-value 0.3.1", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "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]] @@ -5464,9 +5642,22 @@ checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.1", + "spl-pod 0.1.1", + "spl-program-error 0.3.1", +] + +[[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]] @@ -6068,7 +6259,7 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", + "spl-associated-token-account 3.0.2", "spl-token", "syn 1.0.109", "thiserror", 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 ee0baec3..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,7 +9,7 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" From 3f061cbb12eee90f4a3c3a5058e258b58293e874 Mon Sep 17 00:00:00 2001 From: lukacan Date: Fri, 5 Jul 2024 22:20:25 +0200 Subject: [PATCH 39/56] =?UTF-8?q?=F0=9F=92=9A=20Add=20anchor=200.30.1=20pi?= =?UTF-8?q?peline=20run?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/run_fuzz_example.yml | 22 +- .../arbitrary-limit-inputs-5/.gitignore | 1 - .../arbitrary-limit-inputs-5/.prettierignore | 1 - .../arbitrary-limit-inputs-5/Anchor.toml | 6 +- .../arbitrary-limit-inputs-5/Cargo.lock | 1174 ++++++++++------- .../arbitrary-limit-inputs-5/Cargo.toml | 1 + .../arbitrary-limit-inputs-5/Trident.toml | 6 +- .../arbitrary-limit-inputs-5/package.json | 36 +- .../arbitrary-limit-inputs-5/Cargo.toml | 9 +- .../arbitrary-limit-inputs-5/src/lib.rs | 2 +- .../trident-tests/fuzz_tests/Cargo.toml | 2 +- .../arbitrary-limit-inputs-5/tsconfig.json | 19 +- .../arbitrary-limit-inputs-5/yarn.lock | 181 +-- 13 files changed, 850 insertions(+), 610 deletions(-) diff --git a/.github/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index 80773023..907f6dba 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -5,15 +5,16 @@ on: pull_request: env: - SOLANA_CLI_VERSION: 1.18.12 - ANCHOR_VERSION: 0.29.0 + SOLANA_CLI_VERSION: 1.18.17 HONGGFUZZ_VERSION: 0.5.56 jobs: - run_fuzz_example: + unchecked-arithmetic-0: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 + - name: Set Anchor Version + run: echo "ANCHOR_VERSION=0.29.0" >> $GITHUB_ENV - uses: ./.github/actions/setup-rust/ - uses: ./.github/actions/setup-solana/ - uses: ./.github/actions/setup-honggfuzz/ @@ -23,3 +24,18 @@ jobs: - name: Test Fuzz working-directory: examples/fuzz-tests/unchecked-arithmetic-0 run: cargo run --manifest-path ../../../Cargo.toml 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: ./.github/actions/setup-rust/ + - uses: ./.github/actions/setup-solana/ + - uses: ./.github/actions/setup-honggfuzz/ + id: rust-setup + - uses: Swatinem/rust-cache@v2 + name: Cache Rust and it's packages + - name: Test Fuzz + working-directory: examples/fuzz-tests/arbitrary-limit-inputs-5 + run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 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 757154d8..02f46014 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,37 +262,66 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", + "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-token 4.0.0", - "spl-token-2022 0.9.0", + "spl-associated-token-account 3.0.2", + "spl-pod 0.2.2", + "spl-token", + "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", @@ -323,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" @@ -399,7 +434,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", @@ -422,7 +457,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", @@ -451,7 +486,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -551,9 +586,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", @@ -580,7 +615,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -596,15 +631,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", @@ -656,9 +691,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", ] @@ -733,11 +768,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", ] @@ -769,15 +804,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", ] @@ -827,9 +862,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", @@ -838,9 +873,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", @@ -879,22 +914,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]] @@ -932,9 +967,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", ] @@ -972,11 +1007,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", @@ -991,9 +1036,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" @@ -1007,7 +1052,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1162,18 +1207,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", ] @@ -1199,9 +1244,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" @@ -1285,12 +1330,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]] @@ -1309,16 +1354,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]] @@ -1334,13 +1379,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]] @@ -1381,7 +1426,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -1420,7 +1465,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1514,13 +1559,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]] @@ -1543,7 +1588,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1607,9 +1652,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" @@ -1643,13 +1688,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]] @@ -1658,11 +1703,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]] @@ -1686,9 +1731,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", @@ -1840,7 +1885,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1927,9 +1972,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", @@ -1940,9 +1985,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" @@ -1976,7 +2021,7 @@ dependencies = [ "indexmap 2.2.6", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tracing", ] @@ -2124,9 +2169,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" @@ -2142,9 +2187,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", @@ -2235,18 +2280,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", @@ -2254,9 +2299,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" @@ -2293,9 +2338,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", ] @@ -2376,15 +2421,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" @@ -2392,7 +2437,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", ] @@ -2452,15 +2497,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" @@ -2474,9 +2519,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" @@ -2489,9 +2534,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", @@ -2499,9 +2544,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", @@ -2509,9 +2554,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" @@ -2575,9 +2620,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", ] @@ -2697,11 +2742,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", ] @@ -2741,7 +2785,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2755,9 +2799,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", @@ -2778,9 +2822,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", ] @@ -2795,15 +2839,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2822,18 +2857,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -2843,7 +2866,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2855,7 +2878,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2866,9 +2889,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", ] @@ -2956,9 +2979,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", @@ -2972,16 +2995,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" @@ -3048,7 +3071,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3172,7 +3195,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -3220,9 +3243,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", ] @@ -3244,7 +3267,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3364,7 +3387,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]] @@ -3428,11 +3451,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]] @@ -3441,16 +3464,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", @@ -3460,9 +3483,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", @@ -3471,15 +3494,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" @@ -3514,7 +3537,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tower-service", "url", "wasm-bindgen", @@ -3547,7 +3570,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -3590,7 +3613,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.60", + "syn 2.0.68", "unicode-ident", ] @@ -3606,9 +3629,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" @@ -3640,7 +3663,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", @@ -3692,15 +3715,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" @@ -3743,7 +3766,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3758,11 +3781,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", @@ -3771,9 +3794,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", @@ -3781,9 +3804,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", ] @@ -3799,44 +3822,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" @@ -3865,10 +3897,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]] @@ -3906,7 +3938,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4048,9 +4080,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", @@ -4063,19 +4095,19 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", + "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", @@ -4134,9 +4166,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", @@ -4155,11 +4187,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", @@ -4172,9 +4204,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", @@ -4183,9 +4215,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", @@ -4203,9 +4235,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", @@ -4222,9 +4254,9 @@ 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", @@ -4240,9 +4272,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", @@ -4257,9 +4289,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", @@ -4273,9 +4305,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", @@ -4300,9 +4332,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", @@ -4333,9 +4365,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", @@ -4343,9 +4375,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", @@ -4357,9 +4389,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", @@ -4379,9 +4411,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", @@ -4403,9 +4435,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", @@ -4428,21 +4460,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", @@ -4453,9 +4485,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", @@ -4464,9 +4496,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", @@ -4474,9 +4506,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", @@ -4489,9 +4521,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", @@ -4517,9 +4549,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", @@ -4546,9 +4578,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", @@ -4556,11 +4588,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", @@ -4568,7 +4600,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.14", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", @@ -4577,7 +4609,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", @@ -4601,9 +4633,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", @@ -4629,9 +4661,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", @@ -4659,9 +4691,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", @@ -4684,9 +4716,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", @@ -4711,9 +4743,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", @@ -4721,9 +4753,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", @@ -4740,9 +4772,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", @@ -4766,9 +4798,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", @@ -4788,9 +4820,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", @@ -4801,9 +4833,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", @@ -4878,15 +4910,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", @@ -4933,15 +4965,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]] @@ -4952,9 +4984,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", @@ -4968,9 +5000,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", @@ -4983,9 +5015,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", @@ -5016,9 +5048,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", @@ -5030,9 +5062,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", @@ -5045,9 +5077,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", @@ -5069,9 +5101,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", @@ -5085,18 +5117,18 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-memo", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "thiserror", ] [[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", @@ -5109,9 +5141,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", @@ -5125,9 +5157,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", @@ -5144,9 +5176,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", @@ -5166,9 +5198,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", @@ -5180,9 +5212,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", @@ -5259,20 +5291,47 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "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 = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "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 = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" +checksum = "34d1814406e98b08c5cd02c1126f83fd407ad084adce0b05fda5730677822eac" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator-derive", + "spl-discriminator-derive 0.2.0", ] [[package]] @@ -5282,8 +5341,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]] @@ -5295,7 +5365,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", ] @@ -5310,27 +5393,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 = "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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0657b6490196971d9e729520ba934911ff41fbb2cb9004463dbe23cf8b4b4f" +checksum = "49065093ea91f57b9b2bd81493ff705e2ad4e64507a07dbc02b085778e02770e" dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-program-error-derive", + "spl-program-error-derive 0.4.1", "thiserror", ] @@ -5343,50 +5452,47 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" +name = "spl-program-error-derive" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.68", ] [[package]] name = "spl-tlv-account-resolution" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" +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-token" -version = "3.5.0" +name = "spl-tlv-account-resolution" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" dependencies = [ - "arrayref", "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", "solana-program", - "thiserror", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-type-length-value 0.4.3", ] [[package]] @@ -5406,9 +5512,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", @@ -5416,21 +5522,23 @@ dependencies = [ "num-traits", "num_enum 0.7.2", "solana-program", + "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "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 = "1.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" dependencies = [ "arrayref", "bytemuck", @@ -5441,12 +5549,12 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", - "spl-type-length-value", + "spl-pod 0.2.2", + "spl-token", + "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", ] @@ -5458,9 +5566,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]] @@ -5471,55 +5592,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 = "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.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" +checksum = "422ce13429dbd41d2cee8a73931c05fda0b0c8ca156a8b0c19445642550bb61a" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", ] [[package]] @@ -5540,6 +5688,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" @@ -5587,9 +5741,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", @@ -5605,7 +5759,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5649,9 +5803,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", @@ -5749,7 +5903,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5760,7 +5914,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "test-case-core", ] @@ -5781,22 +5935,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]] @@ -5861,9 +6015,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", ] @@ -5876,9 +6030,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", @@ -5895,13 +6049,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]] @@ -5973,16 +6127,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]] @@ -5995,11 +6148,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" @@ -6009,7 +6177,7 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.6", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -6020,7 +6188,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]] @@ -6049,7 +6230,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -6121,12 +6302,12 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", - "spl-token 3.5.0", + "spl-associated-token-account 3.0.2", + "spl-token", "syn 1.0.109", "thiserror", "tokio", - "toml", + "toml 0.5.11", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6179,7 +6360,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", @@ -6256,9 +6437,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" @@ -6315,9 +6496,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", @@ -6406,7 +6587,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -6440,7 +6621,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6513,7 +6694,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]] @@ -6531,7 +6712,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]] @@ -6551,18 +6732,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]] @@ -6573,9 +6754,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" @@ -6585,9 +6766,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" @@ -6597,15 +6778,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" @@ -6615,9 +6796,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" @@ -6627,9 +6808,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" @@ -6639,9 +6820,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" @@ -6651,9 +6832,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" @@ -6664,6 +6845,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" @@ -6714,22 +6904,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]] @@ -6749,7 +6939,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -6773,9 +6963,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 a398402c..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"]). @@ -38,4 +38,4 @@ save_all = 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 +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..b8210d00 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,13 @@ 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"] [dependencies] -anchor-lang = "0.29.0" -anchor-spl = "0.29.0" +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/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 3a6c4c05..b7f9a646 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 @@ -12,7 +12,7 @@ edition = "2021" 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" 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" From afca5cb492989208f0b7ff0befcbc8e1da0f59f8 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 6 Jul 2024 19:04:24 +0200 Subject: [PATCH 40/56] =?UTF-8?q?=E2=9C=A8=20Introduce=20AccountsSnapshots?= =?UTF-8?q?=20derive=20Macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Cargo.lock | 802 +++++++++++++----- crates/client/Cargo.toml | 2 + crates/client/src/lib.rs | 1 + .../snapshot_generator.rs | 6 +- .../expected_accounts_snapshots.rs | 7 +- crates/fuzz/Cargo.toml | 1 + .../fuzz/derive/accounts_snapshots/Cargo.toml | 19 + .../fuzz/derive/accounts_snapshots/src/lib.rs | 10 + .../fuzz/derive/fuzz_deserialize/src/lib.rs | 3 +- .../fuzz/derive/fuzz_test_executor/src/lib.rs | 2 +- crates/fuzz/src/data_builder.rs | 1 + crates/fuzz/src/lib.rs | 1 + crates/fuzz/src/snapshot.rs | 9 +- crates/fuzz/src/trident_accounts_struct.rs | 759 +++++++++++++++++ .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 2 + .../arbitrary-limit-inputs-5/Cargo.lock | 22 + .../arbitrary-limit-inputs-5/Cargo.toml | 4 +- .../src/instructions/initialize.rs | 4 +- .../src/instructions/withdraw.rs | 4 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 217 ----- .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 3 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 1 - .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 1 + .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 + .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 6 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 2 + 28 files changed, 1427 insertions(+), 471 deletions(-) create mode 100644 crates/fuzz/derive/accounts_snapshots/Cargo.toml create mode 100644 crates/fuzz/derive/accounts_snapshots/src/lib.rs create mode 100644 crates/fuzz/src/trident_accounts_struct.rs delete mode 100644 examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dd0851a..2c839c7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) - del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - 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)) diff --git a/Cargo.lock b/Cargo.lock index 8ebbed4a..a9c043fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,9 +76,9 @@ dependencies = [ [[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", @@ -274,8 +274,8 @@ checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" dependencies = [ "anchor-lang", "solana-program", - "spl-associated-token-account", - "spl-token 4.0.0", + "spl-associated-token-account 2.3.0", + "spl-token", "spl-token-2022 0.9.0", ] @@ -376,6 +376,20 @@ version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +[[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" @@ -758,6 +772,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" @@ -784,6 +808,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.50", + "syn_derive", +] + [[package]] name = "borsh-derive-internal" version = "0.9.3" @@ -882,9 +920,9 @@ 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", ] @@ -991,6 +1029,12 @@ 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" @@ -1178,6 +1222,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" @@ -1386,17 +1439,6 @@ dependencies = [ "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", -] - [[package]] name = "dashmap" version = "5.5.3" @@ -1408,6 +1450,7 @@ dependencies = [ "lock_api", "once_cell", "parking_lot_core", + "rayon", ] [[package]] @@ -1494,6 +1537,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" @@ -1599,6 +1648,12 @@ dependencies = [ "syn 2.0.50", ] +[[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" @@ -1801,6 +1856,15 @@ dependencies = [ "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" @@ -1817,13 +1881,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" @@ -2042,7 +2103,7 @@ 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]] @@ -2262,6 +2323,25 @@ 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" @@ -2619,6 +2699,33 @@ dependencies = [ "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" @@ -2663,6 +2770,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" @@ -2788,15 +2901,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2815,18 +2919,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -3109,6 +3201,36 @@ 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" @@ -3203,9 +3325,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", ] @@ -3281,9 +3403,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", ] @@ -3762,6 +3884,15 @@ 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" @@ -3855,7 +3986,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", @@ -4013,9 +4144,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bc7bb65888ae7e13180dcd6a74d3233fcc57b627e138e34f2ac01601e92e6a2" +checksum = "cb0acf51e7100ff312eb16c3e0f30eb82bc23de071db542c530dcb240c50239f" dependencies = [ "Inflector", "base64 0.21.7", @@ -4028,19 +4159,19 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", + "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.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8a6960b763f5608a5373c3623e14b8c5d6afc98513637bc80f6a132a7c3436" +checksum = "06cc0b58c9ddb9f978ffd116728235841a3d5c35eda1bbf605d5c7eb62c7ba0e" dependencies = [ "arrayref", "bincode", @@ -4050,10 +4181,9 @@ dependencies = [ "byteorder", "bzip2", "crossbeam-channel", - "dashmap 4.0.2", + "dashmap", "flate2", "fnv", - "fs-err", "im", "index_list", "itertools", @@ -4062,10 +4192,10 @@ dependencies = [ "lz4", "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", @@ -4073,14 +4203,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", @@ -4097,14 +4230,14 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc7af1bec07573459641f5f3731adfe8804480ee5f3d6ff3396613999e20373" +checksum = "5fbd31eb27345b689f1a10763a2b6686c304fe52567c5e6f0dfedf06449211dd" dependencies = [ "bincode", "bytemuck", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -4118,11 +4251,11 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a81d32f3e655c48feb0c7f9e35e978cbd8cff1e8ab2628a5e4c6db4acf59d9" +checksum = "a8c8f3d14fbd3930a0d9c25fec5d6bd7f4e58eb63a12a2c52ce310168dddaf9d" dependencies = [ - "borsh 0.10.3", + "borsh 1.5.1", "futures", "solana-banks-interface", "solana-program", @@ -4135,9 +4268,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46351e3e3fcc299b5f601053aee4ef02041ff485dddccf67003c9a0da8f56321" +checksum = "b36b985636656b6ab830523f8340ab0b272f192148b2c92c5e7dbf4c60d70273" dependencies = [ "serde", "solana-sdk", @@ -4146,9 +4279,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904fcca7a6dd533eadc30b3aa690d3a78d95c0a49f36578a483539a3fcf709c8" +checksum = "f060504addd1cf57f45c63b44a674666117c482b1d6d39bdf293f7efc88b9638" dependencies = [ "bincode", "crossbeam-channel", @@ -4166,9 +4299,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10fff6fa164f4cfe66731b574b56c0883e56228a64f03b4e66634e09187219a" +checksum = "8d6ade96d078ce636533e5f2a96da651120da334a0af9eed6160e12c3b96035a" dependencies = [ "bincode", "byteorder", @@ -4185,16 +4318,16 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90122f6272c05baf8bbf88431be6feaf381aafd3d38e68b5ebd8c0a447f05f6" +checksum = "e31233a00b12c799c7bd93518394fbb1d168a9a86eca6f3d7e404ca03cdace04" dependencies = [ "bv", "bytemuck", "log", "memmap2 0.5.10", "modular-bitfield", - "num_enum 0.6.1", + "num_enum 0.7.2", "rand 0.8.5", "solana-measure", "solana-sdk", @@ -4203,9 +4336,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29a50c8ac6cb7cdefa3da425bad3122d14a7b9f5e1a6e1e4e64eb53c778c1ff" +checksum = "fe1de38b51034aa407fdf5579935c8e7a5e43d18d294cc76230080dbcfa2bbee" dependencies = [ "chrono", "clap 2.34.0", @@ -4220,9 +4353,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c88fefb22ac1f9f8e0f2d33da1b3f6ebc7411e112a26d6490f03d50254c493" +checksum = "2a53a51ccf2a444403d9d7f15b736be8571b47bb57b0dd66e35d31b16b087448" dependencies = [ "dirs-next", "lazy_static", @@ -4236,9 +4369,9 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f28330bfd12bc0a502b2bed7b0360f0fca62128744a824143b2a6dfbaf89fd" +checksum = "5b3ea750256172de8da64ed27412413d9d13fe247a3746d3271254b58e3d77aa" dependencies = [ "Inflector", "base64 0.21.7", @@ -4263,13 +4396,13 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93b28ec883a4bb22289ef31851abe5f2c9247748cf79580aef954ec9759b84ca" +checksum = "790ce6ac8ad0f7e3531327a7ea486433ea2d9513bbaa9e51f9ce9c687aa5c687" dependencies = [ "async-trait", "bincode", - "dashmap 4.0.2", + "dashmap", "futures", "futures-util", "indexmap 2.2.3", @@ -4296,9 +4429,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e60e708bc0f1cb7807ee7ac81a73c72dfd90347cd906d918101de7e91f0b4407" +checksum = "4fc0d9facac6c11c0fcd565f20ec6855b7728133956ac7e71475badb04e313b3" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4306,9 +4439,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5fa041dc7ebb8079fb15a4691b2822d8a67a615f90a838e43aa556eaab6178" +checksum = "56db52d5c4faa7dba6dd0d82deb89d1b442524ea241b8d88940efae656236009" dependencies = [ "bincode", "chrono", @@ -4320,9 +4453,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f933d76a147dc6bb37daff4314c7b63a8a4778be259d8cbe8126294d97b328d" +checksum = "cc24ca8cdf265fe38e4f43ba8d3a97368a8269a59b6e7b9be097b54a19565359" dependencies = [ "async-trait", "bincode", @@ -4342,9 +4475,9 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "506d373966c1118111c3d72ba88172e907d9699a2d6792210f31ed7423e654d9" +checksum = "f10d6e9e0f0afbdbc839c4a10b1c8b34361e4a8bbe608cb2e0c3d036b02a6344" dependencies = [ "lazy_static", "log", @@ -4366,17 +4499,13 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a64bc1df0fcda5884f6cf6eb50f8aa283dbf767e984fcbbb53e344859b597f" +checksum = "e5fa9c8e908d743fc4b446c675d15f8290b1a400d84640f7fae6256aeea4815d" dependencies = [ - "ahash 0.8.4", - "blake3", "block-buffer 0.10.4", "bs58 0.4.0", "bv", - "byteorder", - "cc", "either", "generic-array", "im", @@ -4387,7 +4516,6 @@ dependencies = [ "serde", "serde_bytes", "serde_derive", - "serde_json", "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", @@ -4396,9 +4524,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8e0e27e6639f23a7d23e0ae7b92b8ab5d848bb649e962f6528a795988ca161" +checksum = "207d87baccbc41473f151443b8d2b8f8ba85ace1b05bef368a2cbe0858ae6a77" dependencies = [ "proc-macro2", "quote", @@ -4408,9 +4536,9 @@ dependencies = [ [[package]] name = "solana-loader-v4-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5918fbb8bfc74dc48d97e09bfd7c94772e63c8e252875f5834de7d56b4afe" +checksum = "64c8569a2fa9f9a7ec2f3760a0d4764543963a72fbd57dde91a0b2cdd9533354" dependencies = [ "log", "solana-measure", @@ -4421,9 +4549,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b868a3b8148d7ab3e44a6b40530843903bedaaf8c6a2aa3d797eb01b3435538d" +checksum = "5540574de96cac634cb9c82ba7635aab00cbc37a277d36fa1d491a43f3d6e5f8" dependencies = [ "env_logger", "lazy_static", @@ -4432,9 +4560,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5a243ef9e5f0364a3625a74ac701ff15d28d57f997cfcfc5b27badb0f0f36d" +checksum = "f9c106b7bb39e23d9fddafababe5b7e489cad207a5bd6e06d46e66f9c88647fe" dependencies = [ "log", "solana-sdk", @@ -4442,9 +4570,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b007b5f98cf2f3760fd28b3e9131e68ba9e55a9b164be966fc108e859999c1f8" +checksum = "4899f40673b3a7fa556839338814a462889a283d45ad7a84922ed0ed84dba72f" dependencies = [ "crossbeam-channel", "gethostname", @@ -4457,9 +4585,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6de74b7158359b85c773436284cd0bf68f925434888d2681d3db68dc1a1e4460" +checksum = "eb6c23a2a7af5d49c843b005c02721478d2befb0844e4337239919efa1b8618f" dependencies = [ "bincode", "clap 3.2.25", @@ -4477,13 +4605,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.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a837e4272603ec6b73e72db330f3b1b3b03174b6f2f57d28daf8d702adaa35" +checksum = "f9ec5d17735265dadcdf7eae04276370cc8570945cc47a04a7972b0752897546" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.11", "bincode", "bv", "caps", @@ -4508,9 +4642,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ec090add6d789cd498291fbbcbc4207ec5d8f4df4e93cf9bd30feed14474a1" +checksum = "4d0175aa736ef2bac329de17727b783fbc7c83dee182a0fbb5c8b45316c22cae" dependencies = [ "ark-bn254", "ark-ec", @@ -4522,6 +4656,7 @@ dependencies = [ "blake3", "borsh 0.10.3", "borsh 0.9.3", + "borsh 1.5.1", "bs58 0.4.0", "bv", "bytemuck", @@ -4539,7 +4674,7 @@ dependencies = [ "log", "memoffset 0.9.0", "num-bigint 0.4.4", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "parking_lot", "rand 0.8.5", @@ -4562,9 +4697,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b0b2035bff6725d6792c2709871b3df58517e5b064fe8ae9a00aa9ec7c2804" +checksum = "983f4b793c1cb5186d2a2ed1ea460733972d294d972982a1943ab2bf6c6a218a" dependencies = [ "base64 0.21.7", "bincode", @@ -4573,7 +4708,7 @@ dependencies = [ "itertools", "libc", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "percentage", "rand 0.8.5", @@ -4590,9 +4725,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509de66ffda8fb3fc951d531a06320b2bc9a9c88792a408f79157a7123a25e17" +checksum = "5df36e5e37b2166723be77d4f6aae79a22251344f6bc7b92b96fd45e230ab943" dependencies = [ "assert_matches", "async-trait", @@ -4620,9 +4755,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb2e34874dc723285d1eedeb5d6c9b51e4b19e0b71434b5121019d21d4e5553" +checksum = "ea8dee0de77fe38ecc41384ba8fe058c04c213d0ae6feaec94e08d4b286f43da" dependencies = [ "crossbeam-channel", "futures-util", @@ -4645,9 +4780,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0a48caf146b1f226b0a049053ae77034df28818413c20528834b11d61e3c6a" +checksum = "a27f714d0c54b430ba97381053f3b2da7b5ada642dbe799dabe8546772573f85" dependencies = [ "async-mutex", "async-trait", @@ -4672,9 +4807,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b9aa7bb42651394ac4f087df364bfcf801d8d9f249e94721e1ef15240c5887" +checksum = "a40d1d7ad73ff88642e978b35ec404fb932e6499e6c5061cb53e33423bc157ac" dependencies = [ "lazy_static", "num_cpus", @@ -4682,14 +4817,14 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68904b56c0457dd688300069f825c169d30acfa4eddfd5662b0ca700437c5d78" +checksum = "9be0a98dbe7fbb6ce2b3343f2aceb5fdd8f94ce7672d01201f50bef83b8af009" dependencies = [ "console", "dialoguer", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "parking_lot", "qstring", @@ -4701,9 +4836,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48b323271070ea8e2902c101d808d54c7d910d573b02a646e0c462aa6de2dc" +checksum = "e5240a1e261c4cf8261206b76d9710f1e7b26c7b2af1e4ee7b84592c298ad9f1" dependencies = [ "async-trait", "base64 0.21.7", @@ -4727,9 +4862,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa40fc52832e790c53e27baf771926542b5b9a370c5dad59cbc31055b1e52a2b" +checksum = "023317ad467034ac4bd4ea01a95c206018a123af97814c40a5035bf9e0c4f082" dependencies = [ "base64 0.21.7", "bs58 0.4.0", @@ -4749,9 +4884,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd6be836c589018ad607193ccf27677ac8e97125c40642ab2183f23deb95a5f" +checksum = "ed8e4e5066a27c1f9b095cfc4b034860717ba0af079e975848daf58d304b81c2" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4762,10 +4897,11 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db3f3cf470ed0ec22b606f27fcaabad538486f15318abb7938e7225ca760401" +checksum = "d247839cedb3581fc3b21bfff7cca1a817fbcb5b5a1297bfff2d136a038468b6" dependencies = [ + "aquamarine", "arrayref", "base64 0.21.7", "bincode", @@ -4775,11 +4911,10 @@ dependencies = [ "byteorder", "bzip2", "crossbeam-channel", - "dashmap 4.0.2", + "dashmap", "dir-diff", "flate2", "fnv", - "fs-err", "im", "index_list", "itertools", @@ -4788,11 +4923,12 @@ dependencies = [ "lru", "lz4", "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", @@ -4803,7 +4939,6 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "siphasher", "solana-accounts-db", "solana-address-lookup-table-program", "solana-bpf-loader-program", @@ -4839,15 +4974,15 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2817e4e1190e3539c989b3b350ee306b91e63959e19638e2632cc92ac9041527" +checksum = "d0cf4419ab0807e6d7d27b7e45c0b3996caf5c2f40d6b920ce797593f96041be" dependencies = [ "assert_matches", "base64 0.21.7", "bincode", "bitflags 2.4.2", - "borsh 0.10.3", + "borsh 1.5.1", "bs58 0.4.0", "bytemuck", "byteorder", @@ -4864,9 +4999,9 @@ dependencies = [ "libsecp256k1", "log", "memmap2 0.5.10", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", - "num_enum 0.6.1", + "num_enum 0.7.2", "pbkdf2 0.11.0", "qstring", "qualifier_attr", @@ -4881,6 +5016,7 @@ dependencies = [ "serde_with", "sha2 0.10.8", "sha3 0.10.8", + "siphasher", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -4893,9 +5029,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04051488f4275df58be7abf34dc0583f4d38df72000a047c85a549c6a996acc0" +checksum = "2a19fb7874415de034a3067a71447a376be204be8f0a84a2861a65bbdb2286dd" dependencies = [ "bs58 0.4.0", "proc-macro2", @@ -4912,9 +5048,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3654be11d71a8751014b4ff07dbdaf5b513fe4876089011f96fc3cdb898e8a" +checksum = "dc21bd9a0b95931b422d32a90db7068490ff68ecfe388c79aedceb763a48f341" dependencies = [ "crossbeam-channel", "log", @@ -4928,9 +5064,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8c6ada46e6116fd58cafbb4cd65eb1129f75d4c9e1531d3d265131bf0455bc" +checksum = "5bde9fe6d14e70e85b81061e222189a368c655f1af956dac8f658748cf7fdab1" dependencies = [ "bincode", "log", @@ -4943,9 +5079,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4a9a97a9e559d4b1eaeb6a5700c9c9c109a15fdac1f7253af529677a69b39c" +checksum = "d18342730db0c08836134b226c938e380039feb219e0502a55fd5c1df793a178" dependencies = [ "async-channel", "bytes", @@ -4975,9 +5111,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b15c250192f85b386f65a4c392645a979673e0e2315f0628e6791707ca01d3" +checksum = "71aa5503922fd7116d09367b8acdc6f5375af22db4a01a084427d29655cd230a" dependencies = [ "bincode", "log", @@ -4989,9 +5125,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "603ed51b04bbe7645c2f8a532adc1cf30e74b92d321171fc381caf29836f6fe0" +checksum = "a380d99338995b308f4ecb06086a460f9b99a26ed801bb1b2f1a426764c1ed40" dependencies = [ "bincode", "log", @@ -5004,9 +5140,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd9242b9df608c1e4d8ed0a22e68e864313678aa2d6f78e3a6bb75b42859a08" +checksum = "14dd5d6a503da75fad16547c57bd7e919b2aa6ad6d73986cb8a3e76edf97acdc" dependencies = [ "async-trait", "bincode", @@ -5028,9 +5164,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53ebc2543fe6066cc3b530fce572d1a204a207fa801b258682efcf1955da683" +checksum = "892ec130ff5761ef96a271a9367cb1f3cdf64f70ec133331c491253e91d236aa" dependencies = [ "Inflector", "base64 0.21.7", @@ -5044,18 +5180,18 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-memo", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "thiserror", ] [[package]] name = "solana-udp-client" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49d8462ebedc0524d5c287dd7feea3ac13622b424deba4459813fff1748a9bb" +checksum = "64f6a9d9e77cfd897dda8a26c2faaf75850ecc8204b871a62eeb61819aa3d882" dependencies = [ "async-trait", "solana-connection-cache", @@ -5068,9 +5204,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ac486deb05a0c4164e892091c6c817c9f9a54d658721e316f49040ab2f2df9" +checksum = "e0785c3b70924eda59d5369ada65c1676d7bb15bdfe0d60c56a343b640fd388a" dependencies = [ "log", "rustc_version", @@ -5084,9 +5220,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d9ceea1905d41065b73d763c7d816a271d0ba9e43df6834759ec61d1560974" +checksum = "81c5d83aa3fe3a2c9a6d274604fc9752fdd747febd8d3e6340f2b2355c5b7edc" dependencies = [ "crossbeam-channel", "itertools", @@ -5103,13 +5239,13 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b87fe95b52594e21a410ec5ab00c3266ebf41997c8c28ca6765b123eaf5a475" +checksum = "a5efdfa03b77da6b38a2039758af252c6a32154a3b564d1dc5de85e36742c462" dependencies = [ "bincode", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -5125,12 +5261,12 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68964dbd32b6119a1eafcb871dbc4225e91a74f90450d6edf0c7ccc3111082fe" +checksum = "f59fb5bca66781c5ab44019821f33e83d66e1b54e65b736cfe9542e3dd2ab527" dependencies = [ "bytemuck", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "solana-program-runtime", "solana-sdk", @@ -5139,9 +5275,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.16" +version = "1.18.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d860992705578848d2a04e8a2a5b2b2d380b0be5db8cf9d0744a166e269c0ceb" +checksum = "b24acce0cfccafd57d558884d46a153400d3125e00ca802c02071a21cafcbb61" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -5153,7 +5289,7 @@ dependencies = [ "itertools", "lazy_static", "merlin", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rand 0.7.3", "serde", @@ -5218,11 +5354,27 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "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.0" @@ -5231,7 +5383,18 @@ 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]] @@ -5241,7 +5404,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn", + "spl-discriminator-syn 0.1.2", + "syn 2.0.50", +] + +[[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.50", ] @@ -5258,6 +5432,19 @@ dependencies = [ "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.50", + "thiserror", +] + [[package]] name = "spl-memo" version = "4.0.0" @@ -5277,7 +5464,20 @@ dependencies = [ "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]] @@ -5289,7 +5489,20 @@ 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", ] @@ -5305,6 +5518,18 @@ dependencies = [ "syn 2.0.50", ] +[[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.50", +] + [[package]] name = "spl-tlv-account-resolution" version = "0.4.0" @@ -5313,10 +5538,10 @@ checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" 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]] @@ -5327,25 +5552,24 @@ 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-token" -version = "3.5.0" +name = "spl-tlv-account-resolution" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" dependencies = [ - "arrayref", "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", "solana-program", - "thiserror", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-type-length-value 0.4.3", ] [[package]] @@ -5377,11 +5601,11 @@ dependencies = [ "solana-program", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-metadata-interface", + "spl-pod 0.1.0", + "spl-token", + "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "spl-type-length-value 0.3.0", "thiserror", ] @@ -5400,12 +5624,36 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", - "spl-token 4.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", + "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", + "spl-type-length-value 0.3.0", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" +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.2", + "spl-token", + "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", ] @@ -5417,9 +5665,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]] @@ -5430,10 +5691,24 @@ 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]] @@ -5445,11 +5720,11 @@ dependencies = [ "arrayref", "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", "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", + "spl-type-length-value 0.3.0", ] [[package]] @@ -5461,11 +5736,27 @@ dependencies = [ "arrayref", "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", "spl-tlv-account-resolution 0.5.1", - "spl-type-length-value", + "spl-type-length-value 0.3.0", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "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]] @@ -5476,9 +5767,22 @@ 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]] @@ -5555,6 +5859,18 @@ dependencies = [ "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.50", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -5672,6 +5988,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" @@ -6075,12 +6397,13 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account", - "spl-token 3.5.0", + "spl-associated-token-account 3.0.2", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6088,6 +6411,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6122,6 +6455,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6133,7 +6467,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index ef0774dc..07660873 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -18,6 +18,8 @@ pretty_assertions = "1.1.0" trident-derive-displayix = { path = "../fuzz/derive/display_ix", version = "0.0.1" } trident-derive-fuzz-deserialize = { path = "../fuzz/derive/fuzz_deserialize", version = "0.0.1" } trident-derive-fuzz-test-executor = { path = "../fuzz/derive/fuzz_test_executor", version = "0.0.1" } +trident-derive-accounts-snapshots = { path = "../fuzz/derive/accounts_snapshots", version = "0.0.1" } + trident-test = { path = "../test", version = "0.3.2" } trident-fuzz = { path = "../fuzz", version = "0.1.0" } diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index 45ee7d15..247c328e 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -30,6 +30,7 @@ pub mod fuzzing { pub use honggfuzz::fuzz; /// trident derive + pub use trident_derive_accounts_snapshots::AccountsSnapshots; pub use trident_derive_displayix::DisplayIx; pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; diff --git a/crates/client/src/source_code_generators/snapshot_generator.rs b/crates/client/src/source_code_generators/snapshot_generator.rs index 21e9a44a..1531916e 100644 --- a/crates/client/src/source_code_generators/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 #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/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs b/crates/client/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs index 872d64a2..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,5 +1,4 @@ use anchor_lang::prelude::*; -use fuzz_example3::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, @@ -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/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml index 80ddf1f0..1d693bab 100644 --- a/crates/fuzz/Cargo.toml +++ b/crates/fuzz/Cargo.toml @@ -37,3 +37,4 @@ 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..a8a17f11 --- /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 = "1" +quote = "1" +syn = "1" +trident-fuzz = { path = "../../", version = "0.1.0" } 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..e9879bf3 --- /dev/null +++ b/crates/fuzz/derive/accounts_snapshots/src/lib.rs @@ -0,0 +1,10 @@ +use proc_macro::TokenStream; +use quote::ToTokens; +use syn::parse_macro_input; + +#[proc_macro_derive(AccountsSnapshots)] +pub fn derive_accounts_snapshots(item: TokenStream) -> TokenStream { + parse_macro_input!(item as trident_fuzz::trident_accounts_struct::TridentAccountsStruct) + .to_token_stream() + .into() +} diff --git a/crates/fuzz/derive/fuzz_deserialize/src/lib.rs b/crates/fuzz/derive/fuzz_deserialize/src/lib.rs index 46e5b753..3ed818de 100644 --- a/crates/fuzz/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/fuzz/derive/fuzz_test_executor/src/lib.rs b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs index 6ca24177..20f466d4 100644 --- a/crates/fuzz/derive/fuzz_test_executor/src/lib.rs +++ b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs @@ -60,7 +60,7 @@ pub fn fuzz_test_executor(input: TokenStream) -> TokenStream { stats_logger.increase_successful(self.to_context_string()); snaphot.capture_after(client).unwrap(); - let (acc_before, acc_after) = snaphot.get_snapshot() + 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 diff --git a/crates/fuzz/src/data_builder.rs b/crates/fuzz/src/data_builder.rs index 286f12a0..d66caef8 100644 --- a/crates/fuzz/src/data_builder.rs +++ b/crates/fuzz/src/data_builder.rs @@ -210,6 +210,7 @@ pub trait FuzzDeserialize<'info> { fn deserialize_option( &self, + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> Result; } diff --git a/crates/fuzz/src/lib.rs b/crates/fuzz/src/lib.rs index 58831843..7b45fcf8 100644 --- a/crates/fuzz/src/lib.rs +++ b/crates/fuzz/src/lib.rs @@ -5,3 +5,4 @@ pub mod fuzzing_stats; pub mod program_test_client_blocking; pub mod snapshot; pub type AccountId = u8; +pub mod trident_accounts_struct; diff --git a/crates/fuzz/src/snapshot.rs b/crates/fuzz/src/snapshot.rs index 995ebcbf..1a1b77fd 100644 --- a/crates/fuzz/src/snapshot.rs +++ b/crates/fuzz/src/snapshot.rs @@ -98,7 +98,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 +117,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/fuzz/src/trident_accounts_struct.rs b/crates/fuzz/src/trident_accounts_struct.rs new file mode 100644 index 00000000..f60efd64 --- /dev/null +++ b/crates/fuzz/src/trident_accounts_struct.rs @@ -0,0 +1,759 @@ +use anchor_syn::{AccountField, AccountTy}; +use convert_case::{Case, Casing}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use syn::parse::{Parse, ParseStream}; +use syn::{Ident, ItemStruct, Result as ParseResult}; + +pub 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, + )?)) + } +} + +pub 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 + } + } +} +pub 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 + } +} + +pub 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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref(); + } + } else { + quote! { + let #f_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::from_account_info) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_client::fuzzing::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.to_string().to_case(Case::Snake) + ), + 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/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 509c99d4..3cf2473e 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 @@ -12,6 +12,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(); @@ -58,6 +59,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-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 02f46014..5bc89c18 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -391,6 +391,7 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", + "trident-client", ] [[package]] @@ -1180,6 +1181,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" @@ -6308,6 +6318,7 @@ dependencies = [ "thiserror", "tokio", "toml 0.5.11", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6315,6 +6326,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6349,6 +6370,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", 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 b8210d00..ad9259e6 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,13 +9,15 @@ crate-type = ["cdylib", "lib"] name = "arbitrary_limit_inputs_5" [features] -default = [] +default = ["trident-fuzzing"] cpi = ["no-entrypoint"] no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +trident-fuzzing = ["trident-client"] [dependencies] anchor-lang = "0.30.1" anchor-spl = "0.30.1" +trident-client = { path = "../../../../../crates/client", optional = true } 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..4da9fe6a 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 @@ -3,6 +3,8 @@ use anchor_spl::token::{ set_authority, transfer, Mint, SetAuthority, Token, TokenAccount, Transfer, }; +use trident_client::fuzzing::AccountsSnapshots; + use crate::state::Escrow; use crate::VestingError; @@ -61,7 +63,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..ce146e32 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_client::fuzzing::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/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 129df822..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_lang::prelude::*; -use anchor_spl::token::{Mint, Token, TokenAccount}; -use arbitrary_limit_inputs_5::ID as PROGRAM_ID; -use trident_client::fuzzing::{anchor_lang, 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 e233562a..a8c51b00 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,5 +1,6 @@ pub mod arbitrary_limit_inputs_5_fuzz_instructions { - use crate::accounts_snapshots::*; + use arbitrary_limit_inputs_5::instructions::initialize::trident_fuzz_init_vesting_snapshot::InitVestingSnapshot; + use arbitrary_limit_inputs_5::instructions::withdraw::trident_fuzz_withdraw_unlocked_snapshot::WithdrawUnlockedSnapshot; use solana_sdk::native_token::LAMPORTS_PER_SOL; use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; use trident_client::fuzzing::*; 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 446ca549..1548b67d 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 @@ -3,7 +3,6 @@ use arbitrary_limit_inputs_5::ID as PROGRAM_ID; use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::FuzzInstruction; use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; use trident_client::fuzzing::*; -mod accounts_snapshots; mod fuzz_instructions; const PROGRAM_NAME: &str = "arbitrary_limit_inputs_5"; 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 86e3ecb2..22a852d9 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 @@ -9,6 +9,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(); 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 c95cb226..5d93dc8a 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,7 @@ +use anchor_lang::prelude::*; use anchor_spl::token::{Mint, Token, TokenAccount}; use incorrect_integer_arithmetic_3::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; -use anchor_lang::prelude::*; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, @@ -23,6 +23,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(); @@ -115,6 +116,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(); 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 cf102ee4..48c6f844 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 @@ -24,6 +24,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(); @@ -70,6 +71,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(); @@ -127,6 +129,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 +153,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/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 89c6e088..cc8aef74 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,6 @@ -use unauthorized_access_2::ID as PROGRAM_ID; -use trident_client::fuzzing::{anchor_lang, FuzzingError}; use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; +use unauthorized_access_2::ID as PROGRAM_ID; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub escrow: Option>, @@ -13,6 +13,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(); @@ -59,6 +60,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(); 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 ea5d9721..2042ddd2 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 @@ -12,6 +12,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(); @@ -58,6 +59,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(); From d8c7eddb0180be13304f9016500ecf6dac94ca13 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 6 Jul 2024 23:21:12 +0200 Subject: [PATCH 41/56] =?UTF-8?q?=F0=9F=94=A5=20Remove=20localnet=20subcom?= =?UTF-8?q?mand?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/cli/src/command.rs | 3 --- crates/cli/src/command/localnet.rs | 15 --------------- crates/cli/src/lib.rs | 3 --- 4 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 crates/cli/src/command/localnet.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c839c7c..0da2a630 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) - feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) - del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - feat/fuzzing moved to separate crate trident-fuzz ([#175](https://github.com/Ackee-Blockchain/trident/pull/175)) diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index 44694d4e..a6f4a400 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -10,9 +10,6 @@ pub use fuzz::{fuzz, FuzzCommand}; mod test; pub use test::test; -mod localnet; -pub use localnet::localnet; - mod init; pub use init::{init, TestsType}; diff --git a/crates/cli/src/command/localnet.rs b/crates/cli/src/command/localnet.rs deleted file mode 100644 index cae67c5a..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::___private::Commander; - -#[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/lib.rs b/crates/cli/src/lib.rs index f1173b00..d3859333 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -45,8 +45,6 @@ enum Command { #[clap(subcommand)] subcmd: FuzzCommand, }, - /// Run local test validator - Localnet, /// Initialize test environment Init { /// Specifies the types of tests for which the frameworks should be initialized. @@ -66,7 +64,6 @@ 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::Init { tests_type } => command::init(tests_type).await?, Command::Clean => command::clean().await?, } From 7df286386a3774aee47a833a1a9e1db96b079174 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 10 Jul 2024 11:25:31 +0200 Subject: [PATCH 42/56] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Remove=20anchor-spl?= =?UTF-8?q?=20from=20dependencies=20and=20bump=20some=20dependecies=20down?= =?UTF-8?q?=20so=20Trident=20so=20isntallation=20is=20not=20resolving=20so?= =?UTF-8?q?lana=20v2.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1352 ++++++++++++++++---------------------- Cargo.toml | 7 +- crates/client/Cargo.toml | 1 - 3 files changed, 584 insertions(+), 776 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9c043fe..ab61384e 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,7 +69,7 @@ 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", ] @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" 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", @@ -257,36 +263,47 @@ dependencies = [ "anchor-derive-serde", "anchor-derive-space", "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 2.3.0", - "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", @@ -372,9 +389,9 @@ 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" @@ -440,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", @@ -463,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", @@ -492,7 +509,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -592,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", @@ -615,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]] @@ -637,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", @@ -680,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" @@ -697,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", ] @@ -715,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", @@ -818,7 +844,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "syn_derive", ] @@ -868,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", @@ -879,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", @@ -895,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" @@ -929,13 +955,13 @@ dependencies = [ [[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]] @@ -946,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" @@ -973,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", ] @@ -992,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", ] @@ -1015,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]] @@ -1037,9 +1064,9 @@ 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", @@ -1047,7 +1074,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -1131,7 +1158,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1170,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", ] @@ -1258,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", ] @@ -1295,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" @@ -1381,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]] @@ -1405,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]] @@ -1430,13 +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", + "syn 2.0.70", ] [[package]] @@ -1446,7 +1473,7 @@ 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", @@ -1455,9 +1482,9 @@ dependencies = [ [[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" @@ -1477,7 +1504,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -1516,7 +1543,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1616,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]] @@ -1645,7 +1672,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1709,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" @@ -1727,9 +1754,9 @@ 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", ] @@ -1745,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]] @@ -1760,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]] @@ -1788,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", @@ -1804,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" @@ -1842,15 +1869,15 @@ 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", @@ -1942,7 +1969,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1959,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" @@ -2017,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", @@ -2030,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" @@ -2053,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", @@ -2063,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", ] @@ -2108,9 +2135,9 @@ dependencies = [ [[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" @@ -2138,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" @@ -2192,9 +2219,9 @@ dependencies = [ [[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", @@ -2214,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" @@ -2232,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", @@ -2344,9 +2371,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" @@ -2360,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]] @@ -2383,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", ] @@ -2402,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", ] @@ -2418,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", ] @@ -2466,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]] @@ -2543,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", @@ -2565,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" @@ -2580,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", @@ -2590,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", @@ -2600,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" @@ -2648,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", ] @@ -2681,18 +2708,18 @@ 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", @@ -2803,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", ] @@ -2847,7 +2873,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2861,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", @@ -2884,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", ] @@ -2897,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", ] @@ -2928,7 +2954,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2940,7 +2966,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2951,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", ] @@ -2975,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" @@ -3041,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", @@ -3051,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" @@ -3118,29 +3144,29 @@ dependencies = [ [[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" @@ -3249,12 +3275,12 @@ 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]] @@ -3349,7 +3375,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3469,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]] @@ -3492,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", @@ -3531,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", @@ -3556,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", @@ -3567,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", @@ -3610,7 +3645,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tower-service", "url", "wasm-bindgen", @@ -3643,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", @@ -3686,7 +3721,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.50", + "syn 2.0.70", "unicode-ident", ] @@ -3702,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" @@ -3732,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", @@ -3745,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", @@ -3788,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" @@ -3839,7 +3874,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3854,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", @@ -3867,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", @@ -3877,9 +3912,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", ] @@ -3895,38 +3930,38 @@ dependencies = [ [[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", @@ -3961,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", @@ -4002,7 +4037,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -4088,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", ] @@ -4128,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.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0acf51e7100ff312eb16c3e0f30eb82bc23de071db542c530dcb240c50239f" +checksum = "4973213a11c2e1b924b36e0c6688682b5aa4623f8d4eeaa1204c32cee524e6d6" dependencies = [ "Inflector", "base64 0.21.7", @@ -4160,18 +4195,18 @@ dependencies = [ "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", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", "thiserror", "zstd", ] [[package]] name = "solana-accounts-db" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06cc0b58c9ddb9f978ffd116728235841a3d5c35eda1bbf605d5c7eb62c7ba0e" +checksum = "74c06263320e399af20d46c8cebea7a1d5dc1bc56f31f8dfaacf7119576c48a7" dependencies = [ "arrayref", "bincode", @@ -4230,9 +4265,9 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbd31eb27345b689f1a10763a2b6686c304fe52567c5e6f0dfedf06449211dd" +checksum = "f4e57cb8f2e90361280b246f70bb7f5f86f4e4ff1ad5bbdfe18a81bea141f03a" dependencies = [ "bincode", "bytemuck", @@ -4251,9 +4286,9 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c8f3d14fbd3930a0d9c25fec5d6bd7f4e58eb63a12a2c52ce310168dddaf9d" +checksum = "7c65a9540370523f3ade7190526309337cc50f1d742b3341dfa7357da3f59a56" dependencies = [ "borsh 1.5.1", "futures", @@ -4268,9 +4303,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36b985636656b6ab830523f8340ab0b272f192148b2c92c5e7dbf4c60d70273" +checksum = "62b1dc20a7a71cf37bcbc2a3a5dfd73d7410a13850aa68d954a9c09e6a77e652" dependencies = [ "serde", "solana-sdk", @@ -4279,9 +4314,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f060504addd1cf57f45c63b44a674666117c482b1d6d39bdf293f7efc88b9638" +checksum = "d449d55d3c5c3fe4c9f0c9f790a9feabe294f8ff0b4c6b771a20b2313ad8974a" dependencies = [ "bincode", "crossbeam-channel", @@ -4299,9 +4334,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6ade96d078ce636533e5f2a96da651120da334a0af9eed6160e12c3b96035a" +checksum = "6b1a55b8533f2dc716602e7c1b2bd555d5ac598ef6e80d28a517e6f31baf042e" dependencies = [ "bincode", "byteorder", @@ -4318,9 +4353,9 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31233a00b12c799c7bd93518394fbb1d168a9a86eca6f3d7e404ca03cdace04" +checksum = "fda213af7ae26ce249120f211060d2a85d87fe367c6490ee19b70845cbd320fc" dependencies = [ "bv", "bytemuck", @@ -4336,9 +4371,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe1de38b51034aa407fdf5579935c8e7a5e43d18d294cc76230080dbcfa2bbee" +checksum = "909f4553d0b31bb5b97533a6b64cc321a4eace9112d6efbabcf4408ea1b3f1db" dependencies = [ "chrono", "clap 2.34.0", @@ -4353,9 +4388,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a53a51ccf2a444403d9d7f15b736be8571b47bb57b0dd66e35d31b16b087448" +checksum = "2242c4a0776cdaec1358d0ffc61b32131985a7b2210c491fa465d28c313eb880" dependencies = [ "dirs-next", "lazy_static", @@ -4369,9 +4404,9 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3ea750256172de8da64ed27412413d9d13fe247a3746d3271254b58e3d77aa" +checksum = "bada4ba96ef2f351363ba64ce4f592bc584ac48bb7d9da4e41303416b0a21026" dependencies = [ "Inflector", "base64 0.21.7", @@ -4396,16 +4431,16 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790ce6ac8ad0f7e3531327a7ea486433ea2d9513bbaa9e51f9ce9c687aa5c687" +checksum = "c5cc431df6cc1dd964134fa4ec7df765d3af3fae9c2148f96a3c4fb500290633" dependencies = [ "async-trait", "bincode", "dashmap", "futures", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "indicatif", "log", "quinn", @@ -4429,9 +4464,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc0d9facac6c11c0fcd565f20ec6855b7728133956ac7e71475badb04e313b3" +checksum = "9eb36ef3c3a1f38515c1ae0d255c4d6e5e635a856ac2aa1cd5f892b3db58e857" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4439,9 +4474,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56db52d5c4faa7dba6dd0d82deb89d1b442524ea241b8d88940efae656236009" +checksum = "e38b040d3a42e8f7d80c4a86bb0d49d7aed663b56b0fe0ae135d2d145fb7ae3a" dependencies = [ "bincode", "chrono", @@ -4453,15 +4488,15 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc24ca8cdf265fe38e4f43ba8d3a97368a8269a59b6e7b9be097b54a19565359" +checksum = "ae02622c63943485f0af3d0896626eaf6478e734f0b6bc61c7cc5320963c6e75" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "log", "rand 0.8.5", "rayon", @@ -4475,9 +4510,9 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10d6e9e0f0afbdbc839c4a10b1c8b34361e4a8bbe608cb2e0c3d036b02a6344" +checksum = "838532d8437d00958621d2589d6033e9c69ea95cd0936efa8964146e49dcff53" dependencies = [ "lazy_static", "log", @@ -4499,9 +4534,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5fa9c8e908d743fc4b446c675d15f8290b1a400d84640f7fae6256aeea4815d" +checksum = "4867f66e9527fa44451c861c1dc6d9b2a7c7a668d7c6a297cdefbe39f4395b33" dependencies = [ "block-buffer 0.10.4", "bs58 0.4.0", @@ -4524,21 +4559,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "207d87baccbc41473f151443b8d2b8f8ba85ace1b05bef368a2cbe0858ae6a77" +checksum = "168f24d97347b85f05192df58d6be3e3047a4aadc4001bc1b9e711a5ec878eea" dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] name = "solana-loader-v4-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c8569a2fa9f9a7ec2f3760a0d4764543963a72fbd57dde91a0b2cdd9533354" +checksum = "98c426482234b7c267a5e0dfa8198442e1ffad2ad6c521f6b810949bc2719215" dependencies = [ "log", "solana-measure", @@ -4549,9 +4584,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5540574de96cac634cb9c82ba7635aab00cbc37a277d36fa1d491a43f3d6e5f8" +checksum = "a0511082fc62f2d086520fff5aa1917c389d8c840930c08ad255ae05952c08a2" dependencies = [ "env_logger", "lazy_static", @@ -4560,9 +4595,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9c106b7bb39e23d9fddafababe5b7e489cad207a5bd6e06d46e66f9c88647fe" +checksum = "be55a3df105431d25f86f2a7da0cbbde5f54c1f0782ca59367ea4a8037bc6797" dependencies = [ "log", "solana-sdk", @@ -4570,9 +4605,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4899f40673b3a7fa556839338814a462889a283d45ad7a84922ed0ed84dba72f" +checksum = "ddec097ed7572804389195128dbd57958b427829153c6cd8ec3343c86fe3cd22" dependencies = [ "crossbeam-channel", "gethostname", @@ -4585,9 +4620,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb6c23a2a7af5d49c843b005c02721478d2befb0844e4337239919efa1b8618f" +checksum = "258fa7c29fb7605b8d2ed89aa0d43c640d14f4147ad1f5b3fdad19a1ac145ca5" dependencies = [ "bincode", "clap 3.2.25", @@ -4613,9 +4648,9 @@ checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" [[package]] name = "solana-perf" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9ec5d17735265dadcdf7eae04276370cc8570945cc47a04a7972b0752897546" +checksum = "ca422edcf16a6e64003ca118575ea641f7b750f14a0ad28c71dd84f33dcb912a" dependencies = [ "ahash 0.8.11", "bincode", @@ -4642,9 +4677,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0175aa736ef2bac329de17727b783fbc7c83dee182a0fbb5c8b45316c22cae" +checksum = "2bc5a636dc75e5c25651e34f7a36afc9ae60d38166687c5b0375abb580ac81a2" dependencies = [ "ark-bn254", "ark-ec", @@ -4652,7 +4687,7 @@ 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", @@ -4664,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", @@ -4672,8 +4707,8 @@ dependencies = [ "libsecp256k1", "light-poseidon", "log", - "memoffset 0.9.0", - "num-bigint 0.4.4", + "memoffset 0.9.1", + "num-bigint 0.4.6", "num-derive 0.4.2", "num-traits", "parking_lot", @@ -4697,9 +4732,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "983f4b793c1cb5186d2a2ed1ea460733972d294d972982a1943ab2bf6c6a218a" +checksum = "bf373c3da0387f47fee4c5ed2465a9628b9db026a62211a692a9285aa9251544" dependencies = [ "base64 0.21.7", "bincode", @@ -4725,9 +4760,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df36e5e37b2166723be77d4f6aae79a22251344f6bc7b92b96fd45e230ab943" +checksum = "9194b8744c5b135401ab4a2923a1072d3a67697bd50f7450a4ed5302f36a6999" dependencies = [ "assert_matches", "async-trait", @@ -4755,9 +4790,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8dee0de77fe38ecc41384ba8fe058c04c213d0ae6feaec94e08d4b286f43da" +checksum = "97b9abc76168d19927561db6a3685b98752bd0961b4ce4f8b7f85ee12238c017" dependencies = [ "crossbeam-channel", "futures-util", @@ -4780,9 +4815,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27f714d0c54b430ba97381053f3b2da7b5ada642dbe799dabe8546772573f85" +checksum = "7952c5306a0be5f5276448cd20246b31265bfa884f29a077a24303c6a16aeb34" dependencies = [ "async-mutex", "async-trait", @@ -4807,9 +4842,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40d1d7ad73ff88642e978b35ec404fb932e6499e6c5061cb53e33423bc157ac" +checksum = "a4fa0cc66f8e73d769bca2ede3012ba2ef8ab67963e832808665369f2cf81743" dependencies = [ "lazy_static", "num_cpus", @@ -4817,9 +4852,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be0a98dbe7fbb6ce2b3343f2aceb5fdd8f94ce7672d01201f50bef83b8af009" +checksum = "289803796d4ff7b4699504d3ab9e9d9c5205ea3892b2ebe397b377494dbd75d4" dependencies = [ "console", "dialoguer", @@ -4836,9 +4871,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5240a1e261c4cf8261206b76d9710f1e7b26c7b2af1e4ee7b84592c298ad9f1" +checksum = "6cb55a08018776a62ecff52139fbcdab1a7baa4e8f077202be58156e8dde4d5f" dependencies = [ "async-trait", "base64 0.21.7", @@ -4862,9 +4897,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "023317ad467034ac4bd4ea01a95c206018a123af97814c40a5035bf9e0c4f082" +checksum = "72a8403038f4d6ab65bc7e7afb3afe8d9824c592232553c5cef55cf3de36025d" dependencies = [ "base64 0.21.7", "bs58 0.4.0", @@ -4878,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.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed8e4e5066a27c1f9b095cfc4b034860717ba0af079e975848daf58d304b81c2" +checksum = "4caca735caf76d51c074c3bacbfe38094bf7f92cfbe7b5b13f3bc4946e64f889" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4897,9 +4932,9 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d247839cedb3581fc3b21bfff7cca1a817fbcb5b5a1297bfff2d136a038468b6" +checksum = "b699943045665038bfa4e76dd2582b4c390f1aec6ab5edef36da43afe3469f1d" dependencies = [ "aquamarine", "arrayref", @@ -4974,14 +5009,14 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0cf4419ab0807e6d7d27b7e45c0b3996caf5c2f40d6b920ce797593f96041be" +checksum = "df43d3a1e1637397ab43cbc216a5a8f977ec8a3cc3f3ae8c3851c83a3255dbcf" dependencies = [ "assert_matches", "base64 0.21.7", "bincode", - "bitflags 2.4.2", + "bitflags 2.6.0", "borsh 1.5.1", "bs58 0.4.0", "bytemuck", @@ -5029,15 +5064,15 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a19fb7874415de034a3067a71447a376be204be8f0a84a2861a65bbdb2286dd" +checksum = "86c76414183a325038ff020b22c07d1e9d2da0703ddc0244acfed37ee2921d96" dependencies = [ "bs58 0.4.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5048,9 +5083,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc21bd9a0b95931b422d32a90db7068490ff68ecfe388c79aedceb763a48f341" +checksum = "e056d865d22548bb7228121e118aa632486fc1a33a100961e5e98b5663371384" dependencies = [ "crossbeam-channel", "log", @@ -5064,9 +5099,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bde9fe6d14e70e85b81061e222189a368c655f1af956dac8f658748cf7fdab1" +checksum = "c5dd1bc07beb75da5df5e07301d3d0d6104872c9afade22b910af9061fb4bc15" dependencies = [ "bincode", "log", @@ -5079,16 +5114,16 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18342730db0c08836134b226c938e380039feb219e0502a55fd5c1df793a178" +checksum = "fad1bdb955ec6d23a1dbf87e403ff3e610d68616275693125a893d7ed4b2d323" dependencies = [ "async-channel", "bytes", "crossbeam-channel", "futures-util", "histogram", - "indexmap 2.2.3", + "indexmap 2.2.6", "itertools", "libc", "log", @@ -5101,6 +5136,7 @@ dependencies = [ "rand 0.8.5", "rcgen", "rustls", + "smallvec", "solana-metrics", "solana-perf", "solana-sdk", @@ -5111,9 +5147,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71aa5503922fd7116d09367b8acdc6f5375af22db4a01a084427d29655cd230a" +checksum = "78733745268c96d5a29c09cde9f0a6c9d662abba43e661b75dd858da8e3d0b2e" dependencies = [ "bincode", "log", @@ -5125,9 +5161,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a380d99338995b308f4ecb06086a460f9b99a26ed801bb1b2f1a426764c1ed40" +checksum = "bc301310ba0755c449a8800136f67f8ad14419b366404629894cd10021495360" dependencies = [ "bincode", "log", @@ -5140,14 +5176,14 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dd5d6a503da75fad16547c57bd7e919b2aa6ad6d73986cb8a3e76edf97acdc" +checksum = "fb887bd5078ff015e103e9ee54a6713380590efa8ff1804b3a653f07188928c6" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "indicatif", "log", "rayon", @@ -5164,9 +5200,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "892ec130ff5761ef96a271a9367cb1f3cdf64f70ec133331c491253e91d236aa" +checksum = "4a0cdfdf63192fb60de094fae8e81159e4e3e9aac9659fe3f9ef0e707023fb32" dependencies = [ "Inflector", "base64 0.21.7", @@ -5180,18 +5216,18 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account 2.3.0", + "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.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f6a9d9e77cfd897dda8a26c2faaf75850ecc8204b871a62eeb61819aa3d882" +checksum = "3ea0d6d8d66e36371577f51c4d1d6192a66f1fa4efe7161a36d94677640dcadb" dependencies = [ "async-trait", "solana-connection-cache", @@ -5204,9 +5240,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0785c3b70924eda59d5369ada65c1676d7bb15bdfe0d60c56a343b640fd388a" +checksum = "6f4c2f531c22ce806b211118be8928a791425f97de4592371fb57b246ed33e34" dependencies = [ "log", "rustc_version", @@ -5220,9 +5256,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c5d83aa3fe3a2c9a6d274604fc9752fdd747febd8d3e6340f2b2355c5b7edc" +checksum = "28ab95a5d19ff0464def1777adaae5a74e1edc9e6818103064c18fdc2643f6cb" dependencies = [ "crossbeam-channel", "itertools", @@ -5239,9 +5275,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5efdfa03b77da6b38a2039758af252c6a32154a3b564d1dc5de85e36742c462" +checksum = "6d8a6486017e71a3714a8e1a635e17209135cc20535ba9808ccf106d80ff6e8b" dependencies = [ "bincode", "log", @@ -5261,9 +5297,9 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f59fb5bca66781c5ab44019821f33e83d66e1b54e65b736cfe9542e3dd2ab527" +checksum = "f1e3dfb2deb449f7eb1dbd0c7e66dd95ec7b1303a5788673f9fbc9b5a5ea59f2" dependencies = [ "bytemuck", "num-derive 0.4.2", @@ -5275,9 +5311,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.18.10" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b24acce0cfccafd57d558884d46a153400d3125e00ca802c02071a21cafcbb61" +checksum = "513407f88394e437b4ff5aad892bc5bf51a655ae2401e6e63549734d3695c46f" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -5355,23 +5391,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", - "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", + "spl-token-2022", "thiserror", ] @@ -5383,18 +5403,7 @@ checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", "solana-program", - "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", + "spl-discriminator-derive", ] [[package]] @@ -5404,19 +5413,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn 0.1.2", - "syn 2.0.50", -] - -[[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.50", + "spl-discriminator-syn", + "syn 2.0.70", ] [[package]] @@ -5428,20 +5426,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.50", - "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.50", + "syn 2.0.70", "thiserror", ] @@ -5464,20 +5449,7 @@ dependencies = [ "bytemuck", "solana-program", "solana-zk-token-sdk", - "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", + "spl-program-error", ] [[package]] @@ -5489,20 +5461,7 @@ 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.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", + "spl-program-error-derive", "thiserror", ] @@ -5515,33 +5474,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.50", -] - -[[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.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 0.1.0", - "spl-pod 0.1.0", - "spl-program-error 0.3.0", - "spl-type-length-value 0.3.0", + "syn 2.0.70", ] [[package]] @@ -5552,24 +5485,10 @@ 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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" -dependencies = [ - "bytemuck", - "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", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -5587,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 0.1.0", - "spl-token", - "spl-token-metadata-interface 0.2.0", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value 0.3.0", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5624,36 +5521,12 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod 0.1.0", + "spl-pod", "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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" -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.2", - "spl-token", - "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", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", "thiserror", ] @@ -5665,22 +5538,9 @@ 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.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", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -5691,40 +5551,10 @@ 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.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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -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.4.0", - "spl-type-length-value 0.3.0", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -5736,27 +5566,11 @@ 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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "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", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", ] [[package]] @@ -5767,22 +5581,9 @@ 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.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", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -5803,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" @@ -5850,9 +5657,9 @@ 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", @@ -5868,7 +5675,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5912,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", @@ -5958,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", @@ -6012,7 +5819,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -6023,7 +5830,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "test-case-core", ] @@ -6044,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]] @@ -6074,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", @@ -6095,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", @@ -6124,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", ] @@ -6139,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", @@ -6158,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]] @@ -6195,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", @@ -6236,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]] @@ -6260,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" @@ -6270,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", ] @@ -6281,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", ] @@ -6312,7 +6118,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -6367,7 +6173,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6397,7 +6202,7 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account 3.0.2", + "spl-associated-token-account", "spl-token", "syn 1.0.109", "thiserror", @@ -6545,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" @@ -6576,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" @@ -6604,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", @@ -6651,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", @@ -6682,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", @@ -6692,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", @@ -6719,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", @@ -6729,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", @@ -6789,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]] @@ -6808,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]] @@ -6826,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]] @@ -6846,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]] @@ -6867,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" @@ -6879,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" @@ -6891,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" @@ -6903,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" @@ -6915,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" @@ -6927,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" @@ -6939,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" @@ -7008,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]] @@ -7043,7 +6855,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -7067,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 43dae98c..72e56de1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,6 @@ resolver = "1" # ANCHOR anchor-client = ">=0.29.0" anchor-syn = ">=0.29.0" -anchor-spl = ">=0.29.0" anchor-lang = ">=0.29.0" @@ -21,7 +20,5 @@ 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 = "3.0.2", features = [ - "no-entrypoint", -] } -spl-token = { version = "4.0.0", features = ["no-entrypoint"] } +spl-associated-token-account = { version = "2", features = ["no-entrypoint"] } +spl-token = { version = "4", features = ["no-entrypoint"] } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 07660873..648d1cdd 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -26,7 +26,6 @@ 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 = { workspace = true } anchor-lang = { workspace = true, features = ["init-if-needed"] } anchor-syn = { workspace = true } anchor-client = { workspace = true, features = ["async"] } From 9d47b27b2763a7dad754bededda451a7e2ed4ab5 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 10 Jul 2024 12:13:06 +0200 Subject: [PATCH 43/56] =?UTF-8?q?=F0=9F=92=9A=20Update=20pipelines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/actions/setup-trident/action.yml | 17 ++++++++++++++ .github/workflows/run_fuzz_example.yml | 28 +++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 .github/actions/setup-trident/action.yml 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/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index 907f6dba..2476fd28 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -13,29 +13,45 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 + - name: Set Anchor Version run: echo "ANCHOR_VERSION=0.29.0" >> $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 - - uses: Swatinem/rust-cache@v2 - name: Cache Rust and it's packages + - name: Test Fuzz working-directory: examples/fuzz-tests/unchecked-arithmetic-0 - run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 + 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 - - uses: Swatinem/rust-cache@v2 - name: Cache Rust and it's packages + - name: Test Fuzz working-directory: examples/fuzz-tests/arbitrary-limit-inputs-5 - run: cargo run --manifest-path ../../../Cargo.toml fuzz run fuzz_0 + run: trident fuzz run fuzz_0 From 08ee48687908345e6afa37fbaf52d0c8dbb459de Mon Sep 17 00:00:00 2001 From: lukacan Date: Sun, 7 Jul 2024 00:37:02 +0200 Subject: [PATCH 44/56] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Update=20init=20and?= =?UTF-8?q?=20fuzz=20add=20command=20so=20it=20support=20both=20file=20and?= =?UTF-8?q?=20macro=20options,=20update=20default=20for=20init=20to=20fuzz?= =?UTF-8?q?=20with=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + crates/cli/src/command.rs | 2 +- crates/cli/src/command/build.rs | 2 +- crates/cli/src/command/fuzz.rs | 14 ++- crates/cli/src/command/init.rs | 12 ++- crates/cli/src/lib.rs | 12 ++- .../fuzzer_generator.rs | 2 +- .../src/templates/trident-tests/test_fuzz.rs | 1 - crates/client/src/test_generator.rs | 86 ++++++++++++------- .../expected_fuzz_instructions.rs | 1 - 10 files changed, 88 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0da2a630..62ab5303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- feat/ add option to initialize Trident with Macro/File (for Snapshots) option based on preference ([179](https://github.com/Ackee-Blockchain/trident/pull/179)) - del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) - feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) - del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index a6f4a400..3dadbe8b 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -11,7 +11,7 @@ mod test; pub use test::test; 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 11a3ab4c..d005301b 100644 --- a/crates/cli/src/command/build.rs +++ b/crates/cli/src/command/build.rs @@ -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/fuzz.rs b/crates/cli/src/command/fuzz.rs index e398882f..2deae92a 100644 --- a/crates/cli/src/command/fuzz.rs +++ b/crates/cli/src/command/fuzz.rs @@ -6,6 +6,8 @@ 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 = "macro")] + 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 182f081d..e862e41a 100644 --- a/crates/cli/src/command/init.rs +++ b/crates/cli/src/command/init.rs @@ -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/lib.rs b/crates/cli/src/lib.rs index d3859333..8b4ebd95 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -1,7 +1,7 @@ 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 @@ -48,8 +48,11 @@ enum Command { /// 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 = "macro")] + snapshots_type: SnapshotsType, }, /// Removes target contents except for KeyPair and removes hfuzz_target folder Clean, @@ -64,7 +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::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/src/source_code_generators/fuzzer_generator.rs b/crates/client/src/source_code_generators/fuzzer_generator.rs index 744724a8..3b870dd7 100644 --- a/crates/client/src/source_code_generators/fuzzer_generator.rs +++ b/crates/client/src/source_code_generators/fuzzer_generator.rs @@ -214,7 +214,7 @@ pub fn generate_source_code(programs_data: &[ProgramData]) -> String { let fuzzer_module: syn::ItemMod = parse_quote! { pub mod #fuzz_instructions_module_name { use trident_client::fuzzing::*; - use crate::accounts_snapshots::*; + // use crate::accounts_snapshots::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { diff --git a/crates/client/src/templates/trident-tests/test_fuzz.rs b/crates/client/src/templates/trident-tests/test_fuzz.rs index 38f0cfa8..5940f3e5 100644 --- a/crates/client/src/templates/trident-tests/test_fuzz.rs +++ b/crates/client/src/templates/trident-tests/test_fuzz.rs @@ -1,5 +1,4 @@ use trident_client::fuzzing::*; -mod accounts_snapshots; mod fuzz_instructions; const PROGRAM_NAME: &str = "###PROGRAM_NAME###"; diff --git a/crates/client/src/test_generator.rs b/crates/client/src/test_generator.rs index 73bce8e7..adea9d14 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -120,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) } } @@ -133,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. @@ -150,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. @@ -420,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); @@ -473,6 +465,48 @@ impl TestGenerator { self.create_directory(&new_fuzz_test_dir).await?; + // create fuzz file + self.initialize_fuzz(&new_fuzz_test_dir).await?; + + // create fuzz instructions file + self.initialize_fuzz_instructions(&new_fuzz_test_dir) + .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"); + + self.create_file(&fuzz_tests_manifest_path, cargo_toml_content) + .await?; + + self.add_bin_target(&fuzz_tests_manifest_path, &new_fuzz_test, &new_bin_target) + .await?; + self.add_program_dependencies(&fuzz_dir_path, "dependencies", None) + .await?; + + self.add_workspace_member(&format!( + "{TESTS_WORKSPACE_DIRECTORY}/{FUZZ_TEST_DIRECTORY}", + )) + .await?; + } + + #[throws] + pub async fn initialize_fuzz(&self, new_fuzz_test_dir: &Path) { + 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_test_path = new_fuzz_test_dir.join(FUZZ_TEST); let fuzz_test_content = load_template!("/src/templates/trident-tests/test_fuzz.rs"); @@ -489,16 +523,20 @@ impl TestGenerator { self.create_file(&fuzz_test_path, &fuzz_test_content) .await?; + } - // create fuzz instructions file + #[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?; + } - // // create accounts_snapshots file + #[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)?; @@ -506,22 +544,6 @@ impl TestGenerator { self.create_file(&accounts_snapshots_path, &fuzzer_snapshots) .await?; - - let cargo_toml_content = - load_template!("/src/templates/trident-tests/Cargo_fuzz.toml.tmpl"); - - self.create_file(&fuzz_tests_manifest_path, cargo_toml_content) - .await?; - - self.add_bin_target(&fuzz_tests_manifest_path, &new_fuzz_test, &new_bin_target) - .await?; - self.add_program_dependencies(&fuzz_dir_path, "dependencies", None) - .await?; - - self.add_workspace_member(&format!( - "{TESTS_WORKSPACE_DIRECTORY}/{FUZZ_TEST_DIRECTORY}", - )) - .await?; } /// Add/Update .program_client diff --git a/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs b/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs index 7e57e566..54869f27 100644 --- a/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs +++ b/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs @@ -1,5 +1,4 @@ pub mod fuzz_example3_fuzz_instructions { - use crate::accounts_snapshots::*; use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { From c05b1239ac6fea4ea0a0fdfaf630c0a73c321ea5 Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 11 Jul 2024 10:10:29 +0200 Subject: [PATCH 45/56] =?UTF-8?q?=F0=9F=94=A5=20Remove=20trident-fuzzing?= =?UTF-8?q?=20feature=20for=20now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/templates/trident-tests/test_fuzz.rs | 4 + crates/fuzz/src/trident_accounts_struct.rs | 2 +- .../arbitrary-custom-types-4/Cargo.lock | 147 ++++-------------- .../arbitrary-limit-inputs-5/Cargo.lock | 3 +- .../arbitrary-limit-inputs-5/Cargo.toml | 5 +- examples/fuzz-tests/hello_world/Cargo.lock | 147 ++++-------------- .../incorrect-integer-arithmetic-3/Cargo.lock | 74 ++++----- .../incorrect-ix-sequence-1/Cargo.lock | 147 ++++-------------- .../unauthorized-access-2/Cargo.lock | 147 ++++-------------- 9 files changed, 169 insertions(+), 507 deletions(-) diff --git a/crates/client/src/templates/trident-tests/test_fuzz.rs b/crates/client/src/templates/trident-tests/test_fuzz.rs index 5940f3e5..83e3bcae 100644 --- a/crates/client/src/templates/trident-tests/test_fuzz.rs +++ b/crates/client/src/templates/trident-tests/test_fuzz.rs @@ -1,6 +1,10 @@ use trident_client::fuzzing::*; mod fuzz_instructions; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +// mod accounts_snapshots; + const PROGRAM_NAME: &str = "###PROGRAM_NAME###"; struct MyFuzzData; diff --git a/crates/fuzz/src/trident_accounts_struct.rs b/crates/fuzz/src/trident_accounts_struct.rs index f60efd64..1df93289 100644 --- a/crates/fuzz/src/trident_accounts_struct.rs +++ b/crates/fuzz/src/trident_accounts_struct.rs @@ -714,7 +714,7 @@ fn generate(accs: &TridentAccountsStruct) -> proc_macro2::TokenStream { }); quote! { - #[cfg(feature = "trident-fuzzing")] + // #[cfg(feature = "trident-fuzzing")] pub mod #module_name{ #[cfg(target_os = "solana")] compile_error!("Do not use fuzzing with Production Code"); diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index bf55e703..504a5c95 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -266,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 4.0.0", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1134,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" @@ -2793,15 +2789,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2820,18 +2807,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4061,8 +4036,8 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4780,7 +4755,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5085,8 +5060,8 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5257,8 +5232,8 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5344,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" @@ -5372,21 +5333,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "thiserror", -] - [[package]] name = "spl-token" version = "4.0.0" @@ -5402,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 4.0.0", - "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" @@ -5440,10 +5364,10 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token 4.0.0", + "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", ] @@ -5475,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" @@ -5503,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", ] @@ -6090,7 +5998,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6120,11 +6027,12 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6132,6 +6040,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6166,6 +6084,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6177,7 +6096,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 5bc89c18..52b14861 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -6283,7 +6283,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6312,7 +6311,7 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account 3.0.2", + "spl-associated-token-account 2.3.0", "spl-token", "syn 1.0.109", "thiserror", 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 ad9259e6..71385d4f 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,15 +9,14 @@ crate-type = ["cdylib", "lib"] name = "arbitrary_limit_inputs_5" [features] -default = ["trident-fuzzing"] +default = [] cpi = ["no-entrypoint"] no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] -trident-fuzzing = ["trident-client"] [dependencies] anchor-lang = "0.30.1" anchor-spl = "0.30.1" -trident-client = { path = "../../../../../crates/client", optional = true } +trident-client = { path = "../../../../../crates/client" } diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index cc3414db..010ab490 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -266,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 4.0.0", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1127,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" @@ -2793,15 +2789,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2820,18 +2807,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4061,8 +4036,8 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4780,7 +4755,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5085,8 +5060,8 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5257,8 +5232,8 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5344,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" @@ -5372,21 +5333,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "thiserror", -] - [[package]] name = "spl-token" version = "4.0.0" @@ -5402,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 4.0.0", - "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" @@ -5440,10 +5364,10 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token 4.0.0", + "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", ] @@ -5475,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" @@ -5503,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", ] @@ -6090,7 +5998,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6120,11 +6027,12 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6132,6 +6040,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6166,6 +6084,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6177,7 +6096,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 6f768dd0..3970c6d8 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -275,7 +275,7 @@ dependencies = [ "anchor-lang", "solana-program", "spl-associated-token-account", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 0.9.0", ] @@ -1127,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" @@ -2795,15 +2804,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2822,18 +2822,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4063,7 +4051,7 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "spl-token-group-interface", "spl-token-metadata-interface", @@ -5087,7 +5075,7 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "thiserror", ] @@ -5259,7 +5247,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", + "spl-token", "spl-token-2022 1.0.0", "thiserror", ] @@ -5374,21 +5362,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "thiserror", -] - [[package]] name = "spl-token" version = "4.0.0" @@ -5419,7 +5392,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token 4.0.0", + "spl-token", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.3.0", "spl-type-length-value", @@ -5442,7 +5415,7 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token 4.0.0", + "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", @@ -6092,7 +6065,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6122,11 +6094,12 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6134,6 +6107,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6168,6 +6151,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6179,7 +6163,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index 043a55b9..dac85b13 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -266,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 4.0.0", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1127,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" @@ -2793,15 +2789,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2820,18 +2807,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4061,8 +4036,8 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4780,7 +4755,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5085,8 +5060,8 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5257,8 +5232,8 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5344,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" @@ -5372,21 +5333,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "thiserror", -] - [[package]] name = "spl-token" version = "4.0.0" @@ -5402,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 4.0.0", - "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" @@ -5440,10 +5364,10 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token 4.0.0", + "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", ] @@ -5475,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" @@ -5503,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", ] @@ -6090,7 +5998,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6120,11 +6027,12 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6132,6 +6040,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6166,6 +6084,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6177,7 +6096,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index 11b32513..f0ed46fd 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -266,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 4.0.0", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1127,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" @@ -2786,15 +2782,6 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.6.1" @@ -2813,18 +2800,6 @@ dependencies = [ "num_enum_derive 0.7.2", ] -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "num_enum_derive" version = "0.6.1" @@ -4054,8 +4029,8 @@ dependencies = [ "serde_json", "solana-config-program", "solana-sdk", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4773,7 +4748,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5078,8 +5053,8 @@ dependencies = [ "solana-sdk", "spl-associated-token-account", "spl-memo", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5250,8 +5225,8 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-token 4.0.0", - "spl-token-2022 1.0.0", + "spl-token", + "spl-token-2022", "thiserror", ] @@ -5337,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" @@ -5365,21 +5326,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-token" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.3.3", - "num-traits", - "num_enum 0.5.11", - "solana-program", - "thiserror", -] - [[package]] name = "spl-token" version = "4.0.0" @@ -5395,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 4.0.0", - "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" @@ -5433,10 +5357,10 @@ dependencies = [ "solana-zk-token-sdk", "spl-memo", "spl-pod", - "spl-token 4.0.0", + "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", ] @@ -5468,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" @@ -5496,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", ] @@ -6083,7 +5991,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6113,11 +6020,12 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "spl-associated-token-account", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6125,6 +6033,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6159,6 +6077,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", @@ -6170,7 +6089,7 @@ dependencies = [ "solana-program-runtime", "solana-program-test", "solana-sdk", - "spl-token 3.5.0", + "spl-token", "syn 1.0.109", "thiserror", "tokio", From 396a9509294fd650e1f8d273d10be474fc0e39d9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sun, 14 Jul 2024 12:36:27 +0200 Subject: [PATCH 46/56] =?UTF-8?q?=E2=9C=A8=20Initial=20implementation=20of?= =?UTF-8?q?=20CPI=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/client/src/commander.rs | 11 + crates/client/src/lib.rs | 1 + .../src/templates/trident-tests/test_fuzz.rs | 14 +- crates/client/src/test_generator.rs | 59 +- .../fuzz/src/program_test_client_blocking.rs | 65 +- examples/fuzz-tests/simple-cpi-7/.gitignore | 8 + .../fuzz-tests/simple-cpi-7/.prettierignore | 7 + examples/fuzz-tests/simple-cpi-7/Anchor.toml | 21 + examples/fuzz-tests/simple-cpi-7/Cargo.lock | 6802 +++++++++++++++++ examples/fuzz-tests/simple-cpi-7/Cargo.toml | 12 + examples/fuzz-tests/simple-cpi-7/Trident.toml | 41 + .../simple-cpi-7/migrations/deploy.ts | 12 + examples/fuzz-tests/simple-cpi-7/package.json | 20 + .../simple-cpi-7/programs/callee/Cargo.toml | 20 + .../simple-cpi-7/programs/callee/Xargo.toml | 2 + .../simple-cpi-7/programs/callee/src/lib.rs | 22 + .../simple-cpi-7/programs/caller/Cargo.toml | 22 + .../simple-cpi-7/programs/caller/Xargo.toml | 2 + .../simple-cpi-7/programs/caller/src/lib.rs | 29 + .../simple-cpi-7/tests/simple-cpi-7.ts | 16 + .../simple-cpi-7/trident-genesis/caller.so | Bin 0 -> 194920 bytes .../trident-tests/fuzz_tests/Cargo.toml | 23 + .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 112 + .../fuzz_tests/fuzz_0/test_fuzz.rs | 45 + .../fuzz-tests/simple-cpi-7/tsconfig.json | 10 + examples/fuzz-tests/simple-cpi-7/yarn.lock | 1181 +++ 26 files changed, 8528 insertions(+), 29 deletions(-) create mode 100644 examples/fuzz-tests/simple-cpi-7/.gitignore create mode 100644 examples/fuzz-tests/simple-cpi-7/.prettierignore create mode 100644 examples/fuzz-tests/simple-cpi-7/Anchor.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/Cargo.lock create mode 100644 examples/fuzz-tests/simple-cpi-7/Cargo.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/Trident.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/migrations/deploy.ts create mode 100644 examples/fuzz-tests/simple-cpi-7/package.json create mode 100644 examples/fuzz-tests/simple-cpi-7/programs/callee/Cargo.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/programs/callee/Xargo.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/programs/callee/src/lib.rs create mode 100644 examples/fuzz-tests/simple-cpi-7/programs/caller/Cargo.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/programs/caller/Xargo.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/programs/caller/src/lib.rs create mode 100644 examples/fuzz-tests/simple-cpi-7/tests/simple-cpi-7.ts create mode 100755 examples/fuzz-tests/simple-cpi-7/trident-genesis/caller.so create mode 100644 examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/Cargo.toml create mode 100644 examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs create mode 100644 examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs create mode 100644 examples/fuzz-tests/simple-cpi-7/tsconfig.json create mode 100644 examples/fuzz-tests/simple-cpi-7/yarn.lock diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index 27208c78..6fdbd5c7 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -153,6 +153,8 @@ 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 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); @@ -190,6 +192,7 @@ impl Commander { // 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) @@ -203,6 +206,7 @@ impl Commander { } 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) @@ -233,6 +237,8 @@ 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") @@ -249,6 +255,7 @@ impl Commander { // 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) @@ -262,6 +269,7 @@ impl Commander { } 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) @@ -387,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); @@ -401,6 +411,7 @@ impl Commander { // 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/lib.rs b/crates/client/src/lib.rs index 247c328e..335c3491 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -42,6 +42,7 @@ pub mod fuzzing { 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::*; diff --git a/crates/client/src/templates/trident-tests/test_fuzz.rs b/crates/client/src/templates/trident-tests/test_fuzz.rs index 83e3bcae..c22d93fb 100644 --- a/crates/client/src/templates/trident-tests/test_fuzz.rs +++ b/crates/client/src/templates/trident-tests/test_fuzz.rs @@ -5,8 +5,6 @@ mod fuzz_instructions; // uncomment the line below // mod accounts_snapshots; -const PROGRAM_NAME: &str = "###PROGRAM_NAME###"; - struct MyFuzzData; impl FuzzDataBuilder for MyFuzzData {} @@ -14,10 +12,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!(),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 adea9d14..f502c65a 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -496,33 +496,52 @@ impl TestGenerator { #[throws] pub async fn initialize_fuzz(&self, new_fuzz_test_dir: &Path) { - let program_name = if !&self.programs_data.is_empty() { - &self - .programs_data - .first() - .unwrap() - .program_idl - .name - .snake_case - } else { + 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 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 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 ); - 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?; + self.create_file(&fuzz_test_path, &template).await?; } #[throws] diff --git a/crates/fuzz/src/program_test_client_blocking.rs b/crates/fuzz/src/program_test_client_blocking.rs index 5cc4d455..146537f8 100644 --- a/crates/fuzz/src/program_test_client_blocking.rs +++ b/crates/fuzz/src/program_test_client_blocking.rs @@ -1,3 +1,7 @@ +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; @@ -27,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()); @@ -201,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/examples/fuzz-tests/simple-cpi-7/.gitignore b/examples/fuzz-tests/simple-cpi-7/.gitignore new file mode 100644 index 00000000..28be1fa0 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-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/simple-cpi-7/.prettierignore b/examples/fuzz-tests/simple-cpi-7/.prettierignore new file mode 100644 index 00000000..41425834 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/examples/fuzz-tests/simple-cpi-7/Anchor.toml b/examples/fuzz-tests/simple-cpi-7/Anchor.toml new file mode 100644 index 00000000..4256f231 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/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-7/Cargo.lock b/examples/fuzz-tests/simple-cpi-7/Cargo.lock new file mode 100644 index 00000000..c60fc311 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/Cargo.lock @@ -0,0 +1,6802 @@ +# 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", + "trident-client", +] + +[[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 = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + +[[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-7/Cargo.toml b/examples/fuzz-tests/simple-cpi-7/Cargo.toml new file mode 100644 index 00000000..9783b3f0 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-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/simple-cpi-7/Trident.toml b/examples/fuzz-tests/simple-cpi-7/Trident.toml new file mode 100644 index 00000000..6fd20b35 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-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 = 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) +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/simple-cpi-7/migrations/deploy.ts b/examples/fuzz-tests/simple-cpi-7/migrations/deploy.ts new file mode 100644 index 00000000..82fb175f --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-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/simple-cpi-7/package.json b/examples/fuzz-tests/simple-cpi-7/package.json new file mode 100644 index 00000000..b036f2ff --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/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-7/programs/callee/Cargo.toml b/examples/fuzz-tests/simple-cpi-7/programs/callee/Cargo.toml new file mode 100644 index 00000000..73a67880 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/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-7/programs/callee/Xargo.toml b/examples/fuzz-tests/simple-cpi-7/programs/callee/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/programs/callee/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/examples/fuzz-tests/simple-cpi-7/programs/callee/src/lib.rs b/examples/fuzz-tests/simple-cpi-7/programs/callee/src/lib.rs new file mode 100644 index 00000000..c7576f3d --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/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-7/programs/caller/Cargo.toml b/examples/fuzz-tests/simple-cpi-7/programs/caller/Cargo.toml new file mode 100644 index 00000000..fc850231 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/programs/caller/Cargo.toml @@ -0,0 +1,22 @@ +[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"] } +trident-client = { path = "../../../../../crates/client" } diff --git a/examples/fuzz-tests/simple-cpi-7/programs/caller/Xargo.toml b/examples/fuzz-tests/simple-cpi-7/programs/caller/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/programs/caller/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/examples/fuzz-tests/simple-cpi-7/programs/caller/src/lib.rs b/examples/fuzz-tests/simple-cpi-7/programs/caller/src/lib.rs new file mode 100644 index 00000000..eb2dc232 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/programs/caller/src/lib.rs @@ -0,0 +1,29 @@ +use anchor_lang::prelude::*; +use callee::program::Callee; +use trident_client::fuzzing::AccountsSnapshots; + +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(AccountsSnapshots, Accounts)] +pub struct InitializeCaller<'info> { + pub signer: Signer<'info>, + pub program: Program<'info, Callee>, +} diff --git a/examples/fuzz-tests/simple-cpi-7/tests/simple-cpi-7.ts b/examples/fuzz-tests/simple-cpi-7/tests/simple-cpi-7.ts new file mode 100644 index 00000000..6da007ba --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/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-7/trident-genesis/caller.so b/examples/fuzz-tests/simple-cpi-7/trident-genesis/caller.so new file mode 100755 index 0000000000000000000000000000000000000000..e31cebeed43fc6b1ba30cdf37d9671dc74bb61be GIT binary patch literal 194920 zcmdqK31D1TbvOP-^4N+gSe7%gP%s`vwxb9{m5>BQkRoSQ48(GhiH$!Dk`-au35mwz z#JYa}QrTp2-1e&yLJ)30Dve}Ip$l#c#AWFS2;h{ZW-BgGYRYDI7but|=zo4^dGBhZ zv7C@V+Lu^&&Rxzu+dX%E_x;gTue`b}kqGQ54}KN^nz&nH+BBizXJz^;2-<>{U>^NF zE2!YSNlHm8isG<$i(L0EVOdS zjr!WPTyc0viUk%{C|r1n{0M6srtmA=*e>CkHVz9TlD>c#YM+{#3Ts;=y|J0YOxd}d z;Sov)&tYu`$3FsM0B_qM`L}gSJY_1U_+0Htfr*eb^6fjpaLrjkaAHV!r|2Nuf1Kle zIy#t+V;moDJEGy?8Tr~MUm*`HL9l>O9wzv1($5-_VJg_f@r6+if(1krB~R55eeYGB zA>|P&2NBhfQfl57(^W%8(c;0t+w<}uKnOhlljPCB@__b&AQ}8S%h8R9zQWoeg;kHW zg9?kD!`i(J$NUa69B!M?@KBWQ>)rG{n|_B$eqn71{TAudjkGX+$bHc?J|5+GHzM_i zwfzb!UA27*E4{V73JX7G$8Kbh3)9LC-TGIkpEW7pUt)r6a?;Iv(Puuz+pzz6+rHIa!cDdEMz$d&|X*5&tz~ZNBmFJ z=jX3QI~4|#!9L;t8KlpaC#cU0S)Xaq$DI0H-9jj{}%u7 zOqR#1SRM;m9?ro1;`iLh6T=hP)l$)) z852U7QZdky_I#e;D^yG9`X#^HEpRFUE~x(|e&~PVX92@*x73?S z{7U%VE%jy+zhKz(?Dh!0Oxe#kK9eAWq{rGL?9jascG#_WIS63?U-+w$Wq^Ks^QU)Ekt4q>h6 z8RHtCuCR8J`9l0pr+&T-M4fZ%z2(*(5&!KEzmYqSJ15rtU08cG%Ky$SulWY@H>~)~ zi1pJxKLcpDW5_|{u6aR#_6~U+PD8%~jK}504wBqUQM~E}^7HB0RCi4BE5Ath>DpBH zIZiLuTMenpr*qSV|HAoFIu}R=0{e7>&cb#koBQ7#q~9)WCnyIEB!ja#gPTyfYkP22 zQqCM_1UZ3oHV z1zfHxKPGY;mGhkKjB6V*C^gr$=BT|<+{~weEIZ2J|5ks*Vm+>*FLE)-_K!^ zXCq|O9^ai*9(Mky+WFgI=Q_@G`CgIN9Q;{-=0=o$okzG4vFEV%6yxa{QU3GF|EThL ziRdp}^?NL*Zk1zrCxb-KNui_qc^u(J1YcM!?bzBC^hoSXh0-j^F22X*3dMeDwc@={ z!evz?0D2$?LP6!kZ@bm%4=WUc|2~l5a3=c;ie@&;c}1A zJPKJdWqHZh&p}YwEg{-tS(?&=w@bRVKet5E(f@+JN2vWGOqJuWzzE%a_)Go1xU(QL zuZ;5nFXUpOdy~?Ck>rOzV7xScV!ZPdFDBXagjYzINhUZw8T_}%;V$L#?lfn}4m3!( z=X?qGHgcHT_ZiNgYy7l?3y*RbZagC48nu&FvmdpK{bDD+y&fYze0!fzz7p&gjxoMW zqK5r~n>fL+8#yjvkw3t=9#7aR`NCSs7wR~uxL)|V^lhqSDu?p049K-|Ir^PipbH8j zzF<9tsG^|tV!r!pq8H_W#q6P}{>3O3q!MC~$)JhhuKbsU?op+GO!+yW?O~&aYn1+0 z$=BT|<+^pg=JPRBBtOU#^#3c-Z{rV_AL4qG!ONHq^S_`U{QCG%9{i*!9(aEE{Ftvy z@N6#Ml@+__u9g11xV*2=UnxE^NyhgL!k3|yA3T0Lhlt~LE{^t0<=#{;hMh_%-o%v1 zxlG3+=W=zypHcul`Sk7ueH8hA^_Qn;>~8Z>>p$I_q`bA)utnfhSwhEgi#fvlrPF@I z)yL(inyFCzQ>L5*OpmLF^r`iwTT?E#Dh7UsMy@@87|= z@b0N4GZ|Ojz<#n*%k^?N7k}3N%}<8UuyLiUmvK~hf%?C5#cze`e~o^O8|;B6 zG(TTZ{|>)>f*c~ob$A{jzl#2?=|cP!7$L@AcnT{x;CbzdKa$_Tn<|%z))Ssngs*V9 z=A%UE*+pulbv)c zL8#*%)PoT|@bwP~jlhI@lC)43$w}DbN>HEmYlS+F;`P&SLQY7e$Hu`;byCpem(lTS zLC4LQH-FQY6ZOM*3OY`Pex}K%E|w2+LOvMTf!;=6J~1mi&WrdZ`tH~f1h-ru<74pM zo4)<^s58Cww!ZKJkssoFZcg8d_@3Lg>@Yh*eCD>Ee#H0nbW=QjJ+tj*fiD-L-yZxl zyMf*y$58FY>?M*L3A>b?OkNV(Nuge_o1M8Tk*C4X(+}Fb{B@EadOqy$BN07NA@YyB zJkD=;y6R;>Q;;A)yFyKwdDKAZSx@ED6xuv2spC}O`|j14M^XlQ0Pna8Fsw=IBiQWT z>O;Q1m&WnGN&QEP>aQrO|01t`lPBckuM>lw6s^A+oo5=lDzSU>6Heuac_#cyG@qPf zTK#25w2;@2LI>sdw?Pgx>lA%U}ITBuDk%k({kR z({>ZBtEfM>byrs>em_nZxY$mj_Nn#!_U)lf<(5hVq5vB=xW(jX=t(7Hy{M38ko#TyGCyi|_J|}?{s#V4xL6_z(rwecmloRS!8nRT zjW1|_ohp|EgWb7(?3m5|qj5yJtXFKU-^S@pHwa!=-^p;QT-GCP{cP*XUXI_|EctDG z*VMt$#K$Qf_gXyW*GMVcAathYeT~z%P&|5$Mb}HbjdvnC)sLp;>A3)-KZ^e%<4FcW zf6CSmEFU3X-f2W3^cYxp~?Z1rv?naR#!{p+cs!)pbmgOLr4G%QiR7HsCN!q@s z=Eu4qkr!M;;Q)oX+F!FC3?JyhN;uMwbGp>OlLo2t30_Yjm#1(5>AOTQP8QJzqjbH~<+pq{MbdLw zR{ckpz=b^;<|Ksuy^DUvoKEO_P8G;UiY!-pWeN9s3!XYHmyV_`f6QFBnR zeO#yXW<}r2@0Wa+bt%27&%y%|U+9()^uC>bx~ROwFVgZ6e_sA)fzGXxFMMkWI%#f) z$M%C$w!XSr=u0J5ak{%g%4f=<4H{oBxST`SGag%q4)4@@NdI_jy)YTv$T0krJ+O2e zSL0k5HxvpGZ~Kjf6an-U)=9Wr<@1P;7eMYn*|bg&n;tS8OXX^$ocW`Bwf@&>Jm^tW zTyN9v%ea6O_JU%1!`+HcL+IrzS5ZA`U&-Jc&X8Fk6(xf&vEL}h6Y&ir9uS<<_&!_W z3Rg(DTK^w0>TpZrdkHP#(*u8P4~p2l&-O=5 zzu_t=ZS*9A=W?-UKA)zS|75+)#t(AXzHro@X)O?s`C0IdeAq9*V{%xp@tK4O-u$|? z|1H#BP@?HPDQErOO0pM76zvJ2?dOb>KG09^q!9kp#`RX8t+yqq1>$kt9ME}E8OIo% zme2Ol{QZ)ngx^1RfORh4--QIbkz*_`mp{s(?OTL*iX9Zo3w9(NGCc#!>ZD)E==l<~ zo3E3PL`dkTTweCY0RPB~H@{@-X^Ui78l6vRx?E~8d7QEQuTlA5Bl3DC%l{QmllRBi}xF-Lg*P20hQ)Mt}6dICv5LhCd%F8h765ty7pjQNF3DJY0Tuu^>z( zq=QM(IU;Bb`LFZxCwY`2@t1q?pabKx!fL?-yPEISZ~JuaVoA4gzV#<5UB|Wl#I2Bg z;SCaIs9w-x_G_VANfpuKIym653-aMyH$pp?8J+W%W*cPY7wy}prGs*-(u^p3UW0@U zvJsa(SNHAfG~6xmIo-z%yQEx5`|NnabwZb|Uxq3d^KV^CI9t$DepW!+rW7t^kJ3}V ziY1&Xmwqu--p+hje+qrvUL^NwDxVDQV}w2B)x3k*Q(hlDhhkFYSFv7F<=67gGrCE5 zkTbEfOK+KOXV5R~?1X1$$>2h*_Z-HXDqqdx(Ny`BtP7v+Zxqpu9xNGb*YeNhbpUqnwGm*2+a!6%s@mAf`T7w?yQhgWYh5JQ1n(QZ=Zui*7dKmT-l zU#a+CLGM{0|8;y4#?QaXqbnJ#*ZkL!?IHj50rcbN|H-ucGC+V{K=+yGWuwOr+8voX z>*a{27qpL`k_jaPakzf{okis#2Rq;9=bOz>*tpZrH=7?w^6BvDe811DH_2L_p8iQM z9eklBC4(2y-|6|bdGbTPb2*>1N1v`gDawcTkPO7J`1$TGsu%W`43^X1>Gi(V%a^os zEigiQ&@Qj?>PvE~n_m9aUOMQ8%biUQzn)ePWu(Wax2gyahOSAr&guEySCkJk3tNx( z@qM)@A6ygc=Q^?<^H(-5u=UMM0XFkV8ZHM@TVtPR-?Id}QNT z8^0Lcuz!q8LOqvZ>)f^Jy0a?`RiCd@fIvE5#unSTl+22Bj-F6wrx=|^==|Vk6xLxG!Mg{+-3w2yA zXabkhetJyC$D6K@bA*{PctIM+R7wAwDwFn$dQmil@gvl8l*!;LOs{Xhhg6=EYQL{L zm+aTh0oi$^toHAEj?87%KJ?tN({%MZO55kZ&Cp}9 zeLf3ve~RrB>j~53t?MG;8ksM;vvvNd=PTXWYX56aGQDoGwGU~xe)}qA$Nx-zd!`*f zGK2qOJN|CnY<7I8$c|aPJeKg^D_Az;y$d;)X?71Trk(HC_byzW@Qd_m=lc^s<$A4s zJDpF|&~$3r`ToBD;(VEe^hd6v;v^_UIY_oCI`=Q@TE6^@|C=cv+W*Iy{~^Zb^!Ty<&X7@Fj`=G~B(YwowJ^1VD z|43Uy*8jNmyu3{B4a$5o)b|{-S@Glc9%NS6mF@k_Y!;(rYR|ReZ?ah#A7$^5cAV`e z2Iv7+%$u{0!C(PJK)$K7&I;N%To!zS!wZ71Q|QYXc8Ye{L-CN;+gV=XUtNBf<(3Sj zeP$|7P5p%OWs*OedOt$4gMJF_{gF)KCsX4L?^V73XzJSx_bYsIYAeHi3}YP@J!CTY zKEvTIkyE%(?8K*YlIScPpv?4uPMnZ-BkK3^lUzO-JSz26d~NELl%7fc=hP8|iLXxm zHRl&OW)lA~^^Xi2o&P?C@v<8+I=?j4&2UWTL4uRPu{r64-}32vJ}JV^ui3f2WbjVL zW9zz^vQJK3MfmM~x=h)}r@(3^@y}D35ybL6GPRCjqx+*%A7|L;espR-!!g~<2%fE< zJgR#Ca#G~^I@Y`JXX|juV875Q%dbJW=H%mq4(H`LbT^8gQuAJp=)i4IJAV^{L9SKa z=Lz>u{t7W+<6#ba%3q}O{tvJr7r;C{HvUZ|+SxO>hozj2({RoP1(E@@EA5xakL1== zC-Wz?YqSh{4~y%weT1$7#8NqFc5!_{D<@F9ll%--1_f!Zk)IMgl|i_0nDdofj|Pzg zsHteb0h29yY<+6^4uQ>&VxEMmn^q{D(%k91i@>(tgmHqBCi@C?D_D-kx2^A@o!oel z=$F(zRV?S8#B!d8rxLaNCf#iEh6hRpvVITzb)Zl8Ly|!YGXOap9bys~M!o0IRR6be z9{&ivFaZDcda4=q&L;xh_)*r6J9vb{(7_v$J;3?UV}3c6_$Bd1`DfT!Ew3|}Ug*7$ zU!xrOJnXGI(EEBEZ*r$`FvIlz9f!XEf?uHb^&&hCXqfth`u?Dw|6e%&A!&bbKJ+Xg zyFK+d=`pV`@jXc|l=%J5O47FvANs}AR5JJ!;{lzRSv9SDjNxRkmX(&>E&cNrN+%Hp z*}Hy^E7(HHNB_9?YzBku9+}Ta{|sYFrJl`?|Blh zc&y!L-z4LJwe^-y98ZLAfI3}zw$MMumj*<1+yjW>Nj^;19+{Y}-OSO!da4II$-=Fi z+hbVQTh~)#V)z=#AMO&rk-baCNsvRDlCpQBm!Nuxp9TuoUd15EE5$#MkNLhw1{9!& z>Ac$Vi6D`W=^T)S(Y0-sj#U!EuXqagYJ9&qjxAJ(@wIEb?$>T1H88#%SluGJ9+dPg zW-;?=<~0{p=)kfY%Dz0Q+H}Y^~0J?0tK)6E`gNtnH*s^gxc#UnJ)tjt*$v$n==q zyHVlC?9}CjU!*sqJdxW%;o6l}Ugb#Xz`v8ykCer1}t|IU!toC;g#kC#6HKYhS`3w}&+SoYB6_ zzfgJ9yOa3ja$BWb;UNi8j_JyOOz65?;=@Mu8xMbkNoNqQds@U*asDl*_+sX4~-&8G}Oo6nLy1wi7Rxx<9OV}_Du0c=USzY-oxSco~xB{ zdbn$x`^#|KUvfzIFK~KT`&Na8j$G{n3JaaN+BY+NOXHx%3xB!V2N}-oe~W~z4{_-C z|J<*Sf@CLhneSBMI43x5|6yY#$J4&6%Be=-6AGslKB;hn z!qR@j#tMbS&cnt)^3|T=aev{U(6NB@UpyWe#5l7nrt>3Yvp!!#;A69-i_nMerUcddfBFW@#Jx=Xq*T=S$_`s9wMA>{J6^F zn99T2%i9>QPuG!I@SRS7i&=k11aH~Bs<)#I`*;t}p|^9Ow}Xe3zBdY<@kxf0!Cg$} zQ=zBJ$%n;y5{LL?^wgnxI`0hi)IW<{p`SO9?Yi*+=F=VQm(c8!_VZ!o$>8Q0dg`48 z-|6)9Wym+*EAlN{sCw#S*w@nr)zi<4+84P1ZeQR0DcV=3(z}7f%>1(%pO2@#h`t80 z@6*wDgz0Nn`u;%a>zF}bi_%xB{eOn(Yg77K1mFCNRE{rw%IxSS>O;+rvg7BnUr#Og znb18U?cSG1MNxY{s_p%HmFrj9@SbQrdW3*$N86QIa)7ex!5_^%kG!?yf0tw z&$e^1pzvl5b^HjvpGyKXJ_>h8x*HQdY2AhK+d9=E-4BF3A=0J?WSwDw(i_QH>j~HB zxN4(}zfj+BTP!zsK;jp@RqNGpm|qW4a>6#RgF_-Fw{XAGr{yohKp5#=97N|L;g34J zbso@B|59%qP35_KtCVYc3u+-euNK(k5y?UEXU>v00JD1}UqmO_BQU@|p~obj)**bF z&-4)PQ~B%?ITUn$QrIB)K<9?GSYCy@CBC5Z5;rd8=$@osA!X5!q%T)HPM!50jxc%H z`ETe6^fgsK%znr8mJD=Uta^*u-N;_X-;=nX+pq1@MC(tho%oU6A~##7wRNDL#6B*U zN?gYD*!o;5(ZO^)75#lb#%0m?Sq%QSHGYo##5VO)(R@PMk>4I0X7Shl{itZK(EENK z&ozr&4>oX^ncw+1scxG8teFMh>H6Pe=r{84qaHyX^4%L&26d-b@S&qt~8 z)ZY`G;QL)K$9U>ZtncnxnfGN!?qxVvTj2gHx9hz!e$aJ*ur^>goNb;3xp{Vn@s!ya z-KWF!q23habnqC%nfdeBzI?iE9JYbxP08S^Qvdkz8T?tk8#v$BBmBoOPL9SqM>!t* z6&?Qjaipy05glmny+!@ol8e0l?P|(IkFA&5`Xl*imOt>`;?3L9A1tH%;1m6q+s(!4 zeIn^#+yeqHtAn-3z8#^U_9f#FcRzK2^te3|M)$1UPY5|)!swng6h{05H4?r_!cFyh zJ}R+U;-m9PGG3h~Z}Jz|M=QP$00j$oadGD7l{EBnBb96)VQsV8MTNo*3I__O6+Xpb zSS#x;*^wGeA7=R#)8WteYd{z2XRj|`YDbWijW;3Zc|=!sMC!5knUcW-OQz5(^kba+ zLi&mR5(!QBh~TXMbos?XS7V3Joj*(Ac7+oPw<-K{;j2;R2kRAYCh-6xF6Ik#P7ncI z9-YusGPsxtbR#CW4T68f+oy$xpwR z(&_w#;un47YVQ^NG#msY;kJH;!+kX;fhpXdmT+MuhoA%c2y3MuLVNJ_MgD^G`StDv zU7nw40XzomH0~q)LhrV|NBaqECy?JL(eHBfgC0kFs(7&81v*XdHopj$a5A0ue?F&M zd$iD}2YwRm_Sv*twREj%@cUd zpuh)y#bLN{FNfWYQa)_ea%(jIM#ay*UUMu!$@Au6~&jHCFqVu6A z#`}K3dq*F~yLB8yc2$bMaN&T+rLUI@gbO>AugwZ?P`FFsPK7%a?$z=e6z)^FL*agg zXVQC6=D_d47==Jh0_WTDBK|MZU&?Cyf_Df`f1%$ z+S^7Mhq*n%kgJ#cSg%38N64=*y?TBGFrILKAovdqaTu-R(7j25U(ORb?N{AhX)c$& zuR+4Q&zCT|-}CR8p4`U2lW@PBTL{-o2%W9N5;hJ=xJ~v$?3|k$5qafmbsRn-^2*ij z=KO9%up8?b@lT-t*jH$IWL9lG`&UPw8Cv#Ud9t{q+Q`k zO%D{VPh^Wb(< z-0#7UTR#VTgh|4$*HAy+HFAvoI{b7E#YgX@$Z|ZNe`%q3zdq|1UQFZP;&_|S0Dn{6 zY~v8BlpZ%>@=`ffaWuU@E`Gqy|IqsYGyAC`e!)NLtEZzQ@wi9MrMZJz&$!mJTk3%y z!?-!V&vXSRbmf1-^>sIXUG$g#9>byD@9OejSNL<9F8lRi<0lyI)_eSYxtu7P{~w`x zL2otn5$@ngwhuRcfImxF8FfNe(o92H~|CsW3K55E27WpEo1tQD}Bc#967{c*rj^Piag&Ufj4gdvd|Ze!&ROotY!^WBI`f!mvp>Ka2 zYVtiH>me%N!xDP(Arp=6+f9+dVhCmTwc}i*z@KC}KOJ^)q=*lryFgBawf8nanCg#r|a2vPYUw&rpZrAvxx4gL3|Iz zH+7yuvFP6M<+?wCaUajGHbdKTP8RT@UIwH0MxyzbiZD~QnEMORUFx2oVmTyzIgAK? z_(3QDbbNqV+o#_y8>l|i z^I4i_b&WJ|dWI$$kgOY#ew)T`>OZ7kr+K}?Z5)QRX%2n7m4w%yhi)g8xd&PZD}{Q$ zh3jH49>?mqEt;ojJ9n~d7~LC@q4%dDD$q^UF#QO-@>en)-HpPh8-1D3*LspeH+GT0 z_CCvj7Ye-bIEUShQa)_ea%(jIM#;x;t0eA)RXy_;OCBbBf|WqIqUSx5`29y(ym8mz;lX8({p=JU^Nz z{*%Z-@5`8BS7iLKm&mTr80ZOG`-NUT9~riGFr3Ar38!yRSmn{$sj$kUwO7htk=Fcu z0$-)_pt(Apc%CKuNA@0}-3N#HJ?OLZ?=$9C``Z|AxUgNqI!4Rq;!!Rcyj}R;F7>)x znlohkgwCuJ`m;NPuiTni>LybG(GVxe4n+BPY0iJNK3;YvuifY30dJ+WQfOH;LSA zUJQTwQKF+uzZZe~WMEO&e9KZ{p?hHvgL=+%JoDWm`Jz8& zr1Yn0={@|@><;ID(-gB)L;L=V-MeS^VHM}wRK;lM9zU_K?rP!7ZI*c7&M{AiJYKsT z_AKo)lNiu(jkaH%zpN~iFBE})>=(>tKjowglP~=B=Lr9056}RYo`Uwbvz1%wm80_k zER*G`hfR(SvC?DnCXD}3zulAP@~X#kIa_od2XwsjWmK+9;!%$NkH$yfgGi));Rep& z%VjUo4Zn1wXFtGqG1)rGedH|Rlh*L*Juj&r@r+-;zhw8rh5II$A3B%8A@adxMc+{+ zI8Cs9cMA68->+=noAK!zCi?9AUEw~FSGZ5~=lcif7x;?#I81b>_?8{g%P6xSo!>(K zC;J`M_j~qD=bwe|s9#e#JVoE{r1vG+&vk1*Yx>O9Rzz~9DQD2F^IoLm%^-STm&<|A zRi1yN`^h+-zHiE*FYjYTe)j~yu!pZwTXUnwIlr9?@yi`Sxd%nQb`A>VD*lW1Kf7bO z6Djomi1=+ge-*+>BYsr-Q~j=sjq4)+H;evC%{x2in0MYaO@BvKe*uR?m%<`HI;pzR3jx(30MV?)x0D40GPNCh8 z7k$UDi<2oGqo?>iz^Gn9$9{jHs9tOpLBG`Orn-|fD01LJX94&c{YJiVdZE*co1+&`;dpCsAL^y}ik zaE=mBX!{rY#qLp_L_vQ26w?nljeL5K3G8&bUq8Y5eEKGcKJ)i<4pH>AU+lv7>(CGI z74z{p(LI}A$NU@lpR8X`km*Kt6t(jKrf+UPKPY@e^OPZlJGK0Ll5( zp4)OG>d(6+pPi46{JNcoy&_I0(u43Kf$1I~ZvSBkzi;M{Y#fWA@-o(1B|~rBJzpG zjW&Oe`*pRWNe<0#O|yHd*T$*Q_kQ)>CO;p}-~0ZG>DTom(2MqK;|06#0_#5{x@aD4 z_fpwCRc{e-1krkUgGBh_fcF&H2{<-;vvXr^h4d?~UBfpCo@hUux-AkX-BXCaM2~c1 z(K@7kr!SK%asQ^R*ImrT`MfqTJwpE&Z_&M;@qM1QuP)!sq;mjkrE5W&Gh{1-{_I)8S2oafyoLYF`E&aplhE4PF17PDhozpzLlSPB z;Lzoj&&FYf(XJtJTCde~kz=m$7Yd6UbB#Y&Smc%Z(?JKFa>2}RC!UV#0{0akM~zqj{kP|p~h zH%9xy)1~vy6x}BU3-S6v;U}KAD6IO|d*|Zu%yCZl`GOxqeUI0Zf0!?h0rpH$WS3;n z^Z;%~IA7)gxK|gC`7gWw&TT&>^%E{U(fHs(fury4JmK$o{!sAhx()mSkv(PK%}55{ z<#hDV_TZ;`u|U|L3{1*_pPG);AzbfkI5Z=5}Y<&A^e)(#CQNt@xAc(!r9Y< zJB9FITrM6>`sb!9ktgEq0X@-umk>HVCRYm!>X*ze(Jt&^K6U-EhV(OyPdZP6$NZ1I z-?Dr)N5_1s|7z-z{MgsVW9KXF-hIP!FDj+ybvmC1J=6H?631FhXV@j>nr@VOqI-EX z-o6I|d;AKGoeG_j-{fHX2PS`eFB$a=c=K)ZC&-7IV!tvm!~QYu2z7l6cq%av(`UBx z41Jt`at0pw9e;cF5)S9%J?d@NQEX}zkQwr-aV3za)=Px_Bk;>WztVfEN| z=A!Qp=slp39aKwwk=$P*@N9A)hTOEDM*SCp&xeP({?u73xS);q%r4{gqkg6H5Qo%n z$-2jc*kA0w`#9d0Lvg*&X8CHlywsnedr#p)?7U7YA&w5i4kCNX)_LrHR=Won>CIFw zTq=CK^Q6_f9RlM#Hf4#vgOQ@~2_Ex%g#iZX-cSj{Yb4AhYq=ccg!(O{_wGdw`I+r* z0P}aM?^p?azZCi&k$pC5H!LTcXZZ5!r22s8KZ@|c1F_!NZhBQ8ogAhT$JlN#{(&5G zt2Q$u;UyvuyZ6~O5JU91yEx$U>Zg-W*e>}p$+KA=$>86)KA+xU;v4na{mFkux^SZt zVjsFM>E|C*Ih`ot4>ulxziO7#pq3xv5bIaW*CooAp1ZL7jLrVD56ZYQHSbC$Ji9{2 z(`(upPj-c*hiiHjZs2_3nhvRNMOxtv0!QZoIt9*)-N)n0K9&dFcOv@8OFN0?$K;Rj zgc}DWUB?Y>g^Y{CHR|{D90lFWC;4>#6WaNXa}`hHaZX>h@>-67+@Zfz*$oW)a_%5I zLi(r4;XtmhVZCfnIy*S@^S7zpm9pQj{Q&-|UCXygI5Nbcoj0}nd95FFBYQPn+6&pg z!oyl#__6b;wC}6wM>JjJLHDgGEb_8(w@-gF(eJ;9F-$P{PSHO*|3mM?GoIP}^`zSI zQI*#vEUzP~cUh11>pL_@d;b9BHF8MHALei_JGOCW?Ds_P_B|K#k8!&CyWNs6iWl>u z^_IU7x$TyGak{|CK=c=_M~sQSHm!JTfuo zo%=`z0^56Izp353v#s467W$%ld=DuseA#(*r{|2qHDYheE|-QBw;Qa25g$>zWH3n0 zlK~9oyWGC!y+3FoVP9%7K@LmNbH z+Ml^GX@8qm$oHtCdEnSd&bMjBF%Dz>s~!%VlJu)S$6>60f&F%KT-(`~w4FUhV;DDj zLfgr44*mRC$30!Y+QIGYsFpv*VKUJBo79hH=6#gua_VO@^BxsGNWXaO+*hXTgF?TK z6K1<_6$1kB|5>H~@0k7y!LR2UefoLbmg*_hpSLjmCzbwFO23>#^6{j#Uh_|RuD3z! zO>^kyucZ8tTd98be6F`r%hzz23~muTgq!73*CwI1qq)XYu3qhNH5a4#WQp~+6=KKk zD#?fY641^bp?}=oir3$6RD6_*^kg9GZ*HZu3zwGml0C1JGiDpQBs_mJhq?W_zO+x* zmv$XtKEs8R5^fYbrh6*{uAPuj&yhKC8`1sp=2zyH2Uj21cXTkn7W!ozW%l^wtbgTpNxKafO8X8so)EtE-gN6{L%pZox3596FMob`6!56< zi**v~f3KsfHl5z{9p5`J#P#_22Gm|ljXys7ee|b$xtz-naA@;Hv`6|s`cA@(_2`!f zU1u^c`m-NXJ<+^K#*gv5NZLs}FOqf_&wm<(zUW+qwyzPjC*234_qJy64|)0Xvp0f{ ziDAx{s#w7c#B{W4J(C=UdY&+*V}qufJ+~=rbhJo0UBC79P)x^q&@nFM=$s*!%ako+ zd1vp}@pj@orBCp>dwgG*O;z&# zs;zgpe21iura9bH|6vYO30ZLT>9hXc`pb_qKXdo@rSyM2^K(@BImV%V&(`*%jLsSJ z!`&k9OhWG0_37*@lKXp@&VH?@k3&Cyr^>yQJzd6h%J|LYd%1iv_zugdFu`UO;5dd1T^sIZRzTK5X9{aV;K zz;MZX9U{Lg^+)$Qj40lGAD5qTuR~tx810wz=w1iyuk_rBof}D&iGP6oqn}KbT`uj< zlNbA^yvmRA1@N0H56rKcDGKwxX7c&IzPNw#$~99tKYt_gcL`owpG116;#)=O;hlgm z{&+X@iEU( z@38gYc>X;p`J?&y5rsvc@qAnKXX5~$-(jMEw)ysX=S_Z+{eWpRrDtWBP6U z;4Tn3<9sn5AAg(DW9wl}peMSIuU+M_k;_H%aee>EwQzLwJ{Qtq&vu^Bujdf#Ugxc_ z_su^-f1`Gx-+i+2(QNDJl_;N+`cAjrI0ku)*Qk9|a+smRMo?8TJ)onWhAQ#?p1luA zLZBxezev9kkE0qCzt~~)Ucm?#{$_a|Wx&&cCfJyMWI#pkILI zW;^#1ULbyh#6s_1eS+!fZtNGjMrFPjwu+x~WAEp9T1S-h1F~KcZtT=@Qa)_ea%(jI zM#nANw)SKY?HH`4{y5vE8p?<0||9p6v@H`Kx>+kG$X~zaeyuX*)lla^0xm z8i@~EC0}=AX}V6LozFtoeN5L$ZD*%AJkx%d?l%(pbf3@8ji+!a2tB@Bj%$1Rcb#v4 znC7BqvR+VX{IG`G_fe($*cs97zlR3pWb3SeF*hUh`v)5vR>rpNB{53 z_b|cecN$0z(Es{Nh~N8JEZh$K`m;KoNhK8T!bHPb%UOR0d@Jc(v&94cJ!(hc z!WNc8!7I;v%u;?C%6si{5cNDD^#b2AZkK~Bm-zkvt2u)k9hxDpG?lk|N>P5G4)(70 zkykseSH4It%)k1*C%^wri0Co@P`v+6>u6%1d2Qdn<@)Wr^mcEktqaHFq)w*a#z{&3 z>J!?d=0#RJ-`rcS#TWUYyHsV0%agvVQF2>C^UT^OJSl9{aUD^@$yM_R%>< zy~nuT;&JkwEdQ?jgQ5qu8#gw=aI|kSHmvYT30qHaX!k61&vNcWem2|3VU_El8TK(ehkZQA_E9{Z zyl@&_nKFHEw2Bl-Po_-lcIJ5UZCox>Hgo+4~X@c4fJ zBD~L{{ch?kI*dY(o$reG`;Rl;XdXIpRAH5WbPiR<_3?h4$mw+TKL_=X%lO0Tciu8( zFP<@uET;Qnlp8HBXZKbtWIp_QJBV+LX9Ms1o7nHi7k|*s*FZ0$8<;QhcO0Uh!g$uc z6CJN>(P0;QY(5j;b0qzPoy)QFFm^77{1oduTr(i`WEl!oMwm<7v?&0=#Oxw><4*mS__m^^RoF#`%0c+u#q#IBi{_o8{6j_2%0+^z%2X{g=}BcfJGrZ_)D25=Q&@#}ppq zFkS}`x!C!!nd=C{n*X?#pHTRO!XigIuWs|R*}lt}hMkSE82Ee&`~lkS^SFOb3qCuS ztM4JtweIK3=VXzcUCQ!2rFL?1hMgT(J1gbqCn3*~<68a%hsi+R>$QIKiLQ6d)<0FM z9a#T#F4JA3@~Gs{=QB_{C`I?fOn0E=D>zIBpBH$fpTn>^&5E$`a9FMW>k?@<)-Ta} z2F!Q7?=1aAsQb>;zBFCdO~Qvnzsca^Tu*dAZK-~2yX1!*{GXE~?}SLM;k zVJh*3qH~Wk$7ir-_(AI*K2(MAnb@s6&Axjney(MHq`kYmwEwxr`)^@xF&>x@`lJ5h zGs@2)jTe1ys*>-fmhLaa{xb{P0fEj+fUfoCjHtvd4DggZ5MbqCkOUDU+nk8;_SVv zLbs$x?@P3Z-?#qI(Hb$HInPgsxd!3olE376lBJUIOwaws=X~uvhQ80$*vI^(%5UZh z!-Z+-xAt$~FuO$0lePv5tG{opP#CLrB!|`(hTW31!j%eZ|Jho@urI$(lrw#J@}uF$ zRA}<6lnjo>^LXZxU%0D7>Rk%$5dK}K9_O$Pf8~9T1cgz*e|8(9=^or(DR(7-jwr!7Ka8;lfVFmnwfHBg|IG{s-N+$n<2ZUd{3Jy>^8+D6IEGR&^+>_eNH= zD=hb0;yoU^R&Xlp6+5%{O0cdsNI64MOW@A#<#JB#3F)8{^KFD~T;yf#6Y+T5b2~W< z)o$HEv4>2#or{)pj()qu{eo!!wh#2Z#e`>cP~@uTzy19EI?ik>Iu{L9W89PDcHFP! z2RH)7|wPoXI`Nj6dAiAfXJi=$@`dJ-_s4GyKp* z5x<{eeh(?V6CC>d4k1603;HpSdrr}O9r57%M&^4+@eFgAyRQ_#tC(NE9^CKY>*0M& z*HOiHWCmS_RS)eY^l&-o854V^d5q$j=2Ms$OIpEV46tzk}(`R_$ZO z(04M`{_j)xkivTv*84oG1{9v;bho%);99vi)8~JZ+J(Ok^eldV;E47IlN@Hss#p(B z&l#ljJWsSgsrOpgezM=bnyKcveF>j4+Lxa1i`o^zc=WT!fwikla*^7Xd`HITgYWx6 zV<@r{Ti00xy^PAZD>^5pdP*g}&f`ni0qiQbO7#-GA8`)I30w^s9Kt;u#O)xa7Mepy(+%_-NN>FQtjr%4Ew`9HfRr}-W&SS3E%#XDW2og>@RnT@>lepgd3Ii zoD4>VPyIezs;r4&IwvjmlovmoD!W4B7Y=f~-KU?e(tfaUuiB^fgN?lkH%Ph0KEYR& zR=8hayC&56>(P6q z!Gw;b^^p6uJ?p*9wm%oW$Drrrmesw8@x=46OBnX~ ztss73AD^N1@^D|f*h4#KWB<33?Zw7#6->8Z{*>BFsea?H$zJUHVQxb3$NuY-+E2iE z&40~pKd+j>M}zWV^RwqL-OZv0U9a)!u0j5@=Jx*&!rn(@-0JlG?A$}M+jlacLpt=t z^E2^tHV?D+hMnHCv#Cnf>t@W)^u4@I_2wtjBB#+IvEMOi52-}&3_0|x9R5}JKfX`4 z>P81t4*fIq*Gu`)-b?j2JHY>FpO){H@He&35wU-}$HwFp-y0$A=Sx$~t`Jm0?BfPX$hbJnh=ZE5St#`HLi{feT3{O;Uby0n1 z8@;{18NKiIA=#1!IDsV)1wutVcd%N5L=|>8x=TxGN5oAZ?JKeczY1dsNf6jK) zT`lV(xtqifxDn}ha@8N?a26xGokTfZ(;SY#9uw6 z@e_*g0fi4Ke80jnF3VL9Dm=;QVf9{xk0?B#u=K-Wb-%)5Z((&G!{I}{8h=#l*{twM zg}W3!rf{di$F-gf3ZGE8Lt(L#u)1C0PS$%^-KOv<&EKMM!0EZ_3l*+V_yUDn6mC|y zQt>q?T%&NB;qcBHjTd{f^1SK73E3y1dp3ys4Wws8gS4X7Z>Ysjaiz452Jn24aqU4&HXzgxv`TKl*C61w+V z@nf_KzbO4mbWf<5RdjC##y7`E#CETY(|y=QBEBHCK-Nd?{?p}mGTI>O=k?rIioV;7 zr*OTbNB0z5E^xTYA<4Mw!c^WUQaQ8o8Kjaf8g@bd0p+NG5$bHZCXMNnI3!Z z-}c#YF0|(A%>|^j4u)@Ec7gD3_GstBA?HrYlMG&qtkd>CurCcd{!#7!ZR`UMaLAImt4DUtk-nEzWLm#9nx@WR7f}xUb z@7~*5=tb`V#62y)>3xXvNZ0NR-lJ{t`Y-t1g+vGJ=v&`}e2%J}%DO`FepvTCl$jpe z2P@PIZ0+7%h}I?c$nC7|WiY?MzpvvI+B-S9G{rZa{d`Wh{xZ8n5N@G%i1OL9&!xXX zu=XMjXkA+R(d?4t91-VxKErW7(Q|gm;%WKpoJ|&&0?@PeVh)0=p3B)nN<&I^sceXB zA*G?qU3;G86Nia>OkcG$*tM%HeFguB@SIJ?N6!}Gm+?q)kX@3Nc;b`mtEv;2@NzyG zZc)Cf>G>*`2uy!DUo(T0?|IYmh5L`N-DRJaR)!8p&~q2ym_9Sx@~S zm%CHSWvitBi}IgMhe7CBtMUxj3<3d0>M)wY}y=o_2pqc3jTaXQS^fG;{v!=+`97|EHF(5P0~j8ZUH( zjWq&~Judn5JYIH8##`YU@$cEOUuybZ%`f)_+C384F?nCw?vcpqy%&)`8vB`+KP2TJ z7CB_cbYF2zyW;(c=G&m~j}`7v_(ux&D*RsxcPe~R;eLhX9=UK$pTGx1?%9d&3mkpF zqDAw6SL0>88a7r6eDK>Ee}coXF|F{o6mC;k^l9J!u=i0S`y)GN`_p#p@*;oOC0f>6 z(m$TaFQ}h$dVeA8kn`mvU)SOW{^5p?aQ)qt(%@}BdrLy>H1e;~{Av6s^rPJ{zAnLM zc-+AT#+U1q_H6OpX>kzi2`}6EYAvVdWp2^_&F+yw`(*rkB%kpGd4O`XBW_nKB^~sp z>E})j0dskAQ$%+=(-rYW?TqDV`}2BUmCol&KB|Yy*9m@?7d@@LUf_rioewx|r*5=U z%9Fm(&fQqAz{Eb+r~PfT?s!1#4g7F@GCU0;|9^$lSM2YM-?h?h1>yPPNA3Ke@o9b! za^w1?+ar1GWxAZ+KLb5;{i~(E5Qq2ZF@Kx8R17cTJCe(ABroQ7bRy!P>x=C5kk&UT z=~mz6QlIH}t=cW$Z3?$SYBH_^ zE8S|3HV&NaeY!hoiwNUNBA?H1{&CtHH`=^23#^1+?_+nmA(%Q#1n3T)V*aqd4+`kq zJLfOGt}FDGTG!1aq3fH!7keMk z?A_+=ksMYt`e>b{utQ+T{SO(R$T=Cv_$~zn&@)^8ui^Z#M%V=@j2^2$yhr!~9mtWS z|M1v7poIYj2}I1C?dKXPSGb1J z2LBt{&zh%6PcKW)uBSC#{FB$y9PQ`{=;@i>j;fy~{Zx2*@cmo07hn861zR`dc0*0U z`V06)_Y)ega4!<~Q`}!rKBPa(!;5j~*eljj41EV<>5g}Xl#a*UmzMBei3s<}Jkjlz zel1+s%;St)r}%a2k8B=~eGIhFaGQ*$ZQUn+uc4F6+j;4*af8CzPc(K2EX#M~_heq= z_d|zBA675;dO7Py#_e`K?L6v6;79GgsYUh77Ojg2J~yWI9MJlQg|1t=)0{CZ$LxUk zxIyJ`h0>>ZsM{7kZTuSD`*lL-kJg({GMqU}#-BD`T%_|d^Yh7|o$G^MrnQIri4l6h z=ZBWZ?b-Hu(2s-9P`~Tz+rvx99#X-dbNK}{zBnKG7N(gV``!xpNK?G+uesb8gnpX` zUMzgOW|4z?vB)LcFY|}2uG57V$oMu)2*2SvkwdupIOEIdeeAj2Oip|cztWHXo76a! zDbxG$$924{`$5ZfzHr(7GXD1M0pk$cxAOPHZiZdxJi@-)9@)i+&}aLwZd~QEUFdTY z4I-yE2@LtKd=d3y4+$J@6Z#6uzl~dsj*|5p)Ot3TuBQg|yjAPbd-_spKei8L<8jOb zNQ7)3OGw}DK&8-qy_APs8|bImU1;|MjjEpPp2IQKm#(L}%mzl_Is}iqN$p_0+CfI! z$HqafFVy{yaNB^u3;QM1^)LD^vB0{Y0{?{(zP-0){w%uZO5eM%d#>PD@PylhZtQP? zBKjVn;5B`WaJJ~)80hWuB%^r$rxzqHT1xA~X)Xu8@PxZ+7`FTKU^nzXm6P@g zJ-ldn>?gw^E=J=@d*6c^7xIq?-bEKky6Jz>r2@ML)xPaJId4sKLiQ~}x7|0MeOn{P z=kC{VHM}hC|E-gJVK&XM8yC9Wn9v!nR{Xm~zV`i(5X{iCfcRy3jETM%kh+nC^$8O9 zRAxR}56MIC>$G<7ZtCQCr~U=)ALYzXq{?JoZ}LnAvLF+#k$MV!Ts&BW%IR@s6%q!Ckf&sp-m6#EIv zk__a2CD*Zm3)uO9O!R$rSwD9hdO3Z@xo*R2-(f-}^hD>nBYTl{oLwgjSwEXyw_Eb- zcd)as9$?tr&@bV75v0wFH|c%VrP@unOYG6s0mJ=bF9o$n*!2(SMHllA?qN+=eOdn% z*+EfzvvxRFdvhaVpE*6}ZSTM3s?KM=au29oUzlb%+^%-KhX|x6+${DIlHK7k{%!th zb{yT~qVJ`KdVh=4^PKj+O4vBZcZc#)5A3`he&~R}kk|ZbvP&Wdq{R1yE#Q?{Uk^Ah z=HJ7C@g>T?klLJkxQ+ddn`q(CFK6o?J){?x@8ERbFQ3c&w{yI;Kj3{n{IcFJl+tw) zJ1^_!doJImixq$t1L%E(tM?lyrfk_0}%QkNO(ur(fUWbZ?#c0o4C8$kExbR4ts`+eM-r}V}2GrFgQzpn!SNWl6F?-#j*y9K|kFFL!YQ_lt4I(%3+ zJsnmx00U`7QJgZQk9+h*`Kv@OMlbN5nk66BS1bN}x_oY|kL$Pg68RsUZ~Ok|KGL7jTO6KA`Q2W5 zTW4}xh+ukb{k60od-CmiJJoCVtwilwhB@FJguONpy}sXiJ@9X70~^GL z`sJs=KfU^C=HpeqepEgtH(Qr@ChW_#5S>rOzTEEnZx>1Ybkp0EM|)IS*v%pa(mHNI%Z$Qa{cqp$lA3A(y9c0O`Br+zW(w|qB6 z(sNl>`bU$atxx&uBl{>{T%L;si?qBy{>C{mzubFXKVHJQxIeu_BBFH^ z^JjXlz`mcf{C>%IS(nnQa<=tPfBgbm)aL)pFWS0o#9z1IL;D&5om&MC-&%ssmq>a< zr;eweihX%U_vJm6`||r3AFKg(iPq<>i<#W^a5T4@t(>0>ksjM`e%kisS4q9LzYcpq z&8hixScaaS`DHxb<#87cED>V-YxW7hh5U%Wp6K?+sff3AJfwf!D<9(E7d@efCAL4+ zqxpqL2no|uw7!7$hxklF{GW}3jE^mZ7wNN|6F|-IX9#Vbd7StFUppy8`!BuEEcWiy zUafyOI&FS#^YFq5A){vj5yR_yV+xZK;C0ZPz>v=Ys^8}MPwD=@CwG5;?C-t!sQ+3a z^ql!V^BnR=M?;Ul&-_f4{~b@0{C9YA_T|6Fi;w3eWC-;5^OByG@pz+4y0xIE{Hy>i zw5NP2`3QuoxZg{aUxwl|uWD!e_s27@y`79(AB@A%)RKWL6!w%?^GT$h@_N4KGgW>S zd#Y6VwfyE3>=$}7d-u<;;C%$Yo`$~Z^}yrR5RrY}JSrJn$dvSypTl@l<*T{>O_g8C z{icuab47GxPxQ-v zxwm=sCW8*m-yY!Pd#d~uJfHRRUp6g2DNXay5-jDvj^7jU^QSzzlEHe-e;vKUgZ$UC ze*FAjo0k6q&JVqS?laNLwH|%YKgK)I%b=$h_@N(AlTHTLFn+)OwMFG2hh(sNM!x42 za+2IpWg1JgYLy#4{Dokuiu|m4`nP$ zPZZ%nyGioy;dDIjD9VQ+g00W^bR8|q2iFAqxw<~~SJtm|Q5>G0@&)R*DhVgx=c?ao z;B@Op(JslfdA$nWBpF=6={@DoQ9o6!erl!qsa5Q!Y+Pdg3gZa)EztER`ql|D@Ib)Up3TK9oxavX0eLUa5X&x%!zj`x)dDIsQJ=mnvVb{v^%q66xSG8PK4X z9;A!^NVESyy6E$~C|&$Tn*9aR;pc6hhw|bd((E6Qjv>0)T~{5v0p5d@5b1d6-fRv5 zOFM%X6?x#zAltt}I{ZSCYmsysDiJIl57NcXLA9hKCCOX~49m0kZIK_8B$*3I7ry~6 z1t!%{I%*LZDbaaTD!-6nV3l<7CzPNt`Z0U&^DP`p_AKIz&g+7XX5{zm;a7BzlRsXC zzLAc6u$TW!B11^s8?A#OmHK7vf3dF!3Zn0u(ta5pz zIhC+d_zopGI=5@<+qRw^!f5D;x)W=Xew#<2C&6!6$N`$dY^_8rZx%wO4jxT#v}k>)N7Rl~o_1ae^}K-` ziS3)%Itt>qA-)UL(L7$r;&z3f5r0q~J(;ovEN9U9SXLt`9(2NEVt?XD5uM9DI^CO9 zuNP9q^km9%9ESUjvHXDt?Kjl@A$O75H=H&-?gA-?{sQ!cO9YPFyTI{2#VuSetkZn9 zo+s`p2ruMh+DB8oR6pa@{3a)?FSdC6LT>L!k=#b4Jm@)2bldzC{XQPEKjeRaF_KWu1F_$1R2HZ&_N_8B&`Fr2Gt;}CR1E>7>$b-J%tdLKg?tnHVeUk81* zuA3=CFDrbcDKz^U=gYykgnCV(E-B_ZU@c+_8I66kG^j#4sjmvn(M32BFB-;f(P zxAUcbeQQu(H>2^^zXZ=y#^)u1->>(je!cfgdc>!6`?S8He5%~z^ddgB{OR~?^6Rtv z;HUzbgHO5f6(h^;RlWvrGLOnxAU*AUiiwCV{}CNs#m&cUMw&voSqDgH}OC| zc;fF=tNlwf<%2bfo&1te8oelolw=_9vqt_)n9}`r_Fwc}=+m_`Uw3)`Vobd|JtJp zEC0395BYw5fE#LuuV;ek z=`G6F$*`YqbQ(QvobJ;DRrvCQJW(Dw!S~xp6k$IX3+z7Q$Ud~)n*UEFuI7xX#BR1n zy9Wv9cG8sM-y>8Bz3mpf)=p7hJ{u z-zkQDI`Ca5Y9}+|Ssr;%L;WP7#P<)t|4*rpiOy+G=(#JschZ*=u{V{%K{k3U-sI}r zLl@aYY=62UD(vvU6S70O?3SD`67CYa2zSMPq-{1m zjwoMLZ!@(U`Yspaoz0(!eqw)esDvKH@BHTeD_G5kj`fmEp`fU7H&cgqh@*U2?r}(Ke z=dh5$IncL-`cLpbS3ka*@|zq`u9M0o zg9E5Oo>$ezdX|1F)^leGJ&PZFqIy0i?X-)l=W_v~&m$Z^Q=ihlY2GoToapm#RBpQ6 z9Od}1cBcJEzaHDq^nQJKMm^-h$Ue{9Zr<~R?B)a9o|3^~@r#~Zq~4aO{Xt@(rzeqr ztf$EmdXjegMD-NwW4c^t>Ou4u>tT9(EUgF8U#y2|{e-pOk=Rbef1bG>?tVgg_!HH` zy)*RCz;c)I5BkkEz%%;InE&bhrqGM`ni43tU+gQ~uXgG22R~%e@A>q{id$3WXe{MHffHu8P*@KuXSI*V9>4mkZyAyN5ty_uzJZ4 zdw{$T;QQ{I_i}ukZ-8NcoHC4jT^vpQ#(eHKQVDng(yN|Fjmwh((c_mNg1%^8KTPp) zKlB2|lS#;i+H4i00v317b4vdnL<<`a4Q{B{Bl&1vxX z<+f2d%jeJQ!723qdPA{)9vT1fP5iLdQP{W^KLpI0K7!TEc-c9PrRSAm+Ou9 za|RU#_r$l}uQ_8shxkK#wtM|%zP~5^hi@ONU{}%mek5R&*ZceYe0AV+gp+x^1U-VE zxBr~tvvE8{F`xfJ@y-o#g3As{NVb6|-Zv5$`;T}^?<)yiSXW9@KG0?M`y9}(_Jnp1 z`Pz5GqWAhr?yq1}LiS+xNcdr|KK?S`*Y`-n-JDIwe&4?1>f1y8o*>4vTW`PZYQ%Tldh2FdM`p%* z5{vkL@1DfVf}b*-Zw&s6!*?crNMS1R*~AYh^ywR>brjHtlQy6aA?Vw}^vU-n+_-#y z!t4V3tatCAKl&ttf8$?0iOYfy(>_m6;*G&Sarke1KVT~H=>+Zp_v_{FYE!-N;HVcN z>fONg9^>(c8<%k&`0d%gwF{Npx^-92G&$US-R+3qab-^~8H}@Gf&Z^D-!AwHhku^< zGV}k5#FvWr@1uQv@V}UFfDVM9;~J);|5w26#``#gelWwzd3v~Q$7-lNxOqG3zeDQ} zgU@rlALH*Qr4k=Y;CrRh_*c82s<>W+sJBJLi&z9SIwkLyLt>^y> zK1O4}p2U&hQ3_LuM-x9Qs;8O8Y2c6CAJ>Br^}K-VX;C>hbBKCw+A8l`cJ1i7Ib2G} z=t2DTJ=r_(d+YX|o07ptwf zz=-0*D z=ds}1^edG(oH#+DukQiXH_nNG4uqiN7x1eO?^S&da2V5pRw4Y~*>x-H|7Ie@r{j+9 z9UOoAZP(tG4BkZ?z#bkAe$4WCPvS>K@;I*YXrO$c10m@6Hq#;BWpU&3y%xW{zw8dm ztPlLDmAh#r#$|Ua{~rn_*$&>7C=}U2TJ3B zWN%z~PvRrNapvp2iT^0#>yWnNVm*I~@gL^)>&6dp2>EW`y2JT;rgqHsy`%T`?Y?|( z+wm%vFT!N-bERW4_yW`M?gYN47M3KuIi^E zK~MJ`JCeb7wZ1~|7`N}gOB|uluWvxxcd`F^C)c-E+xGy6;2X}$_g_1x!K1!gsln6t z;iLNI5zVQ@p~PcFdYn`}(lR3RhYJ>9qBch~kFvV)hXo&96*9hU#YiEkIlzoSHd_NPqW25s*h z9QyYCmpNt~Rq=S?_bCKlzgPkLKA-DNB_r^|#kPmi^5c1i~_4TTqbw+m9Lxy&XXV*R1 zo3^69+sV*;{d)b%b;;nDN(a@?a{fZ%V?}ZvRyotL3Z?@g=vc>eOsM@0NA|aM2k40H zue%47k?dc&^$ouL_0T{H@wazh)$h}{y1Sd(#~rurxIP(tOX>Su;+w3O|4e+VNH5K5 zfAxe5azY6DE@S#y)c%_PfA-!5KCY{}7d|6)CZdz}X*O=+eIxcU=bv(fciFy#Do@TD+gpMc2Ic9sB@8)rg#Ek4pkt7g!znA(q zZbz!_dx>^5Xn(&>@goNQMT~#0_ICrvt{y$(j1y_^TCJz9?oYWt&#l9`R9A0WwLg>o z!G&DUHto+=j?s?6!k*2beYh9?iR&NS5+J`s0CY}T`PWeQ6>eW+-B%OsJFWUtPi4SA z#Ax4auJ;AipVJ(p-fnWhfWJTAL3Z+D#otu-JmbH(?u!Zht%@I#2mFYE|3@!kyx*qy zTO<7Nw}AhK-fq$l0;E88N9(zy?vt#SZ>T$w;NNlWr`HfX>OqWpzQgsL(0)1|>7~ps z%KDHW?Bj9vCYoT-`y^W5+PXC1$fRzn!zZiU{udqDMRq(YyTIr9_vD^{+B z?YSJ@&7^Lx+e!G`_O+{CCGE?{xV~MgSM40bj_)Tc>e`pVTMFF1Zt~aC-fh~xLfv?x zT_?3&i?v;d(XJC*&vV+YlNIgyrqiypcf0D>&blup@E=t9J5TW=2L9h>{Ew^r9po78 zxRC_BL%%-)d3XHV8`Iw3a6K-cnw3u&2hcBwf&UQWU!{C%j`-Bu6(0|1{(2)7@w!VT z;?vd4Cl~)g<fl#Po;U8nQc|tKd_64LcJu{$1J+?HsF}SqHxK^p(iY{8k0Nlgf8u1@j#-_)-*l zmG37xmVVrr2fotgUcz^{0-s;Q&UZ1srP_X3zbk-@xNm_h2{8`?gfjKd$`6iV5TpG5E2W>v>W6J09`3ckl-GKX2;mrF8^Y zeepBN|L?%>4l8~O0Yq_3%%J=?A-iLO?<-I&lyCvrT+|b!`1M2N94br^+ zZ!79OrFw7)!JvJJ(Z0*LUir=@t&>#f!KARX0^c>QDP5QUzGd;(&Uk`B% zy`*{u;{I(kKPUWhp|@*a8fxg}Y-z9JZ;0f^#(#1jX`Scd3VQohkFa!zenO0Xdg%uk z@As)5^>Ylq#MfC~1s3sqrx28G!f*J?X^%xRrdP+cpOSvXzj8e%w4aVgdbNcdTj1;I z>nOSXGSn~Y2{a6oU1+IjPm9W3(*OH9*RxUWZ%c*Tl^j17a%XqTFR;@Sb=Rd*qZqs^OIj+$CXlF2kGtGQ8XqW2WyOn`?>zdwf=)q z{qQG%1OA3P&k0I<^T;0{0Jr^)J-vnA=dNgfgX(kAuf3D&pR4-Zz%lzdRJ&{6X`QpG zeJ`(%ZS70z4vH(kzSf)cb8q8%mukH}$F6^Ial($6fBf76=*bVjf;fL`jL$a-e^pNo za*Xy3(rnRPpXeRbeT4OU`dz-#_`C*n(K5gg&HwQ;R_`ILH)&U{<$8~4y@#TDZy6lg z;o6nKfgzT&L2`)Qde`rjb?3nwdTG3QzM|f7l2Uhu?>v@SOS`CnLXOh!&)Q1nbq|g|MD#2Md^adfplWaNA$j z#|>ov!S%Sjp3?f0e#$qw{^zy+Q&Ii2{>tlid-6SGZ_49sxt{CDe*m_4JuJ59qTWMV?`!D^ z^c*qd<@dSXV_NSajxlZy6!PqE2e%Yx+>(AlzRgqD^bExGrMuK2>lJ&tWA?|9|FEv5~{6j1EO12Ac;3sZ9r)$`SN4cICw4T$E zUiR*l^_LRc(=z{u_UO7y$GVu`;MfJy*NZFaZ&y3JjGlo1h|$h>aQ(Z~&bC+B*-s_L zFDo}r4YqqF+;;YBJ(p@dh*8g8u4kXt(_c}~4-)lQxvz0Oa|laZFI#oIdJW~HJ%~|H zH`lXG$E((8yuyCFyWW9)cHo2`?%Ew<_jSmJAMWZE4PR`hX_zB<1O%OZ(E9?yy_)_t znHRoGlCkmixbo!+dIowCgWg-1-V@4~;}v}QgTy+Jl{?9Nk?(l8{2x)f0t<(F5Tl+A zT+ah+PlBT(9J4-=!6Fdv)&llp&%#gY*S#X|R1P6(&k{-7y)7O4Zx^`3l8$?Ozk_}wIQmEDb!DFeX#_ft%=qZMJIA1(RLd(Ze=$n?fLlJ!X`J71@81oV ziypb>JC9NQ;d0R{`#yucr|H6-1f2&6IR(&pImOk!m%fkSz_%Ul{hvg~RRlkGCY^iu z4N7Rh{Yl%LH1Mt>Q-+w((D@x{r+uFzh`w*Li`y3*7XH}xIfBCnIX{fPr~bI6#orGO zAJX D}cih!*e>l8Jir->CkcFW~U}f0L>ieJGFClp1{cOMIv22*KffQcuG!O-ub@ zL%*h_{;*-6rrQ;MMAOo~u;Bqs_v`b6obKpT@#ykD6~{Uh%mm*wzzt{?sC%N8QzqxmuA0Pop)9%+G|M{3dYNT2cK zJknP@oJXpLZ{$!}9_al*#n+_gi{7Z`i@NlD(U&}&FRF&;_+b~%?-n48^!&{!59e>Hm2Vw&>3^q|U!~_~Zq@TMf9c`;Ottc-W9`3J%ipT! zUH+Gc^DfoOwa421D^WQ)pYjP0=ToYcI~nW$;i#OPFZsBK^Ci{Fd9il(N9E+)$j3aK z8>v?AV61)JQ8_v1@vMh)9@WZuv2r`2a&lhdPd%L1s8+5$)}OaU<>cH2o%g8GzC*G0 zZH>ywd5DjAI1f>+zUCM|Z{%`xUdog63@1IDXQ)>0bd1goT5imfa|zFSIG0ehT&&-1 zANZr5oG zxt9B1p6t7S+QYtkwQ>hz?OUkjKIO@N`d@k2Pp?*PJXYUpwA^Pr*&qLFzPG7bx#n2= zGFt9)p6qWw?_qztTDg-k`Fxd@`+_I?)_?0^-@014=2$s+DA*7F8&CG3zwBWjx>~t| zvHoLsh01-&OVb#bNqxn`esZ;Pr(*5(UGJjOp+_o>$2 z@mM?FR}?8nsBFL_41Zb)%Ko_!ELIEuOY^l^)=!A7+gzDxI;1iy}l;g z@fh5dHQ^d!a4T!V`7t=`PS&vFF}Ye&6K*61x1c86@fcs`*MvJ6gPU6ut|iuQ=hcL3 zjls$KZ8dprj>#1{XB4Wz9gN|liF*yWc8AZlegJ$3c0ZKe3x)Zk`&|&bAIe>4z_KUjAJ<(RMEMtJNVRd_id(eAUF>^|-{ zSHXvM3-8HtJ;49LDs=ud-*Ng^S^&2DI)VSQBuehRT`y5O$(J$Z3+`9NdWPMjIrbza zC?KDXJxqkFmyRQi`ymfG?Fd&lNBOU~x7@yP_1q|bBnIEW`Sd+aj?wSrE)rkmdwEDh z!sxwoejdHQ*M!=seyZZdd&>2ozW|SQqLfoV+W-10{6+pfBkJ z?-w|HkM5n<^%c9f(&QBMJ?+pv75M-D>dN*2&lOI+KTZ3dPPFfVgk1f;Q;+erD9g*9 z(GNMo`W)W7B=^|MUQUH5Wb__M<3pwnyU?^Ab}pom>GG|DUgu{ZV?bE=b)Md#~^Z^xXIo&{`#e!K3`&P(7ALd7qx6-KZJQzvGl2 z!=fmKm*YDu&rv-;%kQv!k?{$iZND!1K5UHkheGM)vUC{5p0CUhug;}qHfIf};BO)v1eth>L#_@XB>7K^+@^7W#~l_N*+8(crDH!*I*^?+a0?)V33Pv#E=^3&ilWoBH>`s3pH z!vr3T7-??_)03GoKlWV#_-!KpXQuDF3B1rO(04lKcZ;K$q3@_bWnH=+OO!|Z()<<{ z>D4so=t=iK5c2S2`eEbjbo|`|34GSCUW{J6 z4Kh7G98KVbO94Lk4qni`f%cB0@m0Sw8rgL+p2YgHU57EHfP0FOkNJh?)hEexd(IV z^z=;=fA=)uJEjSL$28&FrU`%ZG~wSgP5AZGguj;I?YjoiIHL1Uo0r0G$Gnn;2KcRa zWiOR^jXS@^P!j6*ErRnf3#9pFGe`8@TpFk-7=Da9&nL#0uf_Z?fv;UZyaK}C;B)Na z9Z%qW-o?8>@#?%7>n5>wt)mPI!2+LS|)N}~2r8Ug)`5Pg?O<*5E< z$%j55n7>Hx2M8aRNq#s_&T|D?aW1`x9~fVw`TDIgUq^jlZMa(I%eLNa^9t0*be@O5 zM4#5*run(LkMRThUU0qkXP|W3`kCcN?QT+h+U_>xM{edv`9W|*&J6}nNqfTe(tp7b zp*vhJ@)sNty2JG%AmJ4x1QhH(wt5H$h42cW<9g$h^2hoIb~CnqauG47AdESZW_H2sa78Oi$=uPNu`Y7dN&>;FeH3LHC&UW4-E~oo_77Sea za7@nm%_1g2AcFTvd$Mv2jOLT?XE@WV$S)#bz}H@H69Z!RwbjeC+bf>S4$_o6`Mqk?0j&sN#w}R^V;|1!g(TB!9t%A2TN7Y55K^8?>Jxd!(CTAO#{u? zTA?F+=#bREO487m&2)Zy>>ZL0j>&V=v*6HahBy0?_TD4qn*`qMzV&nDFDM_%{rgv3 zAl!6P%B!8he#B(`Rkm}V;qtcbK8u7aR!+nv`c7Cyxgn*O{12D_laFj0ut*wlMY&ew ziY)sSN9EFIC`a;-06p+2j>@%9UM@UG^d!9Xgz)JxV4=HD7D-&Req65osCL8bQn5+k zOipU*?YzesKgKzqin#Xn#8;}HqXr!0Ws_rHBm8-KNWuJuX#6z)hUA^9@AeRz_!?*I}!LV4W$15S^LxO=d3fCt^cn>~QPl17{?7oKxa_-Xta02I~#sKhqz z1y@SCV~50O$5Q&~^5-$)kNI~w7-T$G`T+-c@M&>1J{@3i&)!!JyL`@w_@(#CSi3^C zZ{ZRt=kkmFHysayBcfNqA+@tL`S|OM$lhBpxk3H(&&w{wUuh5GHqFnav|JN%NvPS0{pndJ)3qk{>=K`Vfq&UdeQ*j92wJyi=e5nv@SlMNjK5lC=4C)(`b( zOTO_rfN)RuUAWdLY|(W_g|v%KI->zk?S>5ehD?UnSPqxt{BG- zOFPSci?qM&w@CX+bA-_FZl4i{kBH)h14Iag=zR@c=M7a~lKu(ZSN9U&CtKfbP0S-d z>dYf2E4M3A?vI^vHr`>qU?c(eoC7x*{>KyLJ~+j4#}nm_O|jf_iE@XhSnhP9+!IqQ z_hO>lqf;!`@RTYK^(*A^SEpERX`mf{>`2_gJij= z9}eKJJV$x7>mC{)GF}fqNBs!VI>kfMUYqZRcZz*4(03Ivqy}vX#%+{K`5UC& zi&Jmreo6L&t-qij(0=s83G{>Voz4@Wx=5bwyWmB&Ggj{%Mb+2CfF?Sr6#GNk59VhA z|8Kkf9MvQJl9`oHL2xs(9!o(kjL+7Oi)YW8vOK*P_1HYPiX1_&tbdaIVeK+~Se!aB z0g;{x{|?6ZC;OF|Sr_wqD(nc_mG)#`EHmp~`ci7Son`&~-3obv-M0JFreeR&a_#6! zDonxVYmxt+SnrJNXk8b3=5*gDmzzp`FQVN~svJzazC71AnO~PYPcTU5P$5qk--63p zm`-?LUr zl6K4NK~ipm4a6V{u*y@F-&JmVRBvk4Z+yf20W%G>4|E$nv>u4+c|8UEPU0yY;Ky7J z&#heMtZ$`!O51vFWOrmb6WO~vivPy_HeY%_;&PV;@f*B;hQUGSOPMB{eSPj zwNvfz-dochR=?e_@U7x`5(53>14WJiAr|83CaUsR9yZ%O+e9$@k-#)XP;>V4v8 zU!&{6c0X?t-`EbpXZs$o=l@D$LjC=cZ{v~K6WEU?di2xVhq)=A@Vp%MVbdgXZu1Xo zm-)lfnOD8h?XOA3CHUR{@8o?K)ed>z#_?iWw}!o%Y+Q$*f&O0*llMos{LfO}FL3#n zkoR(bOnqMR3gDZhA26O-KbT*T_MYQ*mFt_jfBF*c-LEmey7rFGdk{YntX|Wb3Vp3u zA6Nl5roz9QvY)!K1;wfVn>k)g-%Ffo|9=(jtL3Lo(f(X>KqmIJhjbv zjrv`ATJ2dC?3z<&id!X-)W$ON$$kP#7{}0xY z(4gGa8zq083<%-XEtzAgz4)9A=`TIG>6I`~9>9F&cc7Dp%F_Zh{xf$R85%^8tN&GPi2A8!X zir%Y@&IOW_1-Pu83xv}}Avfb}&QE*q)$+SIzv5hB&GPaU@3i-BE^l;4>wQ)(vCp5I z@%KviK`FP8tL5`p=qX#Th|X_-FIV>&t?zCrcUbV*dU3UVfq$ff z3bp)~wD+|i0Yh@!u7>AJlj4~@WqLjbJPH3T?QN=BzS{cwU$}Hc{^UC*E${jte}?i= zx!ZW3KH2_i^?syky`Px0yj$;wV)cG+%H@7HR&FWlS9A}>liL3zpV%+J`tO>1c?T^L$_me=|bHwj<(%~lE2i0>Mc7D&! znFLK#fI_fE?p+9%KQ4A+i`=^qEa94+TYb?`Wv@6zB3_IWayU4)2tCdAM5E<%7`|na=r3 zTIea^+shG;7fc_Np2FB$CAM?uX*w;0oS;MUgU6Qgk6^8&=P#s=qG0yX=nd8i!k|Oq zI~K}0*+Ab92y~)z$3nr6@(96NvHwA*#CI%`bzbbB;eG2_v^WDkn&8@<4Wh<($D4RD;S^oSJ;OZzMo)RCST?JW1J5< z<~zC+qBX+QLx=dU1wg82>MrV)W#y-#9$Z{TLt<9Yp@AKa{Z zJa3o4nSQI@!wyjuq;Fd9yn_svNnOJA!EXK8v(G+@1VuA~r{#GzFM0v~oK2*f{V_fV zBHrFu7o*|x_6z8z*{^V()R%!kQLuCNz_b7F=)IS7IGf|ljr$* zk9qK<;EB#t-Xn0~CXwghUa3DAA%rMz`zQBH1BwqeaenbWpW{-8#*a#VSQ0qfhY4p0 zp70jMdqnC9*Ku*)rvx9+Y>w+he{*%;l>R#UxWvl9VDC~ci2YSGF>}@|No#xeR9;jJe{-X3~RVm)sk-ub+wH=UMP?RRAF=e@}J?zn%P3|lZNavnT6!q0;v zBG187{hT)WbL9ms2u2^^=N+m)_P$SWSn};WBFYC0e}dsNbz-oVQ2(Hx?7nCl2LOL9 z@z?IZi0*;W_bgnv)dXjHYw~Y$3OxUV`o!qZE1iY9vsv#8b@gO>=sXhLe?z2@{mjx| zvca;f!@ni}tt=mIJ`D|2_ALxksCxx}XSPsx0pC-esawwHr80G|s@$^WNA+nB2#yPvfX zq`!g(bY4D1S&l9=G%z*bsdUPd61iy@bxOi~FfW9kLkx$$El)tbdAAC)FenmbsFYV2*$Om83 zo}6EE>ph?I^;{=zY_O9L2o|ww`Awq37CTEnZ5sr@yi1IBzv#Z#)Dx} z5}yEUUfD(PNN?78AMPUu{e{$pL@VM&qK7HHe~`+ficD&U#wmWD=3DK>Z$t~z-rMLe z%F9hkg;bO1Vd@Ie!_<|mhj?E_m;Qb@g8^f+~~=y6K)81;#Ky;ks0dnCP)(*=4T6Y`WvEfsxEEn|H~IakhL?-jy@JOZp1MzkofiOlqN=!z6fD&Hyjz z6$8NEk#f&M$+dB1Lcstivk2p+8kJh&+E^qrBt_+98+(|Jeg-+4UG z-z@Jh=Ta|DbPg0ss2`!&+Q@Ov``$!}eq~Yu7v6e`%Y~cNe_1X549fWg7tT{ZM!%mC zE*C$@_OZhK;>XxJWw`$Z!M9)ho}_={-m8f90_ZU~Zu)EM;(?w64W1lle8CZ|XM=2f zhgU*Nh`x)2FQLA7V}1|l2M0^`J`M>dSW#k*Irg)KGAWoHEw?M)j&Q&7VZZPT_(51{ zp8BOn7!AKa&-aNvrD;f3i^>&gW zFub;Y61}&C$|#iaH*(tM-6;Pc8II`QJ7pd6?=OcP{$kJ3Pt+Wi{fUY1tONWrM8}xY`wZd2^8$?rjCX{i$o{ZDkXVO;{dm(s-%F z_WdEWXD4O3^Yz>QCjOo)+J)zU1O9&|-L-mxygv?%p|0x$dAV0NoVQKJg}mLT+b-!2 zSr?-B#kpK?K<$*?s}UTa3V=`Fj|~n;|A!3{2M73Z^j#vh8${sl2A?0;y&GYJ%9F}Z z*sxrm8~#f*E%n>`(_zDE&Iev}=Z#{@3a_h*8qq+e}aC3s5uHCk`k^suyJwcNuMEBd$G z-mzsGlZ`<@c{JVa-xt1ET`vKL`u98dtv~I(^Wb3upb+WR!zRC~SCM=(7}t-XE7Ge2 zk{{_+q?f8!k>09aMS5LbpF)*$v=hBx_sxX!L=Q^3{u}Opocrrc{pya($$p(p{c8Og zoU3xSP-DG+DOjw0SfK4(ep=+s?n%*mMeP3ZqVDgT{1r##-a>oNuQ>WuDZl(Vj*FvT z)AUJAe_hijH2n{nKCbD1)bue;%l$mIK3-J++xE$dqq1&m`((w@Z)th4FU3*W#|f7U ze~Y8v*5~^azufB>E*JeMj{b{2-=)vLqv>`{k866HrsX}4aCxhy}B>6_3b$P{k*IEYC+@ zlK6dkU(Cae+`*+LS!XD%l=ZCA8kq-|bbeM!$$C~PFY}p_u0xj&T*&2vQK75UBnlgh z3f-k9a!x1&qtdQY6B$=dOS?-=GCvGPg)gP1Ir?1qR%$v|)56!1?vDhc!uL`WX5GNQ zi`!LdlKFHn+OKJ>0^s>RP0Rc`7#-2H%x7&qy3{1|?O^nvJ{L#G?h`0Asa}j8(&yqR z2cyR{O#=+qcU;qCggAXd(`0x#eNxjh0kC@rN=;&eZ9Y?KB7?y2&nrA9%l3Goq$}5_ z7tkD>=Gt{D*`8$TWL(bF^|8IS_m*Jy?{wy2u;;K~Y3~mhaiOkB*QZy=x>#M0tc%t4 z^ZE+xF+#Xp+6R2w9KYN2(d@SAtIf;Z??P;&@hDs_d<353ZB2ouaB1&Gpdo(DXSht=9lCCw=XE)kAA26qMiD&tv4!Ha_Xvtp`Pb+=`gUDM z@8ESJxBPn^jF(@}`T-Ii&J+EGzkb^7 zM;*u9`BE$TQTIvReDs@r=M#7~x^kudwD}b_PTF@u&7XJivAn2Xj&jtsv>x&t%MZ^h zxCKVP=qKP1?7pS)_$+c7>isybyg`nQU+_adMJ6V#>%o=}`MxC4-*2FL>^^N5ZuH)G z|6ajxE%Z0upI=D8VTCpA$vUo!@4|$9H#6LoKo^sb>l1Krz0=;x3b?}wdDy^kud9F? zPRQG0hLd@;OW$J&zDT_bD)9YL0RjQa2Sc~J!uziEWwu+ zhLdr}g_}sg37=&=apAs^sP|&VC*y<**OGw4$O`%TWspMsoTO6ijB+d{sb z&|>!h0Pb-bBCFkxVBZxWai;wY9S0A;$odjqp#Gw+PlOi`Ar$PqN2uTZ0DeGrs2^|Z zo#vmq>llCXBgZdYDEPva2|u)ntBKm%MfiQn8rB&5LhvZCF9eFQF9c2&Xg`NQqWeiR zDVfM&KLhz`PaJ+*w@7;jDHr8t@eUvMh0u;d>QddWxJ~z8Qk+hE4>CN;qhHeA1Dr0T zUg<${3#pYJ_M+GsT+AGGn2Z>Tg2%U=cm0vhC_X#e=_kcq*mzu(tN1zKC4CjAGbDfTq%$PHuxo&a zo}}4INPkIM>^sWCQ@8zgq%lKCds+G`@bD+nd|Fb{3pu?EkGcOLclMnJl!siUS?c6D zQl+j$*sl1w2U_? z`X%*)lV;apN1;#VN5k$v_XYAZpp+DHXF(h2Il%z~-~bP}w-VzJ!;a(m5Sf78YQHfq z?DG3|qO9ND+i!Lp`Grou2l<8Gu0gZs$j|i__94H&&_Vh5CG|qTP%rp^`u>3EbI<)C zAI|}Y=Nl4qfnHmWvGvWcoiZtaZpfpJ7uXkg;Au#R1mGi)j`$VmePiYG2?FP?SN##u z7x7n7g-rry`4+=pds}K3Gx>*Yuk5jVrICMg>B0}A)GO!B{6w<6jmKlV1aBKL0dicJ zJ%jrxL-*An6x&74OkV7K9-f0V8!v~cjXtH(UZ48YzFSsorwj^h^dAFsRGv!1&X4ue z9}3nUl>ZQwkM?;E$aDDb{5>wJ6!m83$atTbE$a=zE?GASx*`2E-ao=obZ+gPltek4 z2Zp=_k4XEXet1;qv~@(#@gU?lFL+Eo&`&6d=l9a{=sxC!0%!f}euwRQWRR?V0gM@i zK+GAvA0c!EmqGeG4|Jj*4F0G2-r7G9ji$$-_m`C`_b*}PeC7k;UE3NKl+7#1Uq#h>jnIeCi?#$)jxuL zgvm7fYWtVbKEIfK_9O7q^;6#a`N{p1l{BCMKgP4t2>qZC_RDx;{s~4y8am7M!&#(| z{C;E`0rB{sYLxMx{C5N!|1kcdo?7$qaNg2!z{3w~KZ=o7LO4&p>k2;!eztv&6>#5k z)?LDR`khzG_hRK`UmD{!JdyBD*_Q@BI6d~gS9?Fh_FLiqe8<6$aT_iv-k-Y8`K~Vb zcNa}yZ2buH7f?S;z&^#+e!wjQpY?w0v8U-F1<-}{2!peIMEHSkaO%PPET9*7j#7Q@ zx*X0ES$ULm+Yk6Bs17@?g7kMOZS#wc&C-4vS<9)Lvecz%yqYvf2=GI5$AcIy9%C|WE3p&2)lt=mww3q%PjJ0zV z$*=WG$DMxxchYnF!R4dd{;#<7P$SU4sOK`Y|A^p6`~Sl22Lig>?LVjerxX7DCy9Q@ zBUGz2?;ApwgZCT2OV1Ie!`CtJMfrg9beLzL9*&7VphP?7CF}(9VMhRm=f6!Eh=~lI zXO(si^>paD4d`L7Um7A%ucM<-viS}2`}zw5$j=XU_k~m*q2iq4IWJVS*VTtw@&GyT z6LN4kAqTH<Kv(@xsH2WtMjeGj6L zI%m>#I<%*um;PwTq{jFc^0y9@^MMyEOM8FJ&&%s|KF>3;?v|k^nbfV^PbmMxhvMaB z{p|O({3~?5u9?^4GO0FR_dvPM|5`4W_I_L8lk0R_<^2W%?Mc)l>m^TXIa{aOqU&@y zUZ+DnA9m_N`($0>y;{!J>26{B0{GV_>XCJYUytB1ug3ZzRz?87Fo7Q)K-zmWf(Jh{ zsm(kN0RHK!_%VY5+)b?Kz)z$y{&@*_j3;UDet;8vtFF^+Vb25jUzwms`s0AY-|YEZ zZY%pIfPZHKUe>Kbg}+7D>E6P8WB3F;!cSI3q9>>8blcdj0RFQH`~u&n_}g@y?pB_k z0=~1VJa#MmTXmi8cKJ>v!EZ_6mvx^Gg};scm`v(zydDJnUr5j|>t1&-Jf8n^;<>DA zy)}B??C6oLhoW3QQBL^2B`S9)L8m;wDSG~as?Rq?&zB|eOFK72&*xSxzczaQM54U3 z3%iseXaDYwHza%__p77l|0Pjg*^E{pPKCg`H!i{y7j^n4)kT#Q zzb)}x+K*Pq^VJFbQXW*u^9@y>)4;0FpGn{sxq$VM@}EdN$GW=R$AR(Xwd8}DpKs$% zGHv;_VvM_|T{?*`mry-`{~nFsh!<&$@f>M7HpMa0w*CTsjwHs{e!Loz^Xw8SFeYZhTTBx}%sAnnA~wGp zq6fN$DZZBRiXK^gw$E$(4tAe{`@MP8WN>zGgL`g*{e8#JX1}vUg(!dzunaE;-&ZRB zB;V0a)QkLRp0E25nL1cgqGt`b1b;*9qTT{^6MZp#7Oy*xe$&7CB%ZzI9s>eu(HU_XyLcF*4P ziTE&2<`K4z0eIJrP4>ReNe3_J{sFZCG55C&Q_*{&_TC1bkA1n)K37{G|9fZrFgsoi z?w?%ys(NU89_aV@GIh(C-*(R4?$bzqzbIJ6U|#)3iE(cVk<8zj;C9_3`MEkdzZndO zd}T~tXUcQfe{>Pv7eaaKU;BO^(g?x1CjZi*D2K4;9x*iAFO_tg%15pavslmTqGF7n zese6vz07Qk(%84E<9-0YKSG2@{c?aGNAw{7a>$$J=Xh2mdIywtj|t#D=HRjSlI)%X z>{BDq_kku5KSTeKV{&HgE#Ffh^JM$3g=@!7Q$5M?dd#t7KPDdM*t>^4Q~9lNuEpN_ zOX`VxE*t#{xnJv!-^B0Bh<>b(J@3dl=IJjwY4GK>Qt<%66g}9&p<39kYFUtGA8X1v`8_#Um7#=E=EYdp=D0uwZz8nx9Mk z!=zJKYH6dG%Tqjp=lkV+GR8NEYMM_=P(SE>IyO$;F-HX1*73ln2I6xWjtWz#Z<4sA zc6*k}d8prKv~vtbZ)JOg9;5eqqU$7~EbUi5QkqZ_onnw`0MLQaUw5i(??eyK13VAEy2&WHtG^qn*9mkfPh1fg(N+0HZ*e)Ka%(fTdq80C?F z^s|(YNeYGB*=V(6XLfLs;a0hL9+v#5-5q7P4-x%gm(U%;AW{h5EzhHN$TZR$TPpe1 zt{{+d_MTp&)^klhJ}y_g-{pSrJ1Q@D>nEY}5cu3JaN)b9Uf4$jqZ9nuN9|7L+kSDH zxaz`NxoF?yLPp2@dn-+HrOEy4e~xCbnPkp zP_$WGG8zb+-ualJ@Pn3tJnk;Yr2l#&K z+t2_B=D)k+9kHvtk91Vvz^@aO@2W_oY zgD(@EEoY$f8#Ub1K5cp=X$fNudkv2$*A{uko_EM7+6!`@Lae8zju`$1%UJr1w4UUM}yCLBHV# z3s$P93LbFK@ECod3;AsnW4>?m*I~+p{cWR|^ZO}5VVM3yU)tzD=c_+3Ou*Eo9?rpW z{tzW743jxW54KT^{JErDgU-4-_G{gA{Vga(a0DOAzgP1Ke=HwFQh>FN<+mVL{P9@+ zBFTq;1$ycONrSI%r=O+e!o%Vtl3!Y`@71lfw7zdg@CYUKzl(QUTHnvxVrhME?@~+4 z`+Vpx9LSU0>ivbLS${D+6_^Yj{5SZcBy1!O6L#+}`j@Jk7^Zy4VH^F)QD{{8v~@}3 zUq%6P0TNLTY4f`cAD%;QEFb0SDJ-ElMFI6-e+v26Qap=d)c*{X!}yt`_Fkk*Y>7m^l3_lP% ztffn(EYi1=?cS~Ss$1VH-hGi6+F(@QSH4K_S^cGpWS^*{{!!X{4cjWaug~5i4d)%_ zeCYehtz~*`-P-kYj}x7d|9e#FC%b);@?Af79BIeTZ9Rkk_+F~k;N5vefvSl3CGNi$ zT;y}b!IGsC>ph{iP64}o@jJ`y0RJ#P!oPjCqraL767>BZiLljYbi4PK4^oBp-b!#kqo;mUy*N(<#+Bc8 z)Hfh-kO%Z17PEoFq)HG+P$+%xADW|+5BDb4f4EuwZ1pFymDXQpex6EZwcBL zUnh88!adDyLY*Ir|)mtK8joKF~V=_Cu5G? zgFSTHeHv-U?j3jdjsAgtU_Svd=*JI(ckSMv6CUHU-KS*l_lI^riQeBFu9kLkKUQgv z+m2-WWAFYWJT6 z=Yp|R&c2HdA?38rKQRbUF#Uu-3=q4=t|aEJyw7^R*pc9{$S3p;BAv9Gc7L4hkK|JK z5ES{_R38Kp;|)UY>;oKU_ipFd^x5t;G(W)Bc^lQvK;O`^?B%kaVe5uCuS-L)*G4hs zt#&T8aS@~UGBfd1dx4xZ|#9wepXan7L9yieUnzQF;_<3-a=)1kQ1vx&40v;m%ppN^Pe@?vg z(o4vv=%xB?_(f~d)NUeYV*4&h2b4w_>z4R~IE+W3UXE#%;r03E2jw~H9ie~};_X^4 zbGDv;-79c`-fumB-4f1dTqpVUYbAz$Bh=<|eT>icordf!G7lv`P0DM1^Do4#&FMew z*ZQrT?G>++I5YFCGvGa!0j=EFdMQ_bv&6P82YKTDzmNv%f$NM#tn#J^`>C_J(qJ0V5|5N)rwol5NzRWM`xq`zoe%QIz46PF)MCTzA zdW!M3y~=s#TKb!#buz|h_lq78dtv=*euwq{YYBh@XlCZX z1Sqz0X|JEl+4ybx9L!b!=Thod?2vR9wbQ4c!x~5R(O0+K`bsL# z!8-s={i=#@;|}ugL_2r3~svo%%tSrr>K2PQ7hG}>vZs+!Iz@$mtj8=>0GJ= zFfUyFIP<5tL*y<{ea%07IX}1cv^F9dmL}YEkm18y#ShQTkP2-b1@zzO_^X)|Wl%tV ztCNp$8ho(*a2vOShkby1(f3iV6aJVyS$l#fh3=eptH4{iM}(e0_c3fgELlG1$%0!{ zU!ol7eN%#7w8ZcPPfGjk`yWPE&f6&T=zE#AFJ}F2aQ2>R+FQ%;cCIS=?n{mKfUYeG zy1+-H%kbyCs~E5KV`={w_gnCY&-uZl+HXfV$>YWt#+yyYrGHl+lUTpkVeiG3?+p}v z3En0BlRwzZh>E|yisRA~VwXD35&iC%C+Blu|HmD_#r(kV*5{=@^G{blr}dxYxYEB8 zJ7xWA@&JGCA85fX$EUJM4-RYls9yMGwfYt1zRcyYItqKI{cH1^QN=_2KS_A3->qMB zJSwBy3ruei*-4=j_2v@&Mp;q6nLJqkmGoZa(%#uz@mRamAL+U3x9PR%Z%)4_0lO}G zE(Q*11owS7c`lA!utT2bn?=ppnyN8<@X(Bvbkx=*;RO1sjYI0%!KYfF>^JtoH` zz2Ccy@{k|3dl4llMD~r?gXd;_=JcKm<4frwwGRVIcS-QM^R7wl!vHt8JdYlfeh7xt zKJ+&;Kyg^@!~W^nhom0cyyHxE!}K($smId)KQlchc|<7bIT3tk3z8B38fRC$mu7NY zjLroKTrMRJu8phZaa+!HB8^~vtUWJ}Bf|G!mk^YraTs(I^WvZ8=w2a&;DC?F3+}Fz zpFd9Q-=nRgYC&Pb7LOxym89g6Y((|Hi>bE5CeX#S6kau@nfj!4z zh{$fVqLngFLOt0T!k6q7!br1^Valhc)L(i}Q`p2wFT7d!8LknzHoWEsy7$F5#KyN% zJRX=oYU{c-?(uqp!)KFgSKd$QxV7qiVuL^t+V{IZF0Wr;-U>gUv`O>|X`j-e-D|4z zd&6(?6Y72X;eHusgHkqd7$Th(&v54F**)IDI|Q$tgMfd7fHeBY)`!gR zG5&y&g@8J4}^a^VlwDYpF+Fi5y#E2N*sU&4>v=$;hm23n_z`;)h?fsF^WAdfvowG%0quJRml56N$B!}9*`XZ>J{PR?P z)X%BqkCydII>hXs-SdJpYBoDJ)kBx%Khb3+@wsXMYXUB46|X;}xD{W?BBV{Jc^9fZ~JD zR^pT13t;Q}g|p=ZQ0D9|es1e)wl16YIyoQw^HF}a=vOwS>sc%LarFMT-7kf9grp*A zK8;0m{{(!vhftUKpmyXj5eVaBFe?2MJSlQva%TPl_yUe3$8oghVzfus$AkAt`Lf)I zf9kFWqow9QVciSC);(>##r)*@W`4~3ET|v*gJd2jOm6EB%5(e9jh(->c~{!|Fw0$0 zy4UL>VM7moTx0mxz+0I4-H9>6i!?%-R&f#M4+sJFU0k#mIURE)zj#39LBI23d@k*i z{G=ac>%z7UUQKQ>g5|u=aQ!BCw(f`+?a!P=0|f?tTLkFR16)1KU) zl{x!WJl~1dD|MZ*JpUCuwd5j4Z(X25`;KX8uC`admumb0KM>O1GYoHfF-+uhe^Pr8 z-2YjH7KC0j=^W_NBWqc{aY5Uc#MBjJU z?-N5Wv1Dldo%4P}`Jv@>9ifcxd3m1DublT7=Nq3)ALr|OvgyT{+F|}gM*A0O@Wbq^ z(V4yAzF2)}?;cLuK3eqsgJsO#Xxy;%Ta2GRJsQ?n^!Hp^_d_n}^#P8e?=?qugy0cu ze8RlO(ukAacL>Zr89tq-+IL6|Z<^kQMfqraL&s3C@ncN&e)Cq&rgi4a_=kOeI$SOC zkV#+1`GMYJZ~IGj4@Lb#DQ|v|t^a0b>i&b6RWB+Z2>kr3ujU_P@0PUnQ&9)#u~y0N zqKNI1#sxZc#{K7%1IG*=`zWU=olQ%{E`FFWJRj%h!e{q6nLhS6(It(K&>sr*%HM3K zjHC0fTEO|m5=Y+HKPc(0+)nAc(=(uJ5S2~LrO(E2IpY^A$JJ@{B#`n@iGG2wk#@h0O zL7T#us6BnJDO?_;qe5@A9(`El&eo%g($1jDe#WHh(c-?44%1;q z3bwD&MwMeE%%yZadJ_CoS&weh_Sn2IvIon!S}(FYSNfb0tdxGVd0*sz=LH`90}m-& zEq*=vm;J8U$~W&b3>ft<9#Y7h{ZWo>ybhl@#^Z#&Uuox!ZG1I9)ZRxA_a9<-yPvuK zK}JXOuv47hX!h*M=LE0Hr>#59Kkq0PC^kzu8+YK>1N7q>hpPo&A+=b>i-)C*3_BJAYDW1~08x=xVZx*vdcR{DTzo)eAgP?vq4|IN2)U$eR zBm}^_c@6!cfb&;iWq7N!&-F`j^25#pZ(a*%vVT;5oZ{?E@pGbjj!658Yo%k_h(4~T ziHmt%lnqkR4&0b-@2Sipe2`09_p$oy-eugUKusaJQ2M|u3a;LMoyGxMe}>Yq<4!oi-=C{>9 z!r5MQF6dE72f99B>kKyEHT#(JZf3yzVet<;^xRXRe6f8P$Q#-Zdo)5Z=C_EgeZ`~t zUdCZLr*}lx9^SSbU!%l z$#>TxJ|B?swfI~}J!K%niKD3?EClfewDj_Gadd!=Q>pGtpDK0k5K(~uez;+ zbm%^FepKwgeYZL7$@l7DAJLxRsMtf;S>UmKnQYVT5Dz{_M@81cg}k;V3)^u{Xi1eSYBb zVF~4cPnZdyzrg7nTX*s=?xq9<*B(QT*$yjxH?bWye`f~EmDv~cGxWyZH?FiZmk55P z7t;{bUwX*wOvAM7jJ3o3|D5MD{h~t#+p36CnwDJk(AVwU0fjm-H?0twY)B7a` z@2(3Sar^7%uw94F(5`1|wClm2^LCv)L%WXEXjiY>F17nu7p8xFj}E`5Fevibc)rBh zMGx_hvBjFdUSh}zOnmm1`#2-ib0lM1pYtz7F4;ky-!|^$WHb-5 z{r!3!w`|=yH~VZEcaO;YvVM(}%hYA~hpkVyQHtB4^w(ohrC@Z}dPGs%S+QQLcGJfB z!pxL6M*3p&qG(;~EICJQ^P{vU_Ql?_fWHpQ0Xs;=qkY3+GJ_cZZGChu4cmB+6*MBY z?`IXSM-I(jh+RAmYHai4!Yti4lwqIjlh_NpPiX9ZDL+i*0CJSt1v-W)rYvvsK6!5M zXV|@L!6Ni3_0RS4JStD^;qnx7dF9{sPJyexN8(_q7`&gnei^`i()z(~pGdi5&X?Jr zF~7myrwERT{Mb2Q$SL|`>9>1_lGBV27r0Mgtz@FfgdKmfOFd~ zmvp`IXD%^IzOX0p3e5+6Gl80Xjdyz_ou1N5#O7*m}loD(%uKezm;s7M=s}IXI{rwJw&4^nEqg0fc`~#mZ|gcnA$Jz zv((?mN%lMNtBv>r6kQr)e0B9NXa^M0Pwhs4zMe(#QTosFPch4XEB&CbUB~x&pOd`5 z1v$VxkL?ig6QO(#SLP9@*OenXcd=dl-(f1l@|3{O^m2<;p7c53o9Taj3;m&B{s#Oh z@F()C-olS*9bpysL%6zG`h(gDE0kS)Ap>CF3I&S|Qdt)z*$!!3pj$!4h#`Ojf?@-s z;ae)=aOXsDFEJec694Ic94;Nf{g|E=8}PRp9Q6&=o82M;H-E7(*zWZ34RE{6@a}ek=SzG&Q>gTq5~K=TZo7-6;H-*CO%$Z4#f;%5ipK6T@W}`4X>_@@a1q zr(J)pmFP9U4EPM;cr0y(eH?D9WA?1+HdoyaCLtL-NFZHPbD9oXLwuRbLkd7)N1dE zihBBg!glt*zbr5CZ(t|TPQ=ikx6^t=H9vSADSD(|s*lO{I4kA-13ZsKJqTl4H7-aD zd=F4N3~xryA78Uj1awT?9?tF=Dylm8Q)aF+<9)O={FW$REKszWoQ53eZ?M6E3SM4duzC!dK=0d42Gm{ue zA-guqvF$51uH&RPf35H%`mWE61^mGL)1vm1`Nhd~jY8cDp>K}hfj@FBVX$$#joQ1VcW zK4(Pu&Lu)9v=Nz%Psgc>_3BF*EPBt@{B7ua%rCf|P@N&8Pm4#TPlh+CE$hwZk1(_BrR9tBogO z7t8i{%ey%754Q4PZs!{0Ky7Tt^S&oBvopB=y_-*O;Gx>+{v$Ha|7ndKCj^?-l>t>|93A z6Bu2X4--2l%)f>{g23WNsmJD>^XH0TkIomWoCilvb9;hg(ylW7LU*(tPUw(h=RED+ zMO*)|eA}mhUp+yX(SHbIs&960L9tWwua~&e{)#Nxc|be&J%8~lxj-A)@w@0(7scqO zVnOJ&^L3b)14H8t49@<&Pd`6SbRpjJsNg?Jzftmzi)8)|`-t?r=s!X&JB9s;6ONq1 zer$2=m5}3^od^7>1pJ3-K#lB1)tw_|@$mz=ZUafnPD3AJ?&C^Qk=M?})8mfS0OgyM^%=?MFJR=l+mJuyG7}@wSzO zk7A$lhc(9f&Z{Vm`8Jn-3;s$Pv8|gy-oKir@)Y}&KddpvZ+zzt_LIwFW0eBZ2yXet z^Q)I{B*!3Y<)~c8Q_=^TRpWDI{B;Xh6Nm&Bi```84&qi1*lhx-*P;Z9Dx_Cy_@_opv9 zPN4Zd(KW0w`Wfxy_XbmPw%i5QWV__JB#QXq4eTZ1IM;Mc0U?VA)F`r?)ooGua2`;zT$hCO;X~Qh z|2D1HOvS!zs={~uJV6zCCr6XQbmiTZb25Q+zZVVQ6inW0+i}^4e}-U1zD3@Dp5%LM zihQ2`AB4{$&p&^BrdQ#oB+ui{J(0GKmA~|Ik+(%0@jd47PjY%c9sDJq(&c+1UdMp; z{R|t=F%Dl(Pty9nEAkP3Vtu(t%18bW;dA|;VS4;C(HHeg%HzQ@_BU+(;EaAxqI`wl zqkfU`X)?d(t%-j8dF5YB4-)NP9G$ECf{eeD_;0`E$Rqq>%v>=~X`mn3jF0BCzl_-C zO;@Glxy@sikbet!v!jjefTpy#!F>NB)+Mf@bSLt=__4QSmZTf|CGDd)8w9f%zqw!HLD` zuTD&y{$3jCCG-UR?4UT!r-I9TXd^yxyC~*%wF*9zK^k*mgf5Di9{R)dP+p84C_4qz zhk23f*E1j1$n$QAyxl-X!PfK9UzpcqGcupC`f%JUR*(9LXRIg3=)K*#K4R-YD98H$ zlsw1$ndw`vX`-u{ewMVJTJ13Xgue=2HER2!d5z+?aTNL*Tel`U5Mb}VM(aQ3N0>de zbGD}MfIC8jC*ktCpV3A5e8Tr}jSDkpNIR7-vp;sv!kFe8ewk@!_xC&e~yZ);VTp-6wqwniQ=S9`d;oKZp6t#B|B`75CnXq<%j(1nFdzjBPQ8`P!3IcnW;d zLBm7`a_l`^cOM2r9Q6A~kKvbude!fIyQE#7FuflqUXAd8Ui_<0RuLw9e_O2LZXm$!_!JLo{EUzj;jdo{D6*&Yebmnr8e6Be zd^=}ff04l1I(KrNC_6`Jm__wcRbF*?7mV8zS* zJJ!xgub%W1!M?*Aofn6IPzd`ao<;b82X+~#vs>l9hqvp!SkZgaYWGY&>LEN7Y(KBG zRnou*JbTWQeH)`E;%i>uU_T&lX;0oiFu%a|vCqtp3v2L0_8pAQHfk3X68i)0d7%|b zKgJV;XC#XJ4C7Y_!JrWFiGHI zY(IFr%2~Ek+P@jZP_Xu7W{Tk3xV~M$yaL^ag?f|p>}gW{Aspb-{3bH+6zqMu3ivr< zxKN+K3wLdtH#)#apZoJ+ zu0X}eZ{a8!x9pyq6}lg5`;c~@6wbpE310Tq_)GkRQJ`Sw4{`3!NBSz{(zx($iE(a` z%ayd8r~|!MqWj+^fwOku{G(4Eo{fiZN<&zl6=>_^)BOU{^2=UWgWyqvN>FW!}z z@f;`O_`H$rI*xzP#>aLkllDH!KjtUtmB;#*@TNb)zbo)6ogd5#XqjHo*i2gE86Rc< z`~C&w8zIh@1}}TFwND&W_+c#smzjAnz@zuL%n!A3-QEi|yNBmwI-~bR-F!$wHF)%7 zwR~84&O;b9%7@@>^Afp?bxpH z^=gl7K8ELLkL81(_?{Z@AvQZ*F-|KU@M#snqCYT#HC~O9G`>QC2f$O- zk9seAL871Pw4W9Ni}=G-BszamjgPXZ-&Hj;Y;B(gKNBHTOXT|l4{Ea!3iTs#9 z(BN(ElzexcV4OPo8R~xoo9AF0m_zyX_e;KwS9YIDR+{Sa9?@7@@P;f}bj{-T2FHv6PM*t`a<9BU_vQn^hSCp@dmH*)c%A;K+MDd!9w&mF9BBI)q8qMl3qMx9_t6{0sR$z#Ug>*e7?kegA(KXfKNZ6e~9nW z^#X&tOY1lLX7deu|J2Se^8AU)YZ$Tj7Se1rh=0mwJFhk73*;RusbUHkPr(PfcgmjY zaOWA{({%b3@M6u$9_zi5X0Ol=;IVTB){iC+c+Prm?OF(I(tftbRr1*$SIK94TqWNp zd{*yKsto-J{>1FD_6O!cpx53{X!-$MN>H%<_NV-F|^wnjhAvcrk7u z-{!M%J8^2A<(nM9?=k(Lpa1FS8{h##X`o|8XJN&jzRpVqN;~u2J%vtxu+QJw-P7X_ z@9OI*_&bJn?ko%}U6%K+>n`>8kkwLhX#77T)x*Y3=H%Q z_(Q#gef@=w!9r(Guwqx=p2CWOq2AuYz>49%f!!+z$KcMsfj!y5zP_GPGTApYNYJIh z6+PWM2J!>JihNH`U&jj2SsEPZ?(HHvg>?R#9~>;~=^q5m`OZ#%xO;Gy-?z6gu(PLc zcs+>epz=gp`{sTSyL$Cd@9;prf9bMzpGeR9?Kk!H7TW#2`JSP|&yduPKB~0?HI`QF z7#t`RR`llgc6a3m3q=0bfndWx-<}(K2bscL#4RFYpgZ3?=y&&a7WS?7Z_MwzrBLX6 zbD_6uaM${M9rU}j_VwMehnPlXsOP&ox(UsOpw2G{rY z4R!6(^qUGnNq?@T`uc`9uvF6T(ykl&m}BLVTZp*z`yc^1BDcT4Z-9jEmY_t8B<3kx ziCYLUVu39sIJu?3B1Z5Io3;+*I|^~euN~^{8SL)W)|YN1ey^kcB|fj~+tWWZSfJJo z5|^X{grVFsYX(Rv_Y?-ZJ2tCie&GX$=l|~w@BP;ICw_S6FZJ9%pDp`w)Yfz{nDa96?a z7$T7%iOoxU{Zc>iEs1hnPhZI}Ry<>>*0PaFK5HY!73d6qUuWTyHIw5zoJd8?y-l;M@&6##SE;f6HIGBN!}{{Od@ANN{&k|7n+ecV*p^rN4RA=l=RV2lGqU&HTV` zwBCHt!S(*O+}E2Y7X09k+kU?6H0$dW?e#Cr-TzO`9rgcKvK3w3d&!cRrRXmCy?ulJ zo}t0~j-CRKcs>pOe&0@i2Q;Fznhgw$4}m%&RQ2Z?U)0g>Ad@^eknbj&G@LK_d%OF{ z-6(Xf>Gk_CO4fR=R-MJw@5m38$YtOrYd5JF-uOmyh+FwSV7ffys4Zgiye)~Yax2xb6dOO80@D2K=p*=ea1FQYk z!oVJk#C^Tj6?(g=t(~0%WLMVgrGXQ?ZC-ilWtU%Z2)C zNsOq$T{P$t(|i5Z1}SvCxv+C^wZEmiYZpbFkl$-~ERhyeZ;=a8M(^fUVL1j@>B%*v zQeQ_mx^ZjY?m{pBQIg9*H&T~hKhQVS-`YpN3Ipr+4HkOAlqrBj!^0F{xelTYgna!~?Lwu}0U_0IER;q(0wE zzQ=V1IKhL38dz(?S;2TOlIPc3q8ZP|zP{ZxP*w%0L1tB072X>z(cL?{$(X@__7C*!rL4{kdR=4i_ZJ3e_OBC=&hApjK=&TX21@F_J383Hq@cR+m)6#OS|R;(6X3Ji{tLQNICv(V8^)9%`xD^si5l@91EJmLhc zvB(rH8b{$sVWMPwF`fwr%7($l-M9xO&7T@m={^mma*Rs#s0g;~1tP&7!U z7(JYq6;Z!bpm}aDS!XiH3Vl;C4hqD!8rxKX1ttNurrbnt zXrWMrQZP_Jblai=1+{Fc+uatmUt3hV3u+6kpKh0m-q2TC_}()!$DZ>iZnsar;UUuR zyyu)bbJ5(+%-B2$rnVYa++tHfm*4lwXtZRWC`ta3jD8V`rtma0oBh{`A#>`_AM)MG(d~RFU6DE&<*rE`} z&Sww1RPe#5Rl!92hN!%GxsErFmEkSr%@7tMo3(T#$``ZkV)vAz>zSyLovHEpI%Rg& zDBDq(uxp(xlpNki7Z2FN(GCpIRm914f|Z{*QlP1$3+1dBpNVuacH%lY&1u%-FlZb^ zT(~yY9o@M7!mgb=H*Vn#Bs;H~m_qg|oT$NSuzBg?z%c7x()#Iw{t=pav~i}Z_3Q!yYvI~x7cE&9H!cm) zx^iIhK)Q#1ofG5N4iC`fnj>sIU|Hd6)nDtcVp(nRKDxkvD0%p(*s1mRbO6w4rO_F& zYv^ETBlX@Kp!Qoy>!|MylGZ1BjzH4Ro-26DhRKt}wf#r84h-#>=x(8NtSxL6*g;32 zz5V-pS?VOKx9?!|tM2kF8hE%2)k843Ky%a1Mg4fiE!V@xYK zjeu>4sI1xP!!ARz-wF$|!)EHMG#0GJR%TxOie9>+Xk6c?O_gyHZdOL?uJMzjy&x?^ zc1lVuV4ZfnBs)vu=PUg8nV>nwx2}hK`dC*M8!cOpSj)~f&kn7{H&NU;ZQ&bA>OHhN znkM={S)bd)=|9_?(GPy2vF16CwcTSs{14N`L$h79ejA&kiLC+K@R}Wv#(e4PNge7N z?xRheQA(o&9`mS$exvl0vHHsR4{eano#`Z<9q-Vui$0D1GU_L$4m0xyVy-1TzuAx6 zsTrFlt1EMm1E_S@^K!RwUBVd2#3p?oU87*zK;w{s+GN`n+D2!T8Kn8Z+C+O?zB1AVddRqv z!S`VMdfDaoiQX`F8Qr#p8la_4TX>@<{ezYCFJqTw#PV!9?d_PDH2O(VFY!P>ZQglf z*rCPb0m(k2FPN75kzV7Nf#xo2JD+E?vaX!i@0xk3t9+YzjiXarYs)9>eeCN&*W~KL z)@2$4ZJVg){qI`yw+;50m(`7(in&@F8@lxabPI&>N2reF*5WX z=$!b;n%#g$sq2pwWs%NgPyeC)SJCd5wn?2{x(|uAR>tOo?u}u)}U!$H8wRhH8-_1wKlaiwKs*DI+}ycjm=GTV_i#gYjaz3dvmC{qb1nV*wWO}+|tt0 z+S1n2-V$o*XbrYDwl=jkx3;vlwzjplw}x6f+JbG3ZB1>>Z7prBZEbDsZK1Y~_F#Ks zdsBOJdrNz3ds};Zd#Jr56bvGrJE8e9L^u5^$(A*kz;#u;Y`LRYSl`hkT*J7;T^ z`9O${4A@;CtCDm`ZuAecwbd=l4%w-=JRU_=YZR}mR+;AX$upFhu2W{5D$i2pD0Ax< zxE895<)!kK&a0Fs9ZxCGDK9JEQ+`nQ!vA~Hb{urbs~Ys<3muKq7dV&JEOM=IZE#Lou0QHt>Rjp! zs4cZy*B@)IneA2mt2cHy_Nz6)*{&sy`7Svea$ewC<@9=LJYj8_v#zGi(dnA!an^aF zUG2^F&7KC;d+f~Z7pzd1&z^VYf>YIR|#sMQXg8HqMWzJLeC2qDXSs8) z`%Ld9Z@_iR@!X}o7dSgSGs0|@xVx&}^rPi95B&02^K^Nkdzw={cH1q^t6cSt8jtT| z@y#_u=jea*4ywsno31&v?$o;7HFNck9NX-;dEN9`H$@k_-TDt#xXxW7C(m}wb1KKe zi)VDYMr)`PlOiMuXNUU zlxc4Lo*PTf8IF3#hn?N-I;T9n&KaVK3#g}UJ+`xMA+@DVokm$}Jo>+%;l0T%$qtvx z?N&T))l)OWyP$S%-Mo6=w7Tg|pJV3CQ)*_*bDVy8u4A5OzPvzLJX>?DaGYJ+AO{_d zN|XGs@`&=N^D*^L%Db+=DDOGmuX#Lm^w!%S2=0#EdRuzIe@&Zy!IpRb+_37ry_a?W z?55lAxa(t&JoU`8-+1X;-+t|lH{X|>#tPluxq404`Ip^v2L-?Q%(E|j`@1i{@uoDf zy02#I`{f6EZ@TN=`@Z$vm+NPo)wz0O*X~RAUQTy9-G0|2ROB1qdi{+zEA=xrb{*)| zZ~DS>&%f})S1NDcc=N3fKJ@$x-}vUsul^*G`RaFG`tHkJTet1rb9whIcij2Zm!E#& zYcGBCl^L_=T)Ov<@4WZE-uI!`UZ1wOe_+AF?(439;>jDHeQx%gMT<9W-nxyg|JUE} zrEmP;hyPi5`wvG3?;INb)R_&d9)9xa7ry!OE3e-ZzB?1VbMg0o@ZI;fZoA}Ck2>AA zY}H%8=^tocbKbg*>AQAZF+BFI;`d5F{w2LRLF+#4`0LK&8`Swu_l#qopQbPEm>hL%ehr?0lbUA9>^0Zm5t)BUw-5$j~ zr!MMT@1TdKoHN|h>pGna&*;|roL8QqkGYQL9P`}A|Kix=nO)@kJa?@_|2&0OHD2h@A5_nAOn02)38^bw$KRjfS69tA+p%Q&lIi+w z&f|B_t(`UU3D+vuYFg9$HTv_X4b|yCnpfx2-*@S+*ZuZBM|;h&y{GDVRsVOF*T34~ zb%)eVYMpzic9G)}=bjqC_tFAX6xn&YylDQVwVgFJvfnA! z(7wjC!f}qe+%IeGRKTgyg7SEkg>ok=?o=s@SD7a(N(b$foC>WN@*>3{*D|{(gM6wo zn|4{0o9b3&kHf1hl2=pNIw~2U>Zw+Ti&hzrQft)8nnWX2m=`D=)IL6zg>po8%2c_m z$`{Fsr%v4`D>b#AE@eK|C(G^AWE!KZR$f{oA9TuYYLqfpaXNg?div^?r^__&9SfC3 z^j}z!J*uqK*2uKF%EQWO^3@KfQX{(^KcSgGt@W@P71ixk`y!i7K>VqqfggT=Lz@yqWd# znd;oy21k&lO;MJ~>uJs_N*zttD!G|zRTLLZ_i{y*-(s_k{izL~&qt3e$Ul=mNe@ZW zR5}9=r~EmpUs9ruO|^~AYvs1-XVG+e9gS3{M_%Jt>XOxSuDcZevNg6-NWjaC#`5a&MnaO`%$@anlHBp3~aKMn!*ax>jj%x!5<^ zJzb*Tuq2=7q{jvosX>`T4^=pvE>%@Li=3ZuNbSxhRh}l#cFEJJ))_{Pt^;zG%B*qH z9Pspcq_|!&uc74W72oVR2R4{bb(-HpZ?Gpt=zX_S#N$?+=Zj_NAq^VFPd7d!b*cF| zW>wD9B`f{Dgd&-LC6M07U}iP`Elx4M@G>(~(kh>(d~6uAKG}D(#q66Tg{^#V(|C58 zNm4UCp3UB?%7!$hn@{&k(g|{#kt(J?LTR(C^iR{unXta^p-HtKL6HhHem>v$C(D*x zU}iq$N=2Gym17@M<+?{3e457>(|ycr1T@&&QCVfCm8hLOFaKl_ z+G-lZRP#}_;(3~1_Mz~*zrNl~702}^eUDjh=pD26nDrTX+cZy)TItg7Pd?uCpUnIP zD_@4%$A+r)$-djCJ8k9rm;RHl9~COc=Oh1Qb!30b{-w7cOc5_y@%)DrX@;4V{(`Id z_W&7xPw9NUV{Z#s!xCw*r?Y3B_~Kt^!Yf%pCI$!3d{EQ)}Nv2)L21l_($t|j@n~?eDmvMw*K?s2jtT@==1Mw z?;olBY+L#N-}9qxP%+-I!$NiyHZGQUZ-w{Pk7 z;`Hny+ovZ@KA#n|hF8h<_3d4Ux6hxI#}w=B`{oQdpKP!HDu~}gwzuc2 zWc&QAlI`p3vg6|Vx0h_+etev4Uq60Kw$G25H!9LOX48y+w~{y8{7JHX`oBoFuOIPl z`K0?>{c_o;WvaOEZ^Scu|9biAWq&=c{*8F`Z;ZcksagN5n=1$N%h_-`rJrJc zHRiANN*y8nQi}6D_Wb*8>1|XG-`^jiQM#-;?dgZ7NI#v@d3)^n*`)Df6?=LQrSoGC zd-}2|@~@a8o&D{GlhxlkMS5t8^wm?OpEpJN`YF=4P&z**vQHOFKUq63oFbjQ&V}dK z<0oIQ1HF`qhRw9xW?IYYc}n8jpo5fd-#_mm^E!V<`82D{-IUIb7uj$D{m;K+y4T1- z$Ic%Sk8}ENQH*zYT45>lZTYXB4^9=w{~Y zGruzH4_kkCDMR_#(0JSA?~!>H**b-jme8!>zt4h|pXD)2vTtqKw5FGpwdafd+LRxT z?>eYHdwXzv7f{^Z{sh&}r`x_f((jq|>kcz_wBG!@oXXEBOly8ZWR zPj97-AD=h&^ae^l&8Sh5*3;jSw6}j3na5a`7CL|6>lZV|KTP@U=NGq=`R|$K{|woF zz7_3b7po?RrBMIll;1wzpCI$!J}dPV@|lyxr9i(jv3|4U*C}p4pZZ(%y-E4)?Z^D@ zQk>7{8fq9ncAZUs&xap(v3bmo0qyB*+q8l;iiW4@J*olos}!YA{@tFwm(qD#UZ?zg z*|FmtJ`e2a`zW35uNKk&Y~b^i?=K6Fo9hr?zFL==kMDE&a-~20IKU!ba+q;G|Ekuz zJo&i!ddq*~eye`I4Sv8ZJ~0gz|JNUExzD7fAHKybQnE_2^@pX8-fSl1trdhFQ}Ai9 zvKk-kcS6b~NbGU?!vj}z8(-+&iT%l=6W{6H8S^`p>1Ox)@u%y%t^4$hLW7B(rq;HJip*OD z4bp85be~MO@%-?CZuagGBl!xdmfd*QZQe9T?Pf#HS`Mm7DQK>46Tim@I0i0&lh%a~ zUS9>QS^*ws?=5Eow+_x*3zf&K)#rgx_C^!Yqf(zg> zShY?p`TPlhqu>u@*|yM`-^Ku=humr){9oRh>n5BE)?Uwt)i3LMCZZ2s2God zvpdCjdbj8jIJ-xTkAoBJgpUS3e{^sGJi>N}w)`5~@Y-CwTy)|}(K@&QE`i6v+ErqG zC2$2i{vk1cWKeV*tb=pl@Q_%36kGsjhsFFQuzs}|uYx0NM@0i)J}Gb-oCU{IV)@Wf z(NS<5Tm+AUtKh&jV*Ocg@LDlm1jqgf;$ZDMF&+gcz$tL(da-=+2GJwn47dPRb+LR1 z96T<@gVym9U!F1RxQaUq);}ti*KQT-7CgNz_Cw@ap^wM;m?T9XGM>l5S@QObml?PxrapuMny*+6)im`I`etaqmPTO zg7qiFc;-pb<2ljUr$iV3RkZ($qO)M%m&N$V)1sr#ijF)dx&%%>FUDgpfD58Wz9u^I zb?}R#vtyzw;N*A2_&7N9T``^j>)^>q9xX0Vq3pc zYeW~;iuSJ;t%Eb0As!Ju4wlXr-rn zPJy%FF>nR!-zC-`1}DI2a2{L+s~3y)2f;D04ju&;!Bw!fTO3~moCIgU1@Ji77Zd9b zf#cv2a1LAoOMArn1K=n)1H3GfIw3od|5;40X6gV>%RI08<9b#NA( z2baJVuum7;697lRaj*`~fb-xYxB^y>L3_Yqa2%Wh$4A8aQsDUg5C@Ndb5Dx-OJLsN z#DA~jPl@@ZFNoH_A#mwm#rzep?~7tQ08TtD#=~C`9sjE69JmTjJ`ef9<6!LtF@Fr4 z1{c6;K`dVaOJ5V?0dN$Y0%yTv;0oCPb#Z)QZ~~kL=fP#L`l49B|J&gIBRUL@fwSN| zSo?ukUkp47E`zIJ{}09bLf}zw8C(U2ek9fx1qWUc<6&?W>??`+qu>#69$W!yKZg3i zIyeU|gMF`x^@YJna28wyOFt3o)4*YH44eXIz9Tm}38Q*2KN90Mo8X>bl)1XsYm z{}RU^1V_P1a2lKg7r_;9>@{)xS+MlF7|;A%^cc7Tj{ZW-UjUcDpQR^PF ziTxYc|36~+B)9SbhYY2aki(>%{U! z@HkjnFXj(}W8l&zF~7Q5bi}&hjxWCyxX>l$uYf}ri17qCyG4u_!Rl5q9s(DwKXl03 zH%1S{+kZbJ7l|%_qua%J9<1*WK?Tn3MWrF&p{!5TOO z4ufOhI5-8?!TgzVzCMjYJO>^F7r`ZP89WZIfU98XUYK8C4IBUm!69%I90Mo8Bj7Z6 z6r2N(fy>}3*!O91`ZaJ690o_hac~l>gVW$FI0r6(i{LW20+#L*r`HG8z(H^r90kY0 zNw5x1gR|fqxBxDK%is!Fx*w(=tbv2zFgOa1gOgw#oCasXIdB171ed`Tu=E+2ey|1( zg2Uh_I1WyNb#NM-1?Rv8a1mSvSHMyhrXQ?%$WXTdpe0bB%^!4MI0}w~lVBa324}%JZ~^22PeTgI1SE%bKnBF z2rh%GVCl2s^!vdYI0O!ZW8gSA1=hhCa2A{g7r-TO1*|?OPOk` z46cHGpA*{~0EfXba1uNM&VuvcBDe&ufF$G}B!30wwO!Nwncw_Q*2KP)a^4IBc8!7*?goC53M3^)rO1?Rv8a0y%iSHZqf zn0{~&90o_hac~l>gVW$qa1LAm7r|w41*|?IPOlH_2W#LEI0{aHb#NM-1?Rv8a1mSv zSHRMvFuh<690Z5KQE(ib1nb~5I1A2$i{Npv^q4q(esB(8#wF|dJU%_@VKE-*6CDMotmpA~`O=V>KW{x>$Kw@n-g-Wc$5YnxYuvtT z#QGxFiXI22t>?>l`P>a+{t|ffxERlY%eRT~ad6;MVmt^gJ|Mq~2Iaw0S&aL^qdyhn1#sl&VmuDcgHvyc`Ln+g9sITE5IFa?7>`)b>+tE#{aK7x zz=`+7xDFnFUySoNmhk$s9<~*cjQ8L;=(7T@g45RXCcJ#8RxF>X6Rl1c9RN!{F`fn| z&J^P%>;88>{?ryRKC)kQ7OYzLYx43MIBebj$m3b-en;*qxHKS+uRJI^J|sGQwdf4E za8!(sUn5$(UUUqsgY)1DIBnZ1CN8XV`6(^;56F0pOB9~ zd%sw|04{>VpB3}x!TLjDy!5DOe-8Ww(NVDaMKK-*kAe$Ni}}moa9)f@z9qU09{Ii) z&sq0#@%cAu-LJ)+2Zvr0%ZI@ca1^YA)8LV^Sbr8Q{Y;Ge!Ri}gJP6LdDaOaa(l5oh z`YX{x)h^4*+>Q6A&$( zB|5S~bj7+~fS1o&_XBXJtp0!QsMY_^9cdHm8|@G+b&9T_&k^IXHKMa?MHj)+Ix((o z7M+fWR?io$Um$wi>aXV07q$AQxyx36H21jG|I6)}95Ei5D>^n$ba=k# z!UECSLeVjBb&(j?HPPuMqEn}d)@<7sHhoq0f-V}^{9*5?()LU)FXrTt$vAt*Rq&F@ zICJ{R$vAuUQ09qAvs15>ZGTWhE_`k>&c>;~IO$rl)G$PUURi25aFqQqHTpFEE=2F) zh9d(~!x8$VfEhj7XMFbb(fghn1{0K<{?HHQ8DK?NP5;oqTE+h7@Aa}~v&26WSD5pG zkAz=O;||joR(__Hz}_*>2LAa?>%7hif8bqO?6j1XXUCvy;P*}N&kC>D3{O0tY|(h1 zFl#$6AFk6V#@10b@bUBZw^16Ob|ZuJPx+5#jS+hyeaG?t EKiFeb4gdfE literal 0 HcmV?d00001 diff --git a/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/Cargo.toml new file mode 100644 index 00000000..2009814c --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-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" + +[dependencies.trident-client] +path = "../../../../../crates/client" + +[dependencies.callee] +path = "../../programs/callee" + +[dependencies.caller] +path = "../../programs/caller" diff --git a/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs new file mode 100644 index 00000000..58f1ab5d --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -0,0 +1,112 @@ +// pub mod callee_fuzz_instructions { +// 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 caller::trident_fuzz_initialize_caller_snapshot::InitializeCallerSnapshot; + 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-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs new file mode 100644 index 00000000..20151e03 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -0,0 +1,45 @@ +use callee::entry as entry_callee; +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 fuzz_instructions; + +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +// mod accounts_snapshots; + +struct MyFuzzData; + +impl FuzzDataBuilder for MyFuzzData {} + +fn main() { + loop { + fuzz_trident!(fuzz_ix: FuzzInstruction_caller, |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, + None + ); + + // `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-7/tsconfig.json b/examples/fuzz-tests/simple-cpi-7/tsconfig.json new file mode 100644 index 00000000..cd5d2e3d --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-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/simple-cpi-7/yarn.lock b/examples/fuzz-tests/simple-cpi-7/yarn.lock new file mode 100644 index 00000000..d009586c --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-7/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== From 7cc0858fd5f924cc6bdec29de8b8c23f5e20b5a5 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sun, 14 Jul 2024 23:13:37 +0200 Subject: [PATCH 47/56] =?UTF-8?q?=F0=9F=92=9A=20Update=20pipeline=20to=20t?= =?UTF-8?q?est=20cpi=20example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/run_fuzz_example.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml index 2476fd28..dfb3d6fd 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -5,17 +5,17 @@ on: pull_request: env: - SOLANA_CLI_VERSION: 1.18.17 + SOLANA_CLI_VERSION: 1.18.18 HONGGFUZZ_VERSION: 0.5.56 jobs: - unchecked-arithmetic-0: + simple-cpi-7: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - name: Set Anchor Version - run: echo "ANCHOR_VERSION=0.29.0" >> $GITHUB_ENV + run: echo "ANCHOR_VERSION=0.30.1" >> $GITHUB_ENV - uses: Swatinem/rust-cache@v2 name: Cache Rust and it's packages @@ -30,7 +30,7 @@ jobs: id: rust-setup - name: Test Fuzz - working-directory: examples/fuzz-tests/unchecked-arithmetic-0 + working-directory: examples/fuzz-tests/simple-cpi-7 run: trident fuzz run fuzz_0 arbitrary-limit-inputs-5: runs-on: ubuntu-20.04 From 738e604ea7848b2466a95b13b6ccee99b894f9f4 Mon Sep 17 00:00:00 2001 From: lukacan Date: Mon, 15 Jul 2024 00:30:45 +0200 Subject: [PATCH 48/56] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Update=20fuzz=20exam?= =?UTF-8?q?ples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 3 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 40 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 38 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 4 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 38 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 5 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 39 +- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 5 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 38 +- .../{simple-cpi-7 => simple-cpi-6}/.gitignore | 0 .../.prettierignore | 0 .../Anchor.toml | 0 .../{simple-cpi-7 => simple-cpi-6}/Cargo.lock | 0 .../{simple-cpi-7 => simple-cpi-6}/Cargo.toml | 0 .../Trident.toml | 0 .../migrations/deploy.ts | 0 .../package.json | 0 .../programs/callee/Cargo.toml | 0 .../programs/callee/Xargo.toml | 0 .../programs/callee/src/lib.rs | 0 .../programs/caller/Cargo.toml | 0 .../programs/caller/Xargo.toml | 0 .../programs/caller/src/lib.rs | 0 .../tests/simple-cpi-7.ts | 0 .../trident-genesis/caller.so | Bin .../trident-tests/fuzz_tests/Cargo.toml | 0 .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 0 .../fuzz_tests/fuzz_0/test_fuzz.rs | 0 .../tsconfig.json | 0 .../{simple-cpi-7 => simple-cpi-6}/yarn.lock | 0 .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 5 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 39 +- .../unchecked-arithmetic-0/Cargo.lock | 342 +++--------------- .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 3 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 38 +- 35 files changed, 227 insertions(+), 410 deletions(-) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/.gitignore (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/.prettierignore (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/Anchor.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/Cargo.lock (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/Cargo.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/Trident.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/migrations/deploy.ts (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/package.json (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/programs/callee/Cargo.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/programs/callee/Xargo.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/programs/callee/src/lib.rs (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/programs/caller/Cargo.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/programs/caller/Xargo.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/programs/caller/src/lib.rs (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/tests/simple-cpi-7.ts (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/trident-genesis/caller.so (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/trident-tests/fuzz_tests/Cargo.toml (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/tsconfig.json (100%) rename examples/fuzz-tests/{simple-cpi-7 => simple-cpi-6}/yarn.lock (100%) 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 3cf2473e..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,5 +1,4 @@ use anchor_lang::prelude::*; -use arbitrary_custom_types_4::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub counter: Option>, @@ -23,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 { 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 ee2f1d14..16e11aaf 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,31 +1,37 @@ -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 fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::Initialize; -use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::Update; +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 trident_client::fuzzing::*; -mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "arbitrary_custom_types_4"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { - let init = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); - let update = FuzzInstruction::Update(Update::arbitrary(u)?); - Ok(vec![init, update]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_arbitrary_custom_types_4, |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/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 1548b67d..1bf30d76 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,29 +1,37 @@ -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 fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; +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 trident_client::fuzzing::*; mod fuzz_instructions; -const PROGRAM_NAME: &str = "arbitrary_limit_inputs_5"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +// mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { - let init_ix = FuzzInstruction::InitVesting(InitVesting::arbitrary(u)?); - - Ok(vec![init_ix]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_arbitrary_limit_inputs_5, |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/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 22a852d9..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,7 +1,5 @@ use anchor_lang::prelude::*; -use hello_world::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; - pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub hello_world_account: Option>, @@ -29,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/test_fuzz.rs b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index c239068c..629b3913 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,29 +1,37 @@ -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 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"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +mod accounts_snapshots; 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]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_hello_world, |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/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 5d93dc8a..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,6 +1,5 @@ use anchor_lang::prelude::*; use anchor_spl::token::{Mint, Token, TokenAccount}; -use incorrect_integer_arithmetic_3::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, @@ -55,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 { @@ -148,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/test_fuzz.rs b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index 13704dbc..bd8763b4 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,30 +1,37 @@ -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 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"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { - let init_ix = FuzzInstruction::InitVesting(InitVesting::arbitrary(u)?); - - Ok(vec![init_ix]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_incorrect_integer_arithmetic_3, |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/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 48c6f844..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,5 +1,4 @@ use anchor_lang::prelude::*; -use incorrect_ix_sequence_1::ID as PROGRAM_ID; use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, @@ -42,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 { @@ -91,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 { 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 a0b6b879..f2b692e5 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,29 +1,37 @@ -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 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"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { - let init_ix = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); - Ok(vec![init_ix]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_incorrect_ix_sequence_1, |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-7/.gitignore b/examples/fuzz-tests/simple-cpi-6/.gitignore similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/.gitignore rename to examples/fuzz-tests/simple-cpi-6/.gitignore diff --git a/examples/fuzz-tests/simple-cpi-7/.prettierignore b/examples/fuzz-tests/simple-cpi-6/.prettierignore similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/.prettierignore rename to examples/fuzz-tests/simple-cpi-6/.prettierignore diff --git a/examples/fuzz-tests/simple-cpi-7/Anchor.toml b/examples/fuzz-tests/simple-cpi-6/Anchor.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/Anchor.toml rename to examples/fuzz-tests/simple-cpi-6/Anchor.toml diff --git a/examples/fuzz-tests/simple-cpi-7/Cargo.lock b/examples/fuzz-tests/simple-cpi-6/Cargo.lock similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/Cargo.lock rename to examples/fuzz-tests/simple-cpi-6/Cargo.lock diff --git a/examples/fuzz-tests/simple-cpi-7/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/Cargo.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/Cargo.toml rename to examples/fuzz-tests/simple-cpi-6/Cargo.toml diff --git a/examples/fuzz-tests/simple-cpi-7/Trident.toml b/examples/fuzz-tests/simple-cpi-6/Trident.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/Trident.toml rename to examples/fuzz-tests/simple-cpi-6/Trident.toml diff --git a/examples/fuzz-tests/simple-cpi-7/migrations/deploy.ts b/examples/fuzz-tests/simple-cpi-6/migrations/deploy.ts similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/migrations/deploy.ts rename to examples/fuzz-tests/simple-cpi-6/migrations/deploy.ts diff --git a/examples/fuzz-tests/simple-cpi-7/package.json b/examples/fuzz-tests/simple-cpi-6/package.json similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/package.json rename to examples/fuzz-tests/simple-cpi-6/package.json diff --git a/examples/fuzz-tests/simple-cpi-7/programs/callee/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/callee/Cargo.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/programs/callee/Cargo.toml rename to examples/fuzz-tests/simple-cpi-6/programs/callee/Cargo.toml diff --git a/examples/fuzz-tests/simple-cpi-7/programs/callee/Xargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/callee/Xargo.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/programs/callee/Xargo.toml rename to examples/fuzz-tests/simple-cpi-6/programs/callee/Xargo.toml diff --git a/examples/fuzz-tests/simple-cpi-7/programs/callee/src/lib.rs b/examples/fuzz-tests/simple-cpi-6/programs/callee/src/lib.rs similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/programs/callee/src/lib.rs rename to examples/fuzz-tests/simple-cpi-6/programs/callee/src/lib.rs diff --git a/examples/fuzz-tests/simple-cpi-7/programs/caller/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/programs/caller/Cargo.toml rename to examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml diff --git a/examples/fuzz-tests/simple-cpi-7/programs/caller/Xargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/caller/Xargo.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/programs/caller/Xargo.toml rename to examples/fuzz-tests/simple-cpi-6/programs/caller/Xargo.toml diff --git a/examples/fuzz-tests/simple-cpi-7/programs/caller/src/lib.rs b/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/programs/caller/src/lib.rs rename to examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs diff --git a/examples/fuzz-tests/simple-cpi-7/tests/simple-cpi-7.ts b/examples/fuzz-tests/simple-cpi-6/tests/simple-cpi-7.ts similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/tests/simple-cpi-7.ts rename to examples/fuzz-tests/simple-cpi-6/tests/simple-cpi-7.ts diff --git a/examples/fuzz-tests/simple-cpi-7/trident-genesis/caller.so b/examples/fuzz-tests/simple-cpi-6/trident-genesis/caller.so similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/trident-genesis/caller.so rename to examples/fuzz-tests/simple-cpi-6/trident-genesis/caller.so diff --git a/examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/Cargo.toml similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/Cargo.toml rename to examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/Cargo.toml diff --git a/examples/fuzz-tests/simple-cpi-7/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 similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs rename to examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs diff --git a/examples/fuzz-tests/simple-cpi-7/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 similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs rename to examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs diff --git a/examples/fuzz-tests/simple-cpi-7/tsconfig.json b/examples/fuzz-tests/simple-cpi-6/tsconfig.json similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/tsconfig.json rename to examples/fuzz-tests/simple-cpi-6/tsconfig.json diff --git a/examples/fuzz-tests/simple-cpi-7/yarn.lock b/examples/fuzz-tests/simple-cpi-6/yarn.lock similarity index 100% rename from examples/fuzz-tests/simple-cpi-7/yarn.lock rename to examples/fuzz-tests/simple-cpi-6/yarn.lock 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 cc8aef74..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 anchor_lang::prelude::*; use trident_client::fuzzing::{anchor_lang, FuzzingError}; -use unauthorized_access_2::ID as PROGRAM_ID; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub escrow: Option>, @@ -31,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 { @@ -78,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/test_fuzz.rs b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index f9189619..8eb7341e 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,30 +1,37 @@ -use fuzz_instructions::unauthorized_access_2_fuzz_instructions::FuzzInstruction; -use fuzz_instructions::unauthorized_access_2_fuzz_instructions::Initialize; +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::*; -use unauthorized_access_2::entry; -use unauthorized_access_2::ID as PROGRAM_ID; -mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "unauthorized_access_2"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { - let init_ix = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); - - Ok(vec![init_ix]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_unauthorized_access_2, |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 c7ea855f..4fee64df 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -266,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 2.3.0", - "spl-token", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1127,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" @@ -4034,9 +4030,9 @@ dependencies = [ "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", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", "thiserror", "zstd", ] @@ -4752,7 +4748,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5055,10 +5051,10 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account 2.3.0", + "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5230,23 +5226,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", - "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.0", - "num-derive 0.4.2", - "num-traits", - "solana-program", - "spl-token", - "spl-token-2022 3.0.2", + "spl-token-2022", "thiserror", ] @@ -5258,18 +5238,7 @@ checksum = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" dependencies = [ "bytemuck", "solana-program", - "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", + "spl-discriminator-derive", ] [[package]] @@ -5279,18 +5248,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn 0.1.2", - "syn 2.0.60", -] - -[[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", + "spl-discriminator-syn", "syn 2.0.60", ] @@ -5307,19 +5265,6 @@ dependencies = [ "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.60", - "thiserror", -] - [[package]] name = "spl-memo" version = "4.0.0" @@ -5339,20 +5284,7 @@ dependencies = [ "bytemuck", "solana-program", "solana-zk-token-sdk", - "spl-program-error 0.3.1", -] - -[[package]] -name = "spl-pod" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046ce669f48cf2eca1ec518916d8725596bfb655beb1c74374cf71dc6cb773c9" -dependencies = [ - "borsh 1.5.0", - "bytemuck", - "solana-program", - "solana-zk-token-sdk", - "spl-program-error 0.4.1", + "spl-program-error", ] [[package]] @@ -5364,20 +5296,7 @@ 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.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", + "spl-program-error-derive", "thiserror", ] @@ -5393,32 +5312,6 @@ dependencies = [ "syn 2.0.60", ] -[[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.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 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", - "spl-type-length-value 0.3.1", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.5.2" @@ -5427,24 +5320,10 @@ checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", - "spl-type-length-value 0.3.1", -] - -[[package]] -name = "spl-tlv-account-resolution" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" -dependencies = [ - "bytemuck", - "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", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -5462,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 0.1.1", - "spl-token", - "spl-token-metadata-interface 0.2.0", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value 0.3.1", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5499,36 +5356,12 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod 0.1.1", + "spl-pod", "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.1", - "thiserror", -] - -[[package]] -name = "spl-token-2022" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" -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.2", - "spl-token", - "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", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", "thiserror", ] @@ -5540,22 +5373,9 @@ checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", -] - -[[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", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -5566,40 +5386,10 @@ checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", "solana-program", - "spl-discriminator 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", - "spl-type-length-value 0.3.1", -] - -[[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.0", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value 0.3.1", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] @@ -5611,27 +5401,11 @@ dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", - "spl-tlv-account-resolution 0.5.2", - "spl-type-length-value 0.3.1", -] - -[[package]] -name = "spl-transfer-hook-interface" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "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", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", ] [[package]] @@ -5642,22 +5416,9 @@ checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator 0.1.1", - "spl-pod 0.1.1", - "spl-program-error 0.3.1", -] - -[[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", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -6230,7 +5991,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6259,12 +6019,13 @@ dependencies = [ "solana-program-test", "solana-sdk", "solana-transaction-status", - "spl-associated-token-account 3.0.2", + "spl-associated-token-account", "spl-token", "syn 1.0.109", "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", @@ -6272,6 +6033,16 @@ dependencies = [ "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6306,6 +6077,7 @@ dependencies = [ "anchor-lang", "anchor-syn", "arbitrary", + "convert_case", "heck 0.4.1", "prettytable", "proc-macro2", 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 2042ddd2..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 anchor_lang::prelude::*; use trident_client::fuzzing::{anchor_lang, FuzzingError}; -use unchecked_arithmetic_0::ID as PROGRAM_ID; pub struct InitializeSnapshot<'info> { pub counter: Option>, pub user: Signer<'info>, @@ -23,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 { 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 29b1c0ca..1d5fb963 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,29 +1,37 @@ -use fuzz_instructions::unchecked_arithmetic_0_fuzz_instructions::FuzzInstruction; -use fuzz_instructions::unchecked_arithmetic_0_fuzz_instructions::Initialize; +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::*; -use unchecked_arithmetic_0::entry; -use unchecked_arithmetic_0::ID as PROGRAM_ID; -mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "unchecked_arithmetic_0"; +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +mod accounts_snapshots; 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]) - } -} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + fuzz_trident!(fuzz_ix: FuzzInstruction_unchecked_arithmetic_0, |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); }); } } From 928b9cde2ac4fc7b9928271cf350eafb8d46180c Mon Sep 17 00:00:00 2001 From: lukacan Date: Mon, 15 Jul 2024 00:32:45 +0200 Subject: [PATCH 49/56] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Remove=20turnstile?= =?UTF-8?q?=20integration=20test=20example=20pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/run_examples.yml | 18 +----------------- .github/workflows/run_fuzz_example.yml | 4 ++-- 2 files changed, 3 insertions(+), 19 deletions(-) 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 index dfb3d6fd..64c82a52 100644 --- a/.github/workflows/run_fuzz_example.yml +++ b/.github/workflows/run_fuzz_example.yml @@ -9,7 +9,7 @@ env: HONGGFUZZ_VERSION: 0.5.56 jobs: - simple-cpi-7: + simple-cpi-6: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 @@ -30,7 +30,7 @@ jobs: id: rust-setup - name: Test Fuzz - working-directory: examples/fuzz-tests/simple-cpi-7 + working-directory: examples/fuzz-tests/simple-cpi-6 run: trident fuzz run fuzz_0 arbitrary-limit-inputs-5: runs-on: ubuntu-20.04 From 50ebb51d268e4ac49ac4a6427b987e7d83645510 Mon Sep 17 00:00:00 2001 From: lukacan Date: Mon, 15 Jul 2024 22:01:40 +0200 Subject: [PATCH 50/56] =?UTF-8?q?=E2=9C=85=20Update=20examples=20,=20updat?= =?UTF-8?q?e=20changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../src/templates/trident-tests/test_fuzz.rs | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 12 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 12 +- examples/fuzz-tests/cpi-metaplex-7/.gitignore | 8 + .../fuzz-tests/cpi-metaplex-7/.prettierignore | 7 + .../fuzz-tests/cpi-metaplex-7/Anchor.toml | 24 + examples/fuzz-tests/cpi-metaplex-7/Cargo.lock | 7007 +++++++++++++++++ examples/fuzz-tests/cpi-metaplex-7/Cargo.toml | 12 + .../fuzz-tests/cpi-metaplex-7/Trident.toml | 41 + .../cpi-metaplex-7/migrations/deploy.ts | 12 + .../fuzz-tests/cpi-metaplex-7/package.json | 21 + .../programs/cpi-metaplex-7/Cargo.toml | 23 + .../programs/cpi-metaplex-7/Xargo.toml | 2 + .../programs/cpi-metaplex-7/src/lib.rs | 106 + .../cpi-metaplex-7/tests/cpi-metaplex-7.ts | 66 + .../metaplex-token-metadata.so | Bin 0 -> 793904 bytes .../trident-tests/fuzz_tests/Cargo.toml | 22 + .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 90 + .../fuzz_tests/fuzz_0/test_fuzz.rs | 60 + .../fuzz-tests/cpi-metaplex-7/tsconfig.json | 10 + examples/fuzz-tests/cpi-metaplex-7/yarn.lock | 1363 ++++ .../fuzz_tests/fuzz_0/test_fuzz.rs | 10 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 12 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 11 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 4 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 11 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 10 +- 28 files changed, 8950 insertions(+), 9 deletions(-) create mode 100644 examples/fuzz-tests/cpi-metaplex-7/.gitignore create mode 100644 examples/fuzz-tests/cpi-metaplex-7/.prettierignore create mode 100644 examples/fuzz-tests/cpi-metaplex-7/Anchor.toml create mode 100644 examples/fuzz-tests/cpi-metaplex-7/Cargo.lock create mode 100644 examples/fuzz-tests/cpi-metaplex-7/Cargo.toml create mode 100644 examples/fuzz-tests/cpi-metaplex-7/Trident.toml create mode 100644 examples/fuzz-tests/cpi-metaplex-7/migrations/deploy.ts create mode 100644 examples/fuzz-tests/cpi-metaplex-7/package.json create mode 100644 examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Cargo.toml create mode 100644 examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Xargo.toml create mode 100644 examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/src/lib.rs create mode 100644 examples/fuzz-tests/cpi-metaplex-7/tests/cpi-metaplex-7.ts create mode 100644 examples/fuzz-tests/cpi-metaplex-7/trident-genesis/metaplex-token-metadata.so create mode 100644 examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/Cargo.toml create mode 100644 examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs create mode 100644 examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs create mode 100644 examples/fuzz-tests/cpi-metaplex-7/tsconfig.json create mode 100644 examples/fuzz-tests/cpi-metaplex-7/yarn.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 62ab5303..f972fa76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- 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)) - del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) - feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) diff --git a/crates/client/src/templates/trident-tests/test_fuzz.rs b/crates/client/src/templates/trident-tests/test_fuzz.rs index c22d93fb..923a9ca7 100644 --- a/crates/client/src/templates/trident-tests/test_fuzz.rs +++ b/crates/client/src/templates/trident-tests/test_fuzz.rs @@ -16,7 +16,7 @@ fn main() { // 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!(),todo!()); + let fuzzing_program1 = FuzzingProgram::new(todo!(),todo!(),processor!(convert_entry!(todo!()))); let mut client = ProgramTestClientBlocking::new(&[todo!()]) 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 16e11aaf..6d5b9c74 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 @@ -2,6 +2,8 @@ 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::fuzzing::*; mod fuzz_instructions; @@ -11,7 +13,15 @@ mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init = FuzzInstruction_arbitrary_custom_types_4::Initialize(Initialize::arbitrary(u)?); + let update = FuzzInstruction_arbitrary_custom_types_4::Update(Update::arbitrary(u)?); + Ok(vec![init, update]) + } +} fn main() { loop { 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 1bf30d76..7df50c2d 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 @@ -2,6 +2,7 @@ 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::fuzzing::*; mod fuzz_instructions; @@ -11,7 +12,16 @@ mod fuzz_instructions; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init_ix = + FuzzInstruction_arbitrary_limit_inputs_5::InitVesting(InitVesting::arbitrary(u)?); + + Ok(vec![init_ix]) + } +} fn main() { loop { 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..bc62e2d2 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock @@ -0,0 +1,7007 @@ +# 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-client", +] + +[[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 = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "trident-fuzz", +] + +[[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..53fd2667 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Cargo.toml @@ -0,0 +1,23 @@ +[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"] + +[dependencies] +anchor-lang = "0.30.1" +anchor-spl = "0.30.1" +mpl-token-metadata = "4.1.2" +trident-client = { path = "../../../../../crates/client" } 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..cc3a5eac --- /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_client::fuzzing::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 0000000000000000000000000000000000000000..5da6f4fa684bd01fc15a7d20eca754a11d247348 GIT binary patch literal 793904 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 HXb_#~;kB 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

c$gipIpyw~E> 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 z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; z1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^;1#|^; S1#|^;1#|^;1^&NSf&T?_U|CcE literal 0 HcmV?d00001 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..021e69b0 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/Cargo.toml @@ -0,0 +1,22 @@ +[[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" 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..4ad8ffae --- /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..ff6639e2 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -0,0 +1,60 @@ +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; + +// TODO: In case of using file extension for AccountsSnapshots +// uncomment the line below +// mod accounts_snapshots; + +struct MyFuzzData; + +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init = FuzzInstruction_cpi_metaplex_7::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_cpi_metaplex_7, |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/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 629b3913..3081dd80 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,3 +1,4 @@ +use fuzz_instructions::hello_world_fuzz_instructions::Initialize; 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"; @@ -11,7 +12,14 @@ mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init = FuzzInstruction_hello_world::Initialize(Initialize::arbitrary(u)?); + Ok(vec![init]) + } +} fn main() { loop { 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 bd8763b4..5491a092 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,3 +1,4 @@ +use fuzz_instructions::incorrect_integer_arithmetic_3_fuzz_instructions::InitVesting; 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"; @@ -11,7 +12,16 @@ mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init_ix = + FuzzInstruction_incorrect_integer_arithmetic_3::InitVesting(InitVesting::arbitrary(u)?); + + Ok(vec![init_ix]) + } +} fn main() { loop { 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 f2b692e5..5b7919a3 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,3 +1,4 @@ +use fuzz_instructions::incorrect_ix_sequence_1_fuzz_instructions::Initialize; 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"; @@ -11,7 +12,15 @@ mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init_ix = + FuzzInstruction_incorrect_ix_sequence_1::Initialize(Initialize::arbitrary(u)?); + Ok(vec![init_ix]) + } +} fn main() { loop { 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 index 20151e03..16ed8311 100644 --- 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 @@ -1,4 +1,6 @@ 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"; @@ -24,7 +26,7 @@ fn main() { let fuzzing_program1 = FuzzingProgram::new( PROGRAM_NAME_CALLER, &PROGRAM_ID_CALLER, - None + processor!(convert_entry!(entry_caller)) ); // `entry_fn`` example: processor!(convert_entry!(program_entry)) 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 8eb7341e..62f6df2e 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,3 +1,4 @@ +use fuzz_instructions::unauthorized_access_2_fuzz_instructions::Initialize; 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"; @@ -11,7 +12,15 @@ mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init_ix = FuzzInstruction_unauthorized_access_2::Initialize(Initialize::arbitrary(u)?); + + Ok(vec![init_ix]) + } +} fn main() { loop { 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 1d5fb963..eda60538 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,3 +1,4 @@ +use fuzz_instructions::unchecked_arithmetic_0_fuzz_instructions::Initialize; 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"; @@ -11,7 +12,14 @@ mod accounts_snapshots; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs( + u: &mut arbitrary::Unstructured, + ) -> arbitrary::Result> { + let init = FuzzInstruction_unchecked_arithmetic_0::Initialize(Initialize::arbitrary(u)?); + Ok(vec![init]) + } +} fn main() { loop { From 8e06f5c2deacdcec18bbe00708e53b323e4a4b1f Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 20 Jul 2024 16:57:13 +0200 Subject: [PATCH 51/56] =?UTF-8?q?=F0=9F=8E=A8=20Improve=20user=20experienc?= =?UTF-8?q?e=20with=20using=20AccountsSnapshots=20derive=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- crates/client/src/lib.rs | 1 - .../fuzz/derive/accounts_snapshots/Cargo.toml | 6 +- .../fuzz/derive/accounts_snapshots/src/lib.rs | 756 ++++++++++++++++- crates/fuzz/src/lib.rs | 1 - crates/fuzz/src/trident_accounts_struct.rs | 759 ------------------ .../arbitrary-limit-inputs-5/Cargo.lock | 5 +- .../arbitrary-limit-inputs-5/Cargo.toml | 4 +- .../src/instructions/initialize.rs | 3 +- .../src/instructions/withdraw.rs | 2 +- .../trident-tests/fuzz_tests/Cargo.toml | 1 + .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 4 +- 12 files changed, 767 insertions(+), 777 deletions(-) delete mode 100644 crates/fuzz/src/trident_accounts_struct.rs diff --git a/Cargo.lock b/Cargo.lock index ab61384e..94052447 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6220,10 +6220,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index 335c3491..df933af7 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -30,7 +30,6 @@ pub mod fuzzing { pub use honggfuzz::fuzz; /// trident derive - pub use trident_derive_accounts_snapshots::AccountsSnapshots; pub use trident_derive_displayix::DisplayIx; pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; diff --git a/crates/fuzz/derive/accounts_snapshots/Cargo.toml b/crates/fuzz/derive/accounts_snapshots/Cargo.toml index a8a17f11..24ed70a8 100644 --- a/crates/fuzz/derive/accounts_snapshots/Cargo.toml +++ b/crates/fuzz/derive/accounts_snapshots/Cargo.toml @@ -13,7 +13,7 @@ description = "trident-accounts-snapshots" proc-macro = true [dependencies] -proc-macro2 = "1" +proc-macro2 = { version = "1", features = ["span-locations"] } quote = "1" -syn = "1" -trident-fuzz = { path = "../../", version = "0.1.0" } +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 index e9879bf3..fc44a00c 100644 --- a/crates/fuzz/derive/accounts_snapshots/src/lib.rs +++ b/crates/fuzz/derive/accounts_snapshots/src/lib.rs @@ -1,10 +1,758 @@ -use proc_macro::TokenStream; -use quote::ToTokens; +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: TokenStream) -> TokenStream { - parse_macro_input!(item as trident_fuzz::trident_accounts_struct::TridentAccountsStruct) +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/fuzz/src/lib.rs b/crates/fuzz/src/lib.rs index 7b45fcf8..58831843 100644 --- a/crates/fuzz/src/lib.rs +++ b/crates/fuzz/src/lib.rs @@ -5,4 +5,3 @@ pub mod fuzzing_stats; pub mod program_test_client_blocking; pub mod snapshot; pub type AccountId = u8; -pub mod trident_accounts_struct; diff --git a/crates/fuzz/src/trident_accounts_struct.rs b/crates/fuzz/src/trident_accounts_struct.rs deleted file mode 100644 index 1df93289..00000000 --- a/crates/fuzz/src/trident_accounts_struct.rs +++ /dev/null @@ -1,759 +0,0 @@ -use anchor_syn::{AccountField, AccountTy}; -use convert_case::{Case, Casing}; -use proc_macro2::TokenStream; -use quote::{quote, ToTokens}; -use syn::parse::{Parse, ParseStream}; -use syn::{Ident, ItemStruct, Result as ParseResult}; - -pub 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, - )?)) - } -} - -pub 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 - } - } -} -pub 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 - } -} - -pub 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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref(); - } - } else { - quote! { - let #f_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::from_account_info) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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_client::fuzzing::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_client::fuzzing::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) - } else {Err(trident_client::fuzzing::FuzzingError::OptionalAccountNotProvided( - #f_name_as_string.to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - } - } else { - quote! { - let #typed_name = accounts_iter - .next() - .ok_or(trident_client::fuzzing::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? - .as_ref() - .map(#ty_decl::try_from) - .ok_or(trident_client::fuzzing::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? - .map_err(|_| trident_client::fuzzing::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.to_string().to_case(Case::Snake) - ), - 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/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 52b14861..73e094f2 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -391,7 +391,8 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", - "trident-client", + "trident-derive-accounts-snapshots", + "trident-fuzz", ] [[package]] @@ -6329,10 +6330,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 71385d4f..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 @@ -15,8 +15,10 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +trident-fuzzing = ["dep:trident-fuzz"] [dependencies] +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" -trident-client = { path = "../../../../../crates/client" } 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 4da9fe6a..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,8 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token::{ set_authority, transfer, Mint, SetAuthority, Token, TokenAccount, Transfer, }; - -use trident_client::fuzzing::AccountsSnapshots; +use trident_derive_accounts_snapshots::AccountsSnapshots; use crate::state::Escrow; use crate::VestingError; 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 ce146e32..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,7 +3,7 @@ use anchor_spl::token::{transfer, Mint, Token, TokenAccount, Transfer}; use crate::{state::Escrow, VestingError}; -use trident_client::fuzzing::AccountsSnapshots; +use trident_derive_accounts_snapshots::AccountsSnapshots; pub fn _withdraw_unlocked(ctx: Context) -> Result<()> { let escrow = &mut ctx.accounts.escrow; 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 b7f9a646..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 @@ -19,3 +19,4 @@ path = "../../../../../crates/client" [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/fuzz_instructions.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index a8c51b00..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,6 @@ pub mod arbitrary_limit_inputs_5_fuzz_instructions { - use arbitrary_limit_inputs_5::instructions::initialize::trident_fuzz_init_vesting_snapshot::InitVestingSnapshot; - use arbitrary_limit_inputs_5::instructions::withdraw::trident_fuzz_withdraw_unlocked_snapshot::WithdrawUnlockedSnapshot; + 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::*; From 892166f73b7d556016c61dc7887eb86adb8b2b9b Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 20 Jul 2024 17:11:45 +0200 Subject: [PATCH 52/56] =?UTF-8?q?=E2=9C=85=20Update=20remaining=20examples?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + examples/fuzz-tests/cpi-metaplex-7/Cargo.lock | 5 +++-- .../cpi-metaplex-7/programs/cpi-metaplex-7/Cargo.toml | 5 ++++- .../cpi-metaplex-7/programs/cpi-metaplex-7/src/lib.rs | 4 ++-- .../cpi-metaplex-7/trident-tests/fuzz_tests/Cargo.toml | 1 + .../trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs | 2 +- examples/fuzz-tests/simple-cpi-6/Cargo.lock | 5 +++-- examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml | 4 +++- examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs | 2 +- .../simple-cpi-6/trident-tests/fuzz_tests/Cargo.toml | 1 + .../trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs | 2 +- 11 files changed, 21 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f972fa76..8d621cf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [dev] - Unreleased +- 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)) - del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) diff --git a/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock b/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock index bc62e2d2..c32d1099 100644 --- a/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock +++ b/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock @@ -1203,7 +1203,8 @@ dependencies = [ "anchor-lang", "anchor-spl", "mpl-token-metadata", - "trident-client", + "trident-derive-accounts-snapshots", + "trident-fuzz", ] [[package]] @@ -6343,10 +6344,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 index 53fd2667..ad878cfa 100644 --- 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 @@ -15,9 +15,12 @@ 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-client = { path = "../../../../../crates/client" } +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/src/lib.rs b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/src/lib.rs index cc3a5eac..82334497 100644 --- 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 @@ -9,7 +9,7 @@ use mpl_token_metadata::{ ID as MPL_METADATA_PROGRAM, }; -use trident_client::fuzzing::AccountsSnapshots; +use trident_derive_accounts_snapshots::AccountsSnapshots; declare_id!("3XtULmXDGS867VbBXiPkjYr4EMjytGW8X12F6BS23Zcw"); @@ -47,7 +47,7 @@ pub struct Initialize<'info> { )] pub mint: Account<'info, Mint>, - // CHECK: Will be initialized + /// CHECK: Will be initialized #[account(mut)] pub metadata_account: UncheckedAccount<'info>, pub mpl_token_metadata: Program<'info, MplTokenMetadataProgram>, 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 index 021e69b0..57ce3b7d 100644 --- 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 @@ -20,3 +20,4 @@ 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 index 4ad8ffae..639366db 100644 --- 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 @@ -1,5 +1,5 @@ pub mod cpi_metaplex_7_fuzz_instructions { - use cpi_metaplex_7::trident_fuzz_initialize_snapshot::InitializeSnapshot; + 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)] diff --git a/examples/fuzz-tests/simple-cpi-6/Cargo.lock b/examples/fuzz-tests/simple-cpi-6/Cargo.lock index c60fc311..033dbfb0 100644 --- a/examples/fuzz-tests/simple-cpi-6/Cargo.lock +++ b/examples/fuzz-tests/simple-cpi-6/Cargo.lock @@ -955,7 +955,8 @@ version = "0.1.0" dependencies = [ "anchor-lang", "callee", - "trident-client", + "trident-derive-accounts-snapshots", + "trident-fuzz", ] [[package]] @@ -6138,10 +6139,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] diff --git a/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml index fc850231..8d0069e4 100644 --- a/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml @@ -15,8 +15,10 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build"] +trident-fuzzing = ["dep:trident-fuzz"] [dependencies] anchor-lang = "0.30.1" callee = { path = "../callee", features = ["cpi"] } -trident-client = { path = "../../../../../crates/client" } +trident-derive-accounts-snapshots = { path = "../../../../../crates/fuzz/derive/accounts_snapshots" } +trident-fuzz = { path = "../../../../../crates/fuzz", optional = true } 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 index eb2dc232..1cc5f5d2 100644 --- a/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; use callee::program::Callee; -use trident_client::fuzzing::AccountsSnapshots; +use trident_derive_accounts_snapshots::AccountsSnapshots; declare_id!("FWtSodrkUnovFPnNRCxneP6VWh6JH6jtQZ4PHoP8Ejuz"); 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 index 2009814c..e93ae379 100644 --- 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 @@ -21,3 +21,4 @@ path = "../../programs/callee" [dependencies.caller] path = "../../programs/caller" +features = ["trident-fuzzing"] 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 index 58f1ab5d..eba67958 100644 --- 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 @@ -49,7 +49,7 @@ // } pub mod caller_fuzz_instructions { - use caller::trident_fuzz_initialize_caller_snapshot::InitializeCallerSnapshot; + use caller::trident_fuzz_InitializeCaller_snapshot::InitializeCallerSnapshot; use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { From df9a90d944d268fd6d03dfdcb6fa1817302482d5 Mon Sep 17 00:00:00 2001 From: lukacan Date: Sat, 20 Jul 2024 21:01:02 +0200 Subject: [PATCH 53/56] =?UTF-8?q?=F0=9F=8E=A8=20Split=20fuzz=20code=20into?= =?UTF-8?q?=20multiple=20files=20to=20improve=20crate=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/client/src/commander.rs | 2 +- crates/client/src/lib.rs | 12 +- crates/fuzz/src/accounts_storage.rs | 2 +- crates/fuzz/src/data_builder.rs | 373 ------------------ crates/fuzz/src/fuzz_client.rs | 66 ++++ crates/fuzz/src/fuzz_data.rs | 161 ++++++++ crates/fuzz/src/fuzz_deserialize.rs | 16 + .../src/{fuzzing_stats.rs => fuzz_stats.rs} | 0 crates/fuzz/src/fuzz_test_executor.rs | 21 + crates/fuzz/src/fuzz_trident.rs | 62 +++ crates/fuzz/src/ix_ops.rs | 81 ++++ crates/fuzz/src/lib.rs | 9 +- .../fuzz/src/program_test_client_blocking.rs | 2 +- crates/fuzz/src/snapshot.rs | 4 +- 14 files changed, 428 insertions(+), 383 deletions(-) delete mode 100644 crates/fuzz/src/data_builder.rs create mode 100644 crates/fuzz/src/fuzz_client.rs create mode 100644 crates/fuzz/src/fuzz_data.rs create mode 100644 crates/fuzz/src/fuzz_deserialize.rs rename crates/fuzz/src/{fuzzing_stats.rs => fuzz_stats.rs} (100%) create mode 100644 crates/fuzz/src/fuzz_test_executor.rs create mode 100644 crates/fuzz/src/fuzz_trident.rs create mode 100644 crates/fuzz/src/ix_ops.rs diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index 6fdbd5c7..1219fbcb 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -18,7 +18,7 @@ use tokio::{ use crate::constants::*; use tokio::io::AsyncBufReadExt; -use trident_fuzz::fuzzing_stats::FuzzingStatistics; +use trident_fuzz::fuzz_stats::FuzzingStatistics; #[derive(Error, Debug)] pub enum Error { diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index df933af7..68d2aded 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -34,10 +34,10 @@ pub mod fuzzing { pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; + /// trident macros pub use trident_fuzz::convert_entry; pub use trident_fuzz::fuzz_trident; pub use trident_fuzz::show_account; - /// trident macros pub use trident_fuzz::*; pub use solana_program_test::processor; @@ -47,10 +47,14 @@ pub mod fuzzing { pub use super::temp_clone::*; /// trident methods pub use trident_fuzz::accounts_storage::*; - pub use trident_fuzz::data_builder::build_ix_fuzz_data; - pub use trident_fuzz::data_builder::*; pub use trident_fuzz::error::*; - pub use trident_fuzz::fuzzing_stats::FuzzingStatistics; + 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; diff --git a/crates/fuzz/src/accounts_storage.rs b/crates/fuzz/src/accounts_storage.rs index 03e893f1..4e5145d6 100644 --- a/crates/fuzz/src/accounts_storage.rs +++ b/crates/fuzz/src/accounts_storage.rs @@ -3,7 +3,7 @@ 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/fuzz/src/data_builder.rs b/crates/fuzz/src/data_builder.rs deleted file mode 100644 index d66caef8..00000000 --- a/crates/fuzz/src/data_builder.rs +++ /dev/null @@ -1,373 +0,0 @@ -#![allow(dead_code)] - -use anchor_lang::prelude::Rent; -use anchor_lang::solana_program::account_info::{Account as Acc, AccountInfo}; -use anchor_lang::solana_program::hash::Hash; -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, - _program_id: &anchor_lang::prelude::Pubkey, - 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/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/fuzzing_stats.rs b/crates/fuzz/src/fuzz_stats.rs similarity index 100% rename from crates/fuzz/src/fuzzing_stats.rs rename to crates/fuzz/src/fuzz_stats.rs 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 index 58831843..d12aaf10 100644 --- a/crates/fuzz/src/lib.rs +++ b/crates/fuzz/src/lib.rs @@ -1,7 +1,12 @@ pub mod accounts_storage; -pub mod data_builder; pub mod error; -pub mod fuzzing_stats; +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/fuzz/src/program_test_client_blocking.rs b/crates/fuzz/src/program_test_client_blocking.rs index 146537f8..55bc7374 100644 --- a/crates/fuzz/src/program_test_client_blocking.rs +++ b/crates/fuzz/src/program_test_client_blocking.rs @@ -17,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, diff --git a/crates/fuzz/src/snapshot.rs b/crates/fuzz/src/snapshot.rs index 1a1b77fd..647ed59a 100644 --- a/crates/fuzz/src/snapshot.rs +++ b/crates/fuzz/src/snapshot.rs @@ -4,7 +4,9 @@ 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>, From bb1ea4e9def73c3e1ae9ac12c69d078f0dd0b4b6 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 14 Aug 2024 10:56:46 +0200 Subject: [PATCH 54/56] =?UTF-8?q?=F0=9F=8E=A8=20Set=20File=20feature=20as?= =?UTF-8?q?=20default=20instead=20of=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/cli/src/command/fuzz.rs | 2 +- crates/cli/src/lib.rs | 2 +- .../fuzzer_generator.rs | 2 +- .../src/templates/trident-tests/test_fuzz.rs | 5 +- .../expected_fuzz_instructions.rs | 1 + .../arbitrary-custom-types-4/Cargo.lock | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 17 +++--- .../fuzz_tests/fuzz_0/test_fuzz.rs | 17 +++--- .../fuzz_tests/fuzz_0/test_fuzz.rs | 22 +++----- examples/fuzz-tests/hello_world/Cargo.lock | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 15 +++--- .../incorrect-integer-arithmetic-3/Cargo.lock | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 16 +++--- .../incorrect-ix-sequence-1/Cargo.lock | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 16 +++--- examples/fuzz-tests/simple-cpi-6/Cargo.lock | 2 - examples/fuzz-tests/simple-cpi-6/Trident.toml | 4 +- .../simple-cpi-6/programs/caller/Cargo.toml | 3 -- .../simple-cpi-6/programs/caller/src/lib.rs | 3 +- .../simple-cpi-6/trident-genesis/caller.so | Bin 194920 -> 0 bytes .../trident-tests/fuzz_tests/Cargo.toml | 1 - .../fuzz_tests/fuzz_0/accounts_snapshots.rs | 49 ++++++++++++++++++ .../fuzz_tests/fuzz_0/fuzz_instructions.rs | 3 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 9 ++-- .../unauthorized-access-2/Cargo.lock | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 15 +++--- .../unchecked-arithmetic-0/Cargo.lock | 2 +- .../fuzz_tests/fuzz_0/test_fuzz.rs | 15 +++--- 28 files changed, 120 insertions(+), 111 deletions(-) delete mode 100755 examples/fuzz-tests/simple-cpi-6/trident-genesis/caller.so create mode 100644 examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs diff --git a/crates/cli/src/command/fuzz.rs b/crates/cli/src/command/fuzz.rs index 2deae92a..27bf5fd7 100644 --- a/crates/cli/src/command/fuzz.rs +++ b/crates/cli/src/command/fuzz.rs @@ -30,7 +30,7 @@ pub enum FuzzCommand { }, /// Add new fuzz test. Explicit fuzz test name is not yet supported. Implicit name is fuzz_ID, where ID is automatically derived. Add { - #[clap(default_value = "macro")] + #[clap(default_value = "file")] snapshots_type: SnapshotsType, }, } diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 8b4ebd95..f1addc70 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -51,7 +51,7 @@ enum Command { #[clap(default_value = "fuzz")] tests_type: TestsType, /// Specifies type of Accounts Snapshots, i.e used derive macro or generated file - #[clap(default_value = "macro")] + #[clap(default_value = "file")] snapshots_type: SnapshotsType, }, /// Removes target contents except for KeyPair and removes hfuzz_target folder diff --git a/crates/client/src/source_code_generators/fuzzer_generator.rs b/crates/client/src/source_code_generators/fuzzer_generator.rs index 3b870dd7..744724a8 100644 --- a/crates/client/src/source_code_generators/fuzzer_generator.rs +++ b/crates/client/src/source_code_generators/fuzzer_generator.rs @@ -214,7 +214,7 @@ pub fn generate_source_code(programs_data: &[ProgramData]) -> String { let fuzzer_module: syn::ItemMod = parse_quote! { pub mod #fuzz_instructions_module_name { use trident_client::fuzzing::*; - // use crate::accounts_snapshots::*; + use crate::accounts_snapshots::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { diff --git a/crates/client/src/templates/trident-tests/test_fuzz.rs b/crates/client/src/templates/trident-tests/test_fuzz.rs index 923a9ca7..238de666 100644 --- a/crates/client/src/templates/trident-tests/test_fuzz.rs +++ b/crates/client/src/templates/trident-tests/test_fuzz.rs @@ -1,9 +1,8 @@ use trident_client::fuzzing::*; +mod accounts_snapshots; mod fuzz_instructions; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -// mod accounts_snapshots; +pub type FuzzInstruction = todo!(); struct MyFuzzData; diff --git a/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs b/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs index 54869f27..7e57e566 100644 --- a/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs +++ b/crates/client/tests/test_data/expected_source_codes/expected_fuzz_instructions.rs @@ -1,4 +1,5 @@ pub mod fuzz_example3_fuzz_instructions { + use crate::accounts_snapshots::*; use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index 504a5c95..827b3c8c 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -6044,10 +6044,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 6d5b9c74..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 @@ -5,27 +5,24 @@ use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::FuzzInstructi use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::Initialize; use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::Update; use trident_client::fuzzing::*; +mod accounts_snapshots; mod fuzz_instructions; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_arbitrary_custom_types_4; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init = FuzzInstruction_arbitrary_custom_types_4::Initialize(Initialize::arbitrary(u)?); - let update = FuzzInstruction_arbitrary_custom_types_4::Update(Update::arbitrary(u)?); +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); + let update = FuzzInstruction::Update(Update::arbitrary(u)?); Ok(vec![init, update]) } } fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_arbitrary_custom_types_4, |fuzz_data: MyFuzzData| { + 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. 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 7df50c2d..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 @@ -6,18 +6,13 @@ use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; use trident_client::fuzzing::*; mod fuzz_instructions; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -// mod accounts_snapshots; - struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init_ix = - FuzzInstruction_arbitrary_limit_inputs_5::InitVesting(InitVesting::arbitrary(u)?); +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)?); Ok(vec![init_ix]) } @@ -25,7 +20,7 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_arbitrary_limit_inputs_5, |fuzz_data: MyFuzzData| { + 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. 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 index ff6639e2..6398e7af 100644 --- 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 @@ -6,34 +6,26 @@ use fuzz_instructions::cpi_metaplex_7_fuzz_instructions::Initialize; use trident_client::fuzzing::*; mod fuzz_instructions; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -// mod accounts_snapshots; +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_cpi_metaplex_7::Initialize(Initialize::arbitrary(u)?); +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> { + fn ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result> { Ok(vec![]) } - fn post_ixs( - _u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { + fn post_ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result> { Ok(vec![]) } } fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_cpi_metaplex_7, |fuzz_data: MyFuzzData| { + 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. diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 010ab490..a167850b 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -6044,10 +6044,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 3081dd80..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 @@ -4,26 +4,23 @@ 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; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_hello_world; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init = FuzzInstruction_hello_world::Initialize(Initialize::arbitrary(u)?); +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); Ok(vec![init]) } } fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_hello_world, |fuzz_data: MyFuzzData| { + 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. diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 3970c6d8..f65cc8b5 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -6111,10 +6111,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 5491a092..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 @@ -4,20 +4,16 @@ use incorrect_integer_arithmetic_3::ID as PROGRAM_ID_INCORRECT_INTEGER_ARITHMETI 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; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_incorrect_integer_arithmetic_3; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init_ix = - FuzzInstruction_incorrect_integer_arithmetic_3::InitVesting(InitVesting::arbitrary(u)?); +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init_ix = FuzzInstruction::InitVesting(InitVesting::arbitrary(u)?); Ok(vec![init_ix]) } @@ -25,7 +21,7 @@ impl FuzzDataBuilder for MyFuzzD fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_incorrect_integer_arithmetic_3, |fuzz_data: MyFuzzData| { + 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. diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index dac85b13..2efd68fb 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -6044,10 +6044,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 5b7919a3..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 @@ -4,27 +4,23 @@ 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; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_incorrect_ix_sequence_1; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init_ix = - FuzzInstruction_incorrect_ix_sequence_1::Initialize(Initialize::arbitrary(u)?); +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init_ix = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); Ok(vec![init_ix]) } } fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_incorrect_ix_sequence_1, |fuzz_data: MyFuzzData| { + 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. diff --git a/examples/fuzz-tests/simple-cpi-6/Cargo.lock b/examples/fuzz-tests/simple-cpi-6/Cargo.lock index 033dbfb0..cdf69895 100644 --- a/examples/fuzz-tests/simple-cpi-6/Cargo.lock +++ b/examples/fuzz-tests/simple-cpi-6/Cargo.lock @@ -955,8 +955,6 @@ version = "0.1.0" dependencies = [ "anchor-lang", "callee", - "trident-derive-accounts-snapshots", - "trident-fuzz", ] [[package]] diff --git a/examples/fuzz-tests/simple-cpi-6/Trident.toml b/examples/fuzz-tests/simple-cpi-6/Trident.toml index 6fd20b35..936fc1bd 100644 --- a/examples/fuzz-tests/simple-cpi-6/Trident.toml +++ b/examples/fuzz-tests/simple-cpi-6/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 = 100 +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) @@ -38,4 +38,4 @@ save_all = 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 +fuzzing_with_stats = true diff --git a/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml index 8d0069e4..ba3dbe19 100644 --- a/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml @@ -15,10 +15,7 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build"] -trident-fuzzing = ["dep:trident-fuzz"] [dependencies] anchor-lang = "0.30.1" callee = { path = "../callee", features = ["cpi"] } -trident-derive-accounts-snapshots = { path = "../../../../../crates/fuzz/derive/accounts_snapshots" } -trident-fuzz = { path = "../../../../../crates/fuzz", optional = true } 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 index 1cc5f5d2..96dde54c 100644 --- a/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs @@ -1,6 +1,5 @@ use anchor_lang::prelude::*; use callee::program::Callee; -use trident_derive_accounts_snapshots::AccountsSnapshots; declare_id!("FWtSodrkUnovFPnNRCxneP6VWh6JH6jtQZ4PHoP8Ejuz"); @@ -22,7 +21,7 @@ pub mod caller { Ok(()) } } -#[derive(AccountsSnapshots, Accounts)] +#[derive(Accounts)] pub struct InitializeCaller<'info> { pub signer: Signer<'info>, pub program: Program<'info, Callee>, diff --git a/examples/fuzz-tests/simple-cpi-6/trident-genesis/caller.so b/examples/fuzz-tests/simple-cpi-6/trident-genesis/caller.so deleted file mode 100755 index e31cebeed43fc6b1ba30cdf37d9671dc74bb61be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194920 zcmdqK31D1TbvOP-^4N+gSe7%gP%s`vwxb9{m5>BQkRoSQ48(GhiH$!Dk`-au35mwz z#JYa}QrTp2-1e&yLJ)30Dve}Ip$l#c#AWFS2;h{ZW-BgGYRYDI7but|=zo4^dGBhZ zv7C@V+Lu^&&Rxzu+dX%E_x;gTue`b}kqGQ54}KN^nz&nH+BBizXJz^;2-<>{U>^NF zE2!YSNlHm8isG<$i(L0EVOdS zjr!WPTyc0viUk%{C|r1n{0M6srtmA=*e>CkHVz9TlD>c#YM+{#3Ts;=y|J0YOxd}d z;Sov)&tYu`$3FsM0B_qM`L}gSJY_1U_+0Htfr*eb^6fjpaLrjkaAHV!r|2Nuf1Kle zIy#t+V;moDJEGy?8Tr~MUm*`HL9l>O9wzv1($5-_VJg_f@r6+if(1krB~R55eeYGB zA>|P&2NBhfQfl57(^W%8(c;0t+w<}uKnOhlljPCB@__b&AQ}8S%h8R9zQWoeg;kHW zg9?kD!`i(J$NUa69B!M?@KBWQ>)rG{n|_B$eqn71{TAudjkGX+$bHc?J|5+GHzM_i zwfzb!UA27*E4{V73JX7G$8Kbh3)9LC-TGIkpEW7pUt)r6a?;Iv(Puuz+pzz6+rHIa!cDdEMz$d&|X*5&tz~ZNBmFJ z=jX3QI~4|#!9L;t8KlpaC#cU0S)Xaq$DI0H-9jj{}%u7 zOqR#1SRM;m9?ro1;`iLh6T=hP)l$)) z852U7QZdky_I#e;D^yG9`X#^HEpRFUE~x(|e&~PVX92@*x73?S z{7U%VE%jy+zhKz(?Dh!0Oxe#kK9eAWq{rGL?9jascG#_WIS63?U-+w$Wq^Ks^QU)Ekt4q>h6 z8RHtCuCR8J`9l0pr+&T-M4fZ%z2(*(5&!KEzmYqSJ15rtU08cG%Ky$SulWY@H>~)~ zi1pJxKLcpDW5_|{u6aR#_6~U+PD8%~jK}504wBqUQM~E}^7HB0RCi4BE5Ath>DpBH zIZiLuTMenpr*qSV|HAoFIu}R=0{e7>&cb#koBQ7#q~9)WCnyIEB!ja#gPTyfYkP22 zQqCM_1UZ3oHV z1zfHxKPGY;mGhkKjB6V*C^gr$=BT|<+{~weEIZ2J|5ks*Vm+>*FLE)-_K!^ zXCq|O9^ai*9(Mky+WFgI=Q_@G`CgIN9Q;{-=0=o$okzG4vFEV%6yxa{QU3GF|EThL ziRdp}^?NL*Zk1zrCxb-KNui_qc^u(J1YcM!?bzBC^hoSXh0-j^F22X*3dMeDwc@={ z!evz?0D2$?LP6!kZ@bm%4=WUc|2~l5a3=c;ie@&;c}1A zJPKJdWqHZh&p}YwEg{-tS(?&=w@bRVKet5E(f@+JN2vWGOqJuWzzE%a_)Go1xU(QL zuZ;5nFXUpOdy~?Ck>rOzV7xScV!ZPdFDBXagjYzINhUZw8T_}%;V$L#?lfn}4m3!( z=X?qGHgcHT_ZiNgYy7l?3y*RbZagC48nu&FvmdpK{bDD+y&fYze0!fzz7p&gjxoMW zqK5r~n>fL+8#yjvkw3t=9#7aR`NCSs7wR~uxL)|V^lhqSDu?p049K-|Ir^PipbH8j zzF<9tsG^|tV!r!pq8H_W#q6P}{>3O3q!MC~$)JhhuKbsU?op+GO!+yW?O~&aYn1+0 z$=BT|<+^pg=JPRBBtOU#^#3c-Z{rV_AL4qG!ONHq^S_`U{QCG%9{i*!9(aEE{Ftvy z@N6#Ml@+__u9g11xV*2=UnxE^NyhgL!k3|yA3T0Lhlt~LE{^t0<=#{;hMh_%-o%v1 zxlG3+=W=zypHcul`Sk7ueH8hA^_Qn;>~8Z>>p$I_q`bA)utnfhSwhEgi#fvlrPF@I z)yL(inyFCzQ>L5*OpmLF^r`iwTT?E#Dh7UsMy@@87|= z@b0N4GZ|Ojz<#n*%k^?N7k}3N%}<8UuyLiUmvK~hf%?C5#cze`e~o^O8|;B6 zG(TTZ{|>)>f*c~ob$A{jzl#2?=|cP!7$L@AcnT{x;CbzdKa$_Tn<|%z))Ssngs*V9 z=A%UE*+pulbv)c zL8#*%)PoT|@bwP~jlhI@lC)43$w}DbN>HEmYlS+F;`P&SLQY7e$Hu`;byCpem(lTS zLC4LQH-FQY6ZOM*3OY`Pex}K%E|w2+LOvMTf!;=6J~1mi&WrdZ`tH~f1h-ru<74pM zo4)<^s58Cww!ZKJkssoFZcg8d_@3Lg>@Yh*eCD>Ee#H0nbW=QjJ+tj*fiD-L-yZxl zyMf*y$58FY>?M*L3A>b?OkNV(Nuge_o1M8Tk*C4X(+}Fb{B@EadOqy$BN07NA@YyB zJkD=;y6R;>Q;;A)yFyKwdDKAZSx@ED6xuv2spC}O`|j14M^XlQ0Pna8Fsw=IBiQWT z>O;Q1m&WnGN&QEP>aQrO|01t`lPBckuM>lw6s^A+oo5=lDzSU>6Heuac_#cyG@qPf zTK#25w2;@2LI>sdw?Pgx>lA%U}ITBuDk%k({kR z({>ZBtEfM>byrs>em_nZxY$mj_Nn#!_U)lf<(5hVq5vB=xW(jX=t(7Hy{M38ko#TyGCyi|_J|}?{s#V4xL6_z(rwecmloRS!8nRT zjW1|_ohp|EgWb7(?3m5|qj5yJtXFKU-^S@pHwa!=-^p;QT-GCP{cP*XUXI_|EctDG z*VMt$#K$Qf_gXyW*GMVcAathYeT~z%P&|5$Mb}HbjdvnC)sLp;>A3)-KZ^e%<4FcW zf6CSmEFU3X-f2W3^cYxp~?Z1rv?naR#!{p+cs!)pbmgOLr4G%QiR7HsCN!q@s z=Eu4qkr!M;;Q)oX+F!FC3?JyhN;uMwbGp>OlLo2t30_Yjm#1(5>AOTQP8QJzqjbH~<+pq{MbdLw zR{ckpz=b^;<|Ksuy^DUvoKEO_P8G;UiY!-pWeN9s3!XYHmyV_`f6QFBnR zeO#yXW<}r2@0Wa+bt%27&%y%|U+9()^uC>bx~ROwFVgZ6e_sA)fzGXxFMMkWI%#f) z$M%C$w!XSr=u0J5ak{%g%4f=<4H{oBxST`SGag%q4)4@@NdI_jy)YTv$T0krJ+O2e zSL0k5HxvpGZ~Kjf6an-U)=9Wr<@1P;7eMYn*|bg&n;tS8OXX^$ocW`Bwf@&>Jm^tW zTyN9v%ea6O_JU%1!`+HcL+IrzS5ZA`U&-Jc&X8Fk6(xf&vEL}h6Y&ir9uS<<_&!_W z3Rg(DTK^w0>TpZrdkHP#(*u8P4~p2l&-O=5 zzu_t=ZS*9A=W?-UKA)zS|75+)#t(AXzHro@X)O?s`C0IdeAq9*V{%xp@tK4O-u$|? z|1H#BP@?HPDQErOO0pM76zvJ2?dOb>KG09^q!9kp#`RX8t+yqq1>$kt9ME}E8OIo% zme2Ol{QZ)ngx^1RfORh4--QIbkz*_`mp{s(?OTL*iX9Zo3w9(NGCc#!>ZD)E==l<~ zo3E3PL`dkTTweCY0RPB~H@{@-X^Ui78l6vRx?E~8d7QEQuTlA5Bl3DC%l{QmllRBi}xF-Lg*P20hQ)Mt}6dICv5LhCd%F8h765ty7pjQNF3DJY0Tuu^>z( zq=QM(IU;Bb`LFZxCwY`2@t1q?pabKx!fL?-yPEISZ~JuaVoA4gzV#<5UB|Wl#I2Bg z;SCaIs9w-x_G_VANfpuKIym653-aMyH$pp?8J+W%W*cPY7wy}prGs*-(u^p3UW0@U zvJsa(SNHAfG~6xmIo-z%yQEx5`|NnabwZb|Uxq3d^KV^CI9t$DepW!+rW7t^kJ3}V ziY1&Xmwqu--p+hje+qrvUL^NwDxVDQV}w2B)x3k*Q(hlDhhkFYSFv7F<=67gGrCE5 zkTbEfOK+KOXV5R~?1X1$$>2h*_Z-HXDqqdx(Ny`BtP7v+Zxqpu9xNGb*YeNhbpUqnwGm*2+a!6%s@mAf`T7w?yQhgWYh5JQ1n(QZ=Zui*7dKmT-l zU#a+CLGM{0|8;y4#?QaXqbnJ#*ZkL!?IHj50rcbN|H-ucGC+V{K=+yGWuwOr+8voX z>*a{27qpL`k_jaPakzf{okis#2Rq;9=bOz>*tpZrH=7?w^6BvDe811DH_2L_p8iQM z9eklBC4(2y-|6|bdGbTPb2*>1N1v`gDawcTkPO7J`1$TGsu%W`43^X1>Gi(V%a^os zEigiQ&@Qj?>PvE~n_m9aUOMQ8%biUQzn)ePWu(Wax2gyahOSAr&guEySCkJk3tNx( z@qM)@A6ygc=Q^?<^H(-5u=UMM0XFkV8ZHM@TVtPR-?Id}QNT z8^0Lcuz!q8LOqvZ>)f^Jy0a?`RiCd@fIvE5#unSTl+22Bj-F6wrx=|^==|Vk6xLxG!Mg{+-3w2yA zXabkhetJyC$D6K@bA*{PctIM+R7wAwDwFn$dQmil@gvl8l*!;LOs{Xhhg6=EYQL{L zm+aTh0oi$^toHAEj?87%KJ?tN({%MZO55kZ&Cp}9 zeLf3ve~RrB>j~53t?MG;8ksM;vvvNd=PTXWYX56aGQDoGwGU~xe)}qA$Nx-zd!`*f zGK2qOJN|CnY<7I8$c|aPJeKg^D_Az;y$d;)X?71Trk(HC_byzW@Qd_m=lc^s<$A4s zJDpF|&~$3r`ToBD;(VEe^hd6v;v^_UIY_oCI`=Q@TE6^@|C=cv+W*Iy{~^Zb^!Ty<&X7@Fj`=G~B(YwowJ^1VD z|43Uy*8jNmyu3{B4a$5o)b|{-S@Glc9%NS6mF@k_Y!;(rYR|ReZ?ah#A7$^5cAV`e z2Iv7+%$u{0!C(PJK)$K7&I;N%To!zS!wZ71Q|QYXc8Ye{L-CN;+gV=XUtNBf<(3Sj zeP$|7P5p%OWs*OedOt$4gMJF_{gF)KCsX4L?^V73XzJSx_bYsIYAeHi3}YP@J!CTY zKEvTIkyE%(?8K*YlIScPpv?4uPMnZ-BkK3^lUzO-JSz26d~NELl%7fc=hP8|iLXxm zHRl&OW)lA~^^Xi2o&P?C@v<8+I=?j4&2UWTL4uRPu{r64-}32vJ}JV^ui3f2WbjVL zW9zz^vQJK3MfmM~x=h)}r@(3^@y}D35ybL6GPRCjqx+*%A7|L;espR-!!g~<2%fE< zJgR#Ca#G~^I@Y`JXX|juV875Q%dbJW=H%mq4(H`LbT^8gQuAJp=)i4IJAV^{L9SKa z=Lz>u{t7W+<6#ba%3q}O{tvJr7r;C{HvUZ|+SxO>hozj2({RoP1(E@@EA5xakL1== zC-Wz?YqSh{4~y%weT1$7#8NqFc5!_{D<@F9ll%--1_f!Zk)IMgl|i_0nDdofj|Pzg zsHteb0h29yY<+6^4uQ>&VxEMmn^q{D(%k91i@>(tgmHqBCi@C?D_D-kx2^A@o!oel z=$F(zRV?S8#B!d8rxLaNCf#iEh6hRpvVITzb)Zl8Ly|!YGXOap9bys~M!o0IRR6be z9{&ivFaZDcda4=q&L;xh_)*r6J9vb{(7_v$J;3?UV}3c6_$Bd1`DfT!Ew3|}Ug*7$ zU!xrOJnXGI(EEBEZ*r$`FvIlz9f!XEf?uHb^&&hCXqfth`u?Dw|6e%&A!&bbKJ+Xg zyFK+d=`pV`@jXc|l=%J5O47FvANs}AR5JJ!;{lzRSv9SDjNxRkmX(&>E&cNrN+%Hp z*}Hy^E7(HHNB_9?YzBku9+}Ta{|sYFrJl`?|Blh zc&y!L-z4LJwe^-y98ZLAfI3}zw$MMumj*<1+yjW>Nj^;19+{Y}-OSO!da4II$-=Fi z+hbVQTh~)#V)z=#AMO&rk-baCNsvRDlCpQBm!Nuxp9TuoUd15EE5$#MkNLhw1{9!& z>Ac$Vi6D`W=^T)S(Y0-sj#U!EuXqagYJ9&qjxAJ(@wIEb?$>T1H88#%SluGJ9+dPg zW-;?=<~0{p=)kfY%Dz0Q+H}Y^~0J?0tK)6E`gNtnH*s^gxc#UnJ)tjt*$v$n==q zyHVlC?9}CjU!*sqJdxW%;o6l}Ugb#Xz`v8ykCer1}t|IU!toC;g#kC#6HKYhS`3w}&+SoYB6_ zzfgJ9yOa3ja$BWb;UNi8j_JyOOz65?;=@Mu8xMbkNoNqQds@U*asDl*_+sX4~-&8G}Oo6nLy1wi7Rxx<9OV}_Du0c=USzY-oxSco~xB{ zdbn$x`^#|KUvfzIFK~KT`&Na8j$G{n3JaaN+BY+NOXHx%3xB!V2N}-oe~W~z4{_-C z|J<*Sf@CLhneSBMI43x5|6yY#$J4&6%Be=-6AGslKB;hn z!qR@j#tMbS&cnt)^3|T=aev{U(6NB@UpyWe#5l7nrt>3Yvp!!#;A69-i_nMerUcddfBFW@#Jx=Xq*T=S$_`s9wMA>{J6^F zn99T2%i9>QPuG!I@SRS7i&=k11aH~Bs<)#I`*;t}p|^9Ow}Xe3zBdY<@kxf0!Cg$} zQ=zBJ$%n;y5{LL?^wgnxI`0hi)IW<{p`SO9?Yi*+=F=VQm(c8!_VZ!o$>8Q0dg`48 z-|6)9Wym+*EAlN{sCw#S*w@nr)zi<4+84P1ZeQR0DcV=3(z}7f%>1(%pO2@#h`t80 z@6*wDgz0Nn`u;%a>zF}bi_%xB{eOn(Yg77K1mFCNRE{rw%IxSS>O;+rvg7BnUr#Og znb18U?cSG1MNxY{s_p%HmFrj9@SbQrdW3*$N86QIa)7ex!5_^%kG!?yf0tw z&$e^1pzvl5b^HjvpGyKXJ_>h8x*HQdY2AhK+d9=E-4BF3A=0J?WSwDw(i_QH>j~HB zxN4(}zfj+BTP!zsK;jp@RqNGpm|qW4a>6#RgF_-Fw{XAGr{yohKp5#=97N|L;g34J zbso@B|59%qP35_KtCVYc3u+-euNK(k5y?UEXU>v00JD1}UqmO_BQU@|p~obj)**bF z&-4)PQ~B%?ITUn$QrIB)K<9?GSYCy@CBC5Z5;rd8=$@osA!X5!q%T)HPM!50jxc%H z`ETe6^fgsK%znr8mJD=Uta^*u-N;_X-;=nX+pq1@MC(tho%oU6A~##7wRNDL#6B*U zN?gYD*!o;5(ZO^)75#lb#%0m?Sq%QSHGYo##5VO)(R@PMk>4I0X7Shl{itZK(EENK z&ozr&4>oX^ncw+1scxG8teFMh>H6Pe=r{84qaHyX^4%L&26d-b@S&qt~8 z)ZY`G;QL)K$9U>ZtncnxnfGN!?qxVvTj2gHx9hz!e$aJ*ur^>goNb;3xp{Vn@s!ya z-KWF!q23habnqC%nfdeBzI?iE9JYbxP08S^Qvdkz8T?tk8#v$BBmBoOPL9SqM>!t* z6&?Qjaipy05glmny+!@ol8e0l?P|(IkFA&5`Xl*imOt>`;?3L9A1tH%;1m6q+s(!4 zeIn^#+yeqHtAn-3z8#^U_9f#FcRzK2^te3|M)$1UPY5|)!swng6h{05H4?r_!cFyh zJ}R+U;-m9PGG3h~Z}Jz|M=QP$00j$oadGD7l{EBnBb96)VQsV8MTNo*3I__O6+Xpb zSS#x;*^wGeA7=R#)8WteYd{z2XRj|`YDbWijW;3Zc|=!sMC!5knUcW-OQz5(^kba+ zLi&mR5(!QBh~TXMbos?XS7V3Joj*(Ac7+oPw<-K{;j2;R2kRAYCh-6xF6Ik#P7ncI z9-YusGPsxtbR#CW4T68f+oy$xpwR z(&_w#;un47YVQ^NG#msY;kJH;!+kX;fhpXdmT+MuhoA%c2y3MuLVNJ_MgD^G`StDv zU7nw40XzomH0~q)LhrV|NBaqECy?JL(eHBfgC0kFs(7&81v*XdHopj$a5A0ue?F&M zd$iD}2YwRm_Sv*twREj%@cUd zpuh)y#bLN{FNfWYQa)_ea%(jIM#ay*UUMu!$@Au6~&jHCFqVu6A z#`}K3dq*F~yLB8yc2$bMaN&T+rLUI@gbO>AugwZ?P`FFsPK7%a?$z=e6z)^FL*agg zXVQC6=D_d47==Jh0_WTDBK|MZU&?Cyf_Df`f1%$ z+S^7Mhq*n%kgJ#cSg%38N64=*y?TBGFrILKAovdqaTu-R(7j25U(ORb?N{AhX)c$& zuR+4Q&zCT|-}CR8p4`U2lW@PBTL{-o2%W9N5;hJ=xJ~v$?3|k$5qafmbsRn-^2*ij z=KO9%up8?b@lT-t*jH$IWL9lG`&UPw8Cv#Ud9t{q+Q`k zO%D{VPh^Wb(< z-0#7UTR#VTgh|4$*HAy+HFAvoI{b7E#YgX@$Z|ZNe`%q3zdq|1UQFZP;&_|S0Dn{6 zY~v8BlpZ%>@=`ffaWuU@E`Gqy|IqsYGyAC`e!)NLtEZzQ@wi9MrMZJz&$!mJTk3%y z!?-!V&vXSRbmf1-^>sIXUG$g#9>byD@9OejSNL<9F8lRi<0lyI)_eSYxtu7P{~w`x zL2otn5$@ngwhuRcfImxF8FfNe(o92H~|CsW3K55E27WpEo1tQD}Bc#967{c*rj^Piag&Ufj4gdvd|Ze!&ROotY!^WBI`f!mvp>Ka2 zYVtiH>me%N!xDP(Arp=6+f9+dVhCmTwc}i*z@KC}KOJ^)q=*lryFgBawf8nanCg#r|a2vPYUw&rpZrAvxx4gL3|Iz zH+7yuvFP6M<+?wCaUajGHbdKTP8RT@UIwH0MxyzbiZD~QnEMORUFx2oVmTyzIgAK? z_(3QDbbNqV+o#_y8>l|i z^I4i_b&WJ|dWI$$kgOY#ew)T`>OZ7kr+K}?Z5)QRX%2n7m4w%yhi)g8xd&PZD}{Q$ zh3jH49>?mqEt;ojJ9n~d7~LC@q4%dDD$q^UF#QO-@>en)-HpPh8-1D3*LspeH+GT0 z_CCvj7Ye-bIEUShQa)_ea%(jIM#;x;t0eA)RXy_;OCBbBf|WqIqUSx5`29y(ym8mz;lX8({p=JU^Nz z{*%Z-@5`8BS7iLKm&mTr80ZOG`-NUT9~riGFr3Ar38!yRSmn{$sj$kUwO7htk=Fcu z0$-)_pt(Apc%CKuNA@0}-3N#HJ?OLZ?=$9C``Z|AxUgNqI!4Rq;!!Rcyj}R;F7>)x znlohkgwCuJ`m;NPuiTni>LybG(GVxe4n+BPY0iJNK3;YvuifY30dJ+WQfOH;LSA zUJQTwQKF+uzZZe~WMEO&e9KZ{p?hHvgL=+%JoDWm`Jz8& zr1Yn0={@|@><;ID(-gB)L;L=V-MeS^VHM}wRK;lM9zU_K?rP!7ZI*c7&M{AiJYKsT z_AKo)lNiu(jkaH%zpN~iFBE})>=(>tKjowglP~=B=Lr9056}RYo`Uwbvz1%wm80_k zER*G`hfR(SvC?DnCXD}3zulAP@~X#kIa_od2XwsjWmK+9;!%$NkH$yfgGi));Rep& z%VjUo4Zn1wXFtGqG1)rGedH|Rlh*L*Juj&r@r+-;zhw8rh5II$A3B%8A@adxMc+{+ zI8Cs9cMA68->+=noAK!zCi?9AUEw~FSGZ5~=lcif7x;?#I81b>_?8{g%P6xSo!>(K zC;J`M_j~qD=bwe|s9#e#JVoE{r1vG+&vk1*Yx>O9Rzz~9DQD2F^IoLm%^-STm&<|A zRi1yN`^h+-zHiE*FYjYTe)j~yu!pZwTXUnwIlr9?@yi`Sxd%nQb`A>VD*lW1Kf7bO z6Djomi1=+ge-*+>BYsr-Q~j=sjq4)+H;evC%{x2in0MYaO@BvKe*uR?m%<`HI;pzR3jx(30MV?)x0D40GPNCh8 z7k$UDi<2oGqo?>iz^Gn9$9{jHs9tOpLBG`Orn-|fD01LJX94&c{YJiVdZE*co1+&`;dpCsAL^y}ik zaE=mBX!{rY#qLp_L_vQ26w?nljeL5K3G8&bUq8Y5eEKGcKJ)i<4pH>AU+lv7>(CGI z74z{p(LI}A$NU@lpR8X`km*Kt6t(jKrf+UPKPY@e^OPZlJGK0Ll5( zp4)OG>d(6+pPi46{JNcoy&_I0(u43Kf$1I~ZvSBkzi;M{Y#fWA@-o(1B|~rBJzpG zjW&Oe`*pRWNe<0#O|yHd*T$*Q_kQ)>CO;p}-~0ZG>DTom(2MqK;|06#0_#5{x@aD4 z_fpwCRc{e-1krkUgGBh_fcF&H2{<-;vvXr^h4d?~UBfpCo@hUux-AkX-BXCaM2~c1 z(K@7kr!SK%asQ^R*ImrT`MfqTJwpE&Z_&M;@qM1QuP)!sq;mjkrE5W&Gh{1-{_I)8S2oafyoLYF`E&aplhE4PF17PDhozpzLlSPB z;Lzoj&&FYf(XJtJTCde~kz=m$7Yd6UbB#Y&Smc%Z(?JKFa>2}RC!UV#0{0akM~zqj{kP|p~h zH%9xy)1~vy6x}BU3-S6v;U}KAD6IO|d*|Zu%yCZl`GOxqeUI0Zf0!?h0rpH$WS3;n z^Z;%~IA7)gxK|gC`7gWw&TT&>^%E{U(fHs(fury4JmK$o{!sAhx()mSkv(PK%}55{ z<#hDV_TZ;`u|U|L3{1*_pPG);AzbfkI5Z=5}Y<&A^e)(#CQNt@xAc(!r9Y< zJB9FITrM6>`sb!9ktgEq0X@-umk>HVCRYm!>X*ze(Jt&^K6U-EhV(OyPdZP6$NZ1I z-?Dr)N5_1s|7z-z{MgsVW9KXF-hIP!FDj+ybvmC1J=6H?631FhXV@j>nr@VOqI-EX z-o6I|d;AKGoeG_j-{fHX2PS`eFB$a=c=K)ZC&-7IV!tvm!~QYu2z7l6cq%av(`UBx z41Jt`at0pw9e;cF5)S9%J?d@NQEX}zkQwr-aV3za)=Px_Bk;>WztVfEN| z=A!Qp=slp39aKwwk=$P*@N9A)hTOEDM*SCp&xeP({?u73xS);q%r4{gqkg6H5Qo%n z$-2jc*kA0w`#9d0Lvg*&X8CHlywsnedr#p)?7U7YA&w5i4kCNX)_LrHR=Won>CIFw zTq=CK^Q6_f9RlM#Hf4#vgOQ@~2_Ex%g#iZX-cSj{Yb4AhYq=ccg!(O{_wGdw`I+r* z0P}aM?^p?azZCi&k$pC5H!LTcXZZ5!r22s8KZ@|c1F_!NZhBQ8ogAhT$JlN#{(&5G zt2Q$u;UyvuyZ6~O5JU91yEx$U>Zg-W*e>}p$+KA=$>86)KA+xU;v4na{mFkux^SZt zVjsFM>E|C*Ih`ot4>ulxziO7#pq3xv5bIaW*CooAp1ZL7jLrVD56ZYQHSbC$Ji9{2 z(`(upPj-c*hiiHjZs2_3nhvRNMOxtv0!QZoIt9*)-N)n0K9&dFcOv@8OFN0?$K;Rj zgc}DWUB?Y>g^Y{CHR|{D90lFWC;4>#6WaNXa}`hHaZX>h@>-67+@Zfz*$oW)a_%5I zLi(r4;XtmhVZCfnIy*S@^S7zpm9pQj{Q&-|UCXygI5Nbcoj0}nd95FFBYQPn+6&pg z!oyl#__6b;wC}6wM>JjJLHDgGEb_8(w@-gF(eJ;9F-$P{PSHO*|3mM?GoIP}^`zSI zQI*#vEUzP~cUh11>pL_@d;b9BHF8MHALei_JGOCW?Ds_P_B|K#k8!&CyWNs6iWl>u z^_IU7x$TyGak{|CK=c=_M~sQSHm!JTfuo zo%=`z0^56Izp353v#s467W$%ld=DuseA#(*r{|2qHDYheE|-QBw;Qa25g$>zWH3n0 zlK~9oyWGC!y+3FoVP9%7K@LmNbH z+Ml^GX@8qm$oHtCdEnSd&bMjBF%Dz>s~!%VlJu)S$6>60f&F%KT-(`~w4FUhV;DDj zLfgr44*mRC$30!Y+QIGYsFpv*VKUJBo79hH=6#gua_VO@^BxsGNWXaO+*hXTgF?TK z6K1<_6$1kB|5>H~@0k7y!LR2UefoLbmg*_hpSLjmCzbwFO23>#^6{j#Uh_|RuD3z! zO>^kyucZ8tTd98be6F`r%hzz23~muTgq!73*CwI1qq)XYu3qhNH5a4#WQp~+6=KKk zD#?fY641^bp?}=oir3$6RD6_*^kg9GZ*HZu3zwGml0C1JGiDpQBs_mJhq?W_zO+x* zmv$XtKEs8R5^fYbrh6*{uAPuj&yhKC8`1sp=2zyH2Uj21cXTkn7W!ozW%l^wtbgTpNxKafO8X8so)EtE-gN6{L%pZox3596FMob`6!56< zi**v~f3KsfHl5z{9p5`J#P#_22Gm|ljXys7ee|b$xtz-naA@;Hv`6|s`cA@(_2`!f zU1u^c`m-NXJ<+^K#*gv5NZLs}FOqf_&wm<(zUW+qwyzPjC*234_qJy64|)0Xvp0f{ ziDAx{s#w7c#B{W4J(C=UdY&+*V}qufJ+~=rbhJo0UBC79P)x^q&@nFM=$s*!%ako+ zd1vp}@pj@orBCp>dwgG*O;z&# zs;zgpe21iura9bH|6vYO30ZLT>9hXc`pb_qKXdo@rSyM2^K(@BImV%V&(`*%jLsSJ z!`&k9OhWG0_37*@lKXp@&VH?@k3&Cyr^>yQJzd6h%J|LYd%1iv_zugdFu`UO;5dd1T^sIZRzTK5X9{aV;K zz;MZX9U{Lg^+)$Qj40lGAD5qTuR~tx810wz=w1iyuk_rBof}D&iGP6oqn}KbT`uj< zlNbA^yvmRA1@N0H56rKcDGKwxX7c&IzPNw#$~99tKYt_gcL`owpG116;#)=O;hlgm z{&+X@iEU( z@38gYc>X;p`J?&y5rsvc@qAnKXX5~$-(jMEw)ysX=S_Z+{eWpRrDtWBP6U z;4Tn3<9sn5AAg(DW9wl}peMSIuU+M_k;_H%aee>EwQzLwJ{Qtq&vu^Bujdf#Ugxc_ z_su^-f1`Gx-+i+2(QNDJl_;N+`cAjrI0ku)*Qk9|a+smRMo?8TJ)onWhAQ#?p1luA zLZBxezev9kkE0qCzt~~)Ucm?#{$_a|Wx&&cCfJyMWI#pkILI zW;^#1ULbyh#6s_1eS+!fZtNGjMrFPjwu+x~WAEp9T1S-h1F~KcZtT=@Qa)_ea%(jI zM#nANw)SKY?HH`4{y5vE8p?<0||9p6v@H`Kx>+kG$X~zaeyuX*)lla^0xm z8i@~EC0}=AX}V6LozFtoeN5L$ZD*%AJkx%d?l%(pbf3@8ji+!a2tB@Bj%$1Rcb#v4 znC7BqvR+VX{IG`G_fe($*cs97zlR3pWb3SeF*hUh`v)5vR>rpNB{53 z_b|cecN$0z(Es{Nh~N8JEZh$K`m;KoNhK8T!bHPb%UOR0d@Jc(v&94cJ!(hc z!WNc8!7I;v%u;?C%6si{5cNDD^#b2AZkK~Bm-zkvt2u)k9hxDpG?lk|N>P5G4)(70 zkykseSH4It%)k1*C%^wri0Co@P`v+6>u6%1d2Qdn<@)Wr^mcEktqaHFq)w*a#z{&3 z>J!?d=0#RJ-`rcS#TWUYyHsV0%agvVQF2>C^UT^OJSl9{aUD^@$yM_R%>< zy~nuT;&JkwEdQ?jgQ5qu8#gw=aI|kSHmvYT30qHaX!k61&vNcWem2|3VU_El8TK(ehkZQA_E9{Z zyl@&_nKFHEw2Bl-Po_-lcIJ5UZCox>Hgo+4~X@c4fJ zBD~L{{ch?kI*dY(o$reG`;Rl;XdXIpRAH5WbPiR<_3?h4$mw+TKL_=X%lO0Tciu8( zFP<@uET;Qnlp8HBXZKbtWIp_QJBV+LX9Ms1o7nHi7k|*s*FZ0$8<;QhcO0Uh!g$uc z6CJN>(P0;QY(5j;b0qzPoy)QFFm^77{1oduTr(i`WEl!oMwm<7v?&0=#Oxw><4*mS__m^^RoF#`%0c+u#q#IBi{_o8{6j_2%0+^z%2X{g=}BcfJGrZ_)D25=Q&@#}ppq zFkS}`x!C!!nd=C{n*X?#pHTRO!XigIuWs|R*}lt}hMkSE82Ee&`~lkS^SFOb3qCuS ztM4JtweIK3=VXzcUCQ!2rFL?1hMgT(J1gbqCn3*~<68a%hsi+R>$QIKiLQ6d)<0FM z9a#T#F4JA3@~Gs{=QB_{C`I?fOn0E=D>zIBpBH$fpTn>^&5E$`a9FMW>k?@<)-Ta} z2F!Q7?=1aAsQb>;zBFCdO~Qvnzsca^Tu*dAZK-~2yX1!*{GXE~?}SLM;k zVJh*3qH~Wk$7ir-_(AI*K2(MAnb@s6&Axjney(MHq`kYmwEwxr`)^@xF&>x@`lJ5h zGs@2)jTe1ys*>-fmhLaa{xb{P0fEj+fUfoCjHtvd4DggZ5MbqCkOUDU+nk8;_SVv zLbs$x?@P3Z-?#qI(Hb$HInPgsxd!3olE376lBJUIOwaws=X~uvhQ80$*vI^(%5UZh z!-Z+-xAt$~FuO$0lePv5tG{opP#CLrB!|`(hTW31!j%eZ|Jho@urI$(lrw#J@}uF$ zRA}<6lnjo>^LXZxU%0D7>Rk%$5dK}K9_O$Pf8~9T1cgz*e|8(9=^or(DR(7-jwr!7Ka8;lfVFmnwfHBg|IG{s-N+$n<2ZUd{3Jy>^8+D6IEGR&^+>_eNH= zD=hb0;yoU^R&Xlp6+5%{O0cdsNI64MOW@A#<#JB#3F)8{^KFD~T;yf#6Y+T5b2~W< z)o$HEv4>2#or{)pj()qu{eo!!wh#2Z#e`>cP~@uTzy19EI?ik>Iu{L9W89PDcHFP! z2RH)7|wPoXI`Nj6dAiAfXJi=$@`dJ-_s4GyKp* z5x<{eeh(?V6CC>d4k1603;HpSdrr}O9r57%M&^4+@eFgAyRQ_#tC(NE9^CKY>*0M& z*HOiHWCmS_RS)eY^l&-o854V^d5q$j=2Ms$OIpEV46tzk}(`R_$ZO z(04M`{_j)xkivTv*84oG1{9v;bho%);99vi)8~JZ+J(Ok^eldV;E47IlN@Hss#p(B z&l#ljJWsSgsrOpgezM=bnyKcveF>j4+Lxa1i`o^zc=WT!fwikla*^7Xd`HITgYWx6 zV<@r{Ti00xy^PAZD>^5pdP*g}&f`ni0qiQbO7#-GA8`)I30w^s9Kt;u#O)xa7Mepy(+%_-NN>FQtjr%4Ew`9HfRr}-W&SS3E%#XDW2og>@RnT@>lepgd3Ii zoD4>VPyIezs;r4&IwvjmlovmoD!W4B7Y=f~-KU?e(tfaUuiB^fgN?lkH%Ph0KEYR& zR=8hayC&56>(P6q z!Gw;b^^p6uJ?p*9wm%oW$Drrrmesw8@x=46OBnX~ ztss73AD^N1@^D|f*h4#KWB<33?Zw7#6->8Z{*>BFsea?H$zJUHVQxb3$NuY-+E2iE z&40~pKd+j>M}zWV^RwqL-OZv0U9a)!u0j5@=Jx*&!rn(@-0JlG?A$}M+jlacLpt=t z^E2^tHV?D+hMnHCv#Cnf>t@W)^u4@I_2wtjBB#+IvEMOi52-}&3_0|x9R5}JKfX`4 z>P81t4*fIq*Gu`)-b?j2JHY>FpO){H@He&35wU-}$HwFp-y0$A=Sx$~t`Jm0?BfPX$hbJnh=ZE5St#`HLi{feT3{O;Uby0n1 z8@;{18NKiIA=#1!IDsV)1wutVcd%N5L=|>8x=TxGN5oAZ?JKeczY1dsNf6jK) zT`lV(xtqifxDn}ha@8N?a26xGokTfZ(;SY#9uw6 z@e_*g0fi4Ke80jnF3VL9Dm=;QVf9{xk0?B#u=K-Wb-%)5Z((&G!{I}{8h=#l*{twM zg}W3!rf{di$F-gf3ZGE8Lt(L#u)1C0PS$%^-KOv<&EKMM!0EZ_3l*+V_yUDn6mC|y zQt>q?T%&NB;qcBHjTd{f^1SK73E3y1dp3ys4Wws8gS4X7Z>Ysjaiz452Jn24aqU4&HXzgxv`TKl*C61w+V z@nf_KzbO4mbWf<5RdjC##y7`E#CETY(|y=QBEBHCK-Nd?{?p}mGTI>O=k?rIioV;7 zr*OTbNB0z5E^xTYA<4Mw!c^WUQaQ8o8Kjaf8g@bd0p+NG5$bHZCXMNnI3!Z z-}c#YF0|(A%>|^j4u)@Ec7gD3_GstBA?HrYlMG&qtkd>CurCcd{!#7!ZR`UMaLAImt4DUtk-nEzWLm#9nx@WR7f}xUb z@7~*5=tb`V#62y)>3xXvNZ0NR-lJ{t`Y-t1g+vGJ=v&`}e2%J}%DO`FepvTCl$jpe z2P@PIZ0+7%h}I?c$nC7|WiY?MzpvvI+B-S9G{rZa{d`Wh{xZ8n5N@G%i1OL9&!xXX zu=XMjXkA+R(d?4t91-VxKErW7(Q|gm;%WKpoJ|&&0?@PeVh)0=p3B)nN<&I^sceXB zA*G?qU3;G86Nia>OkcG$*tM%HeFguB@SIJ?N6!}Gm+?q)kX@3Nc;b`mtEv;2@NzyG zZc)Cf>G>*`2uy!DUo(T0?|IYmh5L`N-DRJaR)!8p&~q2ym_9Sx@~S zm%CHSWvitBi}IgMhe7CBtMUxj3<3d0>M)wY}y=o_2pqc3jTaXQS^fG;{v!=+`97|EHF(5P0~j8ZUH( zjWq&~Judn5JYIH8##`YU@$cEOUuybZ%`f)_+C384F?nCw?vcpqy%&)`8vB`+KP2TJ z7CB_cbYF2zyW;(c=G&m~j}`7v_(ux&D*RsxcPe~R;eLhX9=UK$pTGx1?%9d&3mkpF zqDAw6SL0>88a7r6eDK>Ee}coXF|F{o6mC;k^l9J!u=i0S`y)GN`_p#p@*;oOC0f>6 z(m$TaFQ}h$dVeA8kn`mvU)SOW{^5p?aQ)qt(%@}BdrLy>H1e;~{Av6s^rPJ{zAnLM zc-+AT#+U1q_H6OpX>kzi2`}6EYAvVdWp2^_&F+yw`(*rkB%kpGd4O`XBW_nKB^~sp z>E})j0dskAQ$%+=(-rYW?TqDV`}2BUmCol&KB|Yy*9m@?7d@@LUf_rioewx|r*5=U z%9Fm(&fQqAz{Eb+r~PfT?s!1#4g7F@GCU0;|9^$lSM2YM-?h?h1>yPPNA3Ke@o9b! za^w1?+ar1GWxAZ+KLb5;{i~(E5Qq2ZF@Kx8R17cTJCe(ABroQ7bRy!P>x=C5kk&UT z=~mz6QlIH}t=cW$Z3?$SYBH_^ zE8S|3HV&NaeY!hoiwNUNBA?H1{&CtHH`=^23#^1+?_+nmA(%Q#1n3T)V*aqd4+`kq zJLfOGt}FDGTG!1aq3fH!7keMk z?A_+=ksMYt`e>b{utQ+T{SO(R$T=Cv_$~zn&@)^8ui^Z#M%V=@j2^2$yhr!~9mtWS z|M1v7poIYj2}I1C?dKXPSGb1J z2LBt{&zh%6PcKW)uBSC#{FB$y9PQ`{=;@i>j;fy~{Zx2*@cmo07hn861zR`dc0*0U z`V06)_Y)ega4!<~Q`}!rKBPa(!;5j~*eljj41EV<>5g}Xl#a*UmzMBei3s<}Jkjlz zel1+s%;St)r}%a2k8B=~eGIhFaGQ*$ZQUn+uc4F6+j;4*af8CzPc(K2EX#M~_heq= z_d|zBA675;dO7Py#_e`K?L6v6;79GgsYUh77Ojg2J~yWI9MJlQg|1t=)0{CZ$LxUk zxIyJ`h0>>ZsM{7kZTuSD`*lL-kJg({GMqU}#-BD`T%_|d^Yh7|o$G^MrnQIri4l6h z=ZBWZ?b-Hu(2s-9P`~Tz+rvx99#X-dbNK}{zBnKG7N(gV``!xpNK?G+uesb8gnpX` zUMzgOW|4z?vB)LcFY|}2uG57V$oMu)2*2SvkwdupIOEIdeeAj2Oip|cztWHXo76a! zDbxG$$924{`$5ZfzHr(7GXD1M0pk$cxAOPHZiZdxJi@-)9@)i+&}aLwZd~QEUFdTY z4I-yE2@LtKd=d3y4+$J@6Z#6uzl~dsj*|5p)Ot3TuBQg|yjAPbd-_spKei8L<8jOb zNQ7)3OGw}DK&8-qy_APs8|bImU1;|MjjEpPp2IQKm#(L}%mzl_Is}iqN$p_0+CfI! z$HqafFVy{yaNB^u3;QM1^)LD^vB0{Y0{?{(zP-0){w%uZO5eM%d#>PD@PylhZtQP? zBKjVn;5B`WaJJ~)80hWuB%^r$rxzqHT1xA~X)Xu8@PxZ+7`FTKU^nzXm6P@g zJ-ldn>?gw^E=J=@d*6c^7xIq?-bEKky6Jz>r2@ML)xPaJId4sKLiQ~}x7|0MeOn{P z=kC{VHM}hC|E-gJVK&XM8yC9Wn9v!nR{Xm~zV`i(5X{iCfcRy3jETM%kh+nC^$8O9 zRAxR}56MIC>$G<7ZtCQCr~U=)ALYzXq{?JoZ}LnAvLF+#k$MV!Ts&BW%IR@s6%q!Ckf&sp-m6#EIv zk__a2CD*Zm3)uO9O!R$rSwD9hdO3Z@xo*R2-(f-}^hD>nBYTl{oLwgjSwEXyw_Eb- zcd)as9$?tr&@bV75v0wFH|c%VrP@unOYG6s0mJ=bF9o$n*!2(SMHllA?qN+=eOdn% z*+EfzvvxRFdvhaVpE*6}ZSTM3s?KM=au29oUzlb%+^%-KhX|x6+${DIlHK7k{%!th zb{yT~qVJ`KdVh=4^PKj+O4vBZcZc#)5A3`he&~R}kk|ZbvP&Wdq{R1yE#Q?{Uk^Ah z=HJ7C@g>T?klLJkxQ+ddn`q(CFK6o?J){?x@8ERbFQ3c&w{yI;Kj3{n{IcFJl+tw) zJ1^_!doJImixq$t1L%E(tM?lyrfk_0}%QkNO(ur(fUWbZ?#c0o4C8$kExbR4ts`+eM-r}V}2GrFgQzpn!SNWl6F?-#j*y9K|kFFL!YQ_lt4I(%3+ zJsnmx00U`7QJgZQk9+h*`Kv@OMlbN5nk66BS1bN}x_oY|kL$Pg68RsUZ~Ok|KGL7jTO6KA`Q2W5 zTW4}xh+ukb{k60od-CmiJJoCVtwilwhB@FJguONpy}sXiJ@9X70~^GL z`sJs=KfU^C=HpeqepEgtH(Qr@ChW_#5S>rOzTEEnZx>1Ybkp0EM|)IS*v%pa(mHNI%Z$Qa{cqp$lA3A(y9c0O`Br+zW(w|qB6 z(sNl>`bU$atxx&uBl{>{T%L;si?qBy{>C{mzubFXKVHJQxIeu_BBFH^ z^JjXlz`mcf{C>%IS(nnQa<=tPfBgbm)aL)pFWS0o#9z1IL;D&5om&MC-&%ssmq>a< zr;eweihX%U_vJm6`||r3AFKg(iPq<>i<#W^a5T4@t(>0>ksjM`e%kisS4q9LzYcpq z&8hixScaaS`DHxb<#87cED>V-YxW7hh5U%Wp6K?+sff3AJfwf!D<9(E7d@efCAL4+ zqxpqL2no|uw7!7$hxklF{GW}3jE^mZ7wNN|6F|-IX9#Vbd7StFUppy8`!BuEEcWiy zUafyOI&FS#^YFq5A){vj5yR_yV+xZK;C0ZPz>v=Ys^8}MPwD=@CwG5;?C-t!sQ+3a z^ql!V^BnR=M?;Ul&-_f4{~b@0{C9YA_T|6Fi;w3eWC-;5^OByG@pz+4y0xIE{Hy>i zw5NP2`3QuoxZg{aUxwl|uWD!e_s27@y`79(AB@A%)RKWL6!w%?^GT$h@_N4KGgW>S zd#Y6VwfyE3>=$}7d-u<;;C%$Yo`$~Z^}yrR5RrY}JSrJn$dvSypTl@l<*T{>O_g8C z{icuab47GxPxQ-v zxwm=sCW8*m-yY!Pd#d~uJfHRRUp6g2DNXay5-jDvj^7jU^QSzzlEHe-e;vKUgZ$UC ze*FAjo0k6q&JVqS?laNLwH|%YKgK)I%b=$h_@N(AlTHTLFn+)OwMFG2hh(sNM!x42 za+2IpWg1JgYLy#4{Dokuiu|m4`nP$ zPZZ%nyGioy;dDIjD9VQ+g00W^bR8|q2iFAqxw<~~SJtm|Q5>G0@&)R*DhVgx=c?ao z;B@Op(JslfdA$nWBpF=6={@DoQ9o6!erl!qsa5Q!Y+Pdg3gZa)EztER`ql|D@Ib)Up3TK9oxavX0eLUa5X&x%!zj`x)dDIsQJ=mnvVb{v^%q66xSG8PK4X z9;A!^NVESyy6E$~C|&$Tn*9aR;pc6hhw|bd((E6Qjv>0)T~{5v0p5d@5b1d6-fRv5 zOFM%X6?x#zAltt}I{ZSCYmsysDiJIl57NcXLA9hKCCOX~49m0kZIK_8B$*3I7ry~6 z1t!%{I%*LZDbaaTD!-6nV3l<7CzPNt`Z0U&^DP`p_AKIz&g+7XX5{zm;a7BzlRsXC zzLAc6u$TW!B11^s8?A#OmHK7vf3dF!3Zn0u(ta5pz zIhC+d_zopGI=5@<+qRw^!f5D;x)W=Xew#<2C&6!6$N`$dY^_8rZx%wO4jxT#v}k>)N7Rl~o_1ae^}K-` ziS3)%Itt>qA-)UL(L7$r;&z3f5r0q~J(;ovEN9U9SXLt`9(2NEVt?XD5uM9DI^CO9 zuNP9q^km9%9ESUjvHXDt?Kjl@A$O75H=H&-?gA-?{sQ!cO9YPFyTI{2#VuSetkZn9 zo+s`p2ruMh+DB8oR6pa@{3a)?FSdC6LT>L!k=#b4Jm@)2bldzC{XQPEKjeRaF_KWu1F_$1R2HZ&_N_8B&`Fr2Gt;}CR1E>7>$b-J%tdLKg?tnHVeUk81* zuA3=CFDrbcDKz^U=gYykgnCV(E-B_ZU@c+_8I66kG^j#4sjmvn(M32BFB-;f(P zxAUcbeQQu(H>2^^zXZ=y#^)u1->>(je!cfgdc>!6`?S8He5%~z^ddgB{OR~?^6Rtv z;HUzbgHO5f6(h^;RlWvrGLOnxAU*AUiiwCV{}CNs#m&cUMw&voSqDgH}OC| zc;fF=tNlwf<%2bfo&1te8oelolw=_9vqt_)n9}`r_Fwc}=+m_`Uw3)`Vobd|JtJp zEC0395BYw5fE#LuuV;ek z=`G6F$*`YqbQ(QvobJ;DRrvCQJW(Dw!S~xp6k$IX3+z7Q$Ud~)n*UEFuI7xX#BR1n zy9Wv9cG8sM-y>8Bz3mpf)=p7hJ{u z-zkQDI`Ca5Y9}+|Ssr;%L;WP7#P<)t|4*rpiOy+G=(#JschZ*=u{V{%K{k3U-sI}r zLl@aYY=62UD(vvU6S70O?3SD`67CYa2zSMPq-{1m zjwoMLZ!@(U`Yspaoz0(!eqw)esDvKH@BHTeD_G5kj`fmEp`fU7H&cgqh@*U2?r}(Ke z=dh5$IncL-`cLpbS3ka*@|zq`u9M0o zg9E5Oo>$ezdX|1F)^leGJ&PZFqIy0i?X-)l=W_v~&m$Z^Q=ihlY2GoToapm#RBpQ6 z9Od}1cBcJEzaHDq^nQJKMm^-h$Ue{9Zr<~R?B)a9o|3^~@r#~Zq~4aO{Xt@(rzeqr ztf$EmdXjegMD-NwW4c^t>Ou4u>tT9(EUgF8U#y2|{e-pOk=Rbef1bG>?tVgg_!HH` zy)*RCz;c)I5BkkEz%%;InE&bhrqGM`ni43tU+gQ~uXgG22R~%e@A>q{id$3WXe{MHffHu8P*@KuXSI*V9>4mkZyAyN5ty_uzJZ4 zdw{$T;QQ{I_i}ukZ-8NcoHC4jT^vpQ#(eHKQVDng(yN|Fjmwh((c_mNg1%^8KTPp) zKlB2|lS#;i+H4i00v317b4vdnL<<`a4Q{B{Bl&1vxX z<+f2d%jeJQ!723qdPA{)9vT1fP5iLdQP{W^KLpI0K7!TEc-c9PrRSAm+Ou9 za|RU#_r$l}uQ_8shxkK#wtM|%zP~5^hi@ONU{}%mek5R&*ZceYe0AV+gp+x^1U-VE zxBr~tvvE8{F`xfJ@y-o#g3As{NVb6|-Zv5$`;T}^?<)yiSXW9@KG0?M`y9}(_Jnp1 z`Pz5GqWAhr?yq1}LiS+xNcdr|KK?S`*Y`-n-JDIwe&4?1>f1y8o*>4vTW`PZYQ%Tldh2FdM`p%* z5{vkL@1DfVf}b*-Zw&s6!*?crNMS1R*~AYh^ywR>brjHtlQy6aA?Vw}^vU-n+_-#y z!t4V3tatCAKl&ttf8$?0iOYfy(>_m6;*G&Sarke1KVT~H=>+Zp_v_{FYE!-N;HVcN z>fONg9^>(c8<%k&`0d%gwF{Npx^-92G&$US-R+3qab-^~8H}@Gf&Z^D-!AwHhku^< zGV}k5#FvWr@1uQv@V}UFfDVM9;~J);|5w26#``#gelWwzd3v~Q$7-lNxOqG3zeDQ} zgU@rlALH*Qr4k=Y;CrRh_*c82s<>W+sJBJLi&z9SIwkLyLt>^y> zK1O4}p2U&hQ3_LuM-x9Qs;8O8Y2c6CAJ>Br^}K-VX;C>hbBKCw+A8l`cJ1i7Ib2G} z=t2DTJ=r_(d+YX|o07ptwf zz=-0*D z=ds}1^edG(oH#+DukQiXH_nNG4uqiN7x1eO?^S&da2V5pRw4Y~*>x-H|7Ie@r{j+9 z9UOoAZP(tG4BkZ?z#bkAe$4WCPvS>K@;I*YXrO$c10m@6Hq#;BWpU&3y%xW{zw8dm ztPlLDmAh#r#$|Ua{~rn_*$&>7C=}U2TJ3B zWN%z~PvRrNapvp2iT^0#>yWnNVm*I~@gL^)>&6dp2>EW`y2JT;rgqHsy`%T`?Y?|( z+wm%vFT!N-bERW4_yW`M?gYN47M3KuIi^E zK~MJ`JCeb7wZ1~|7`N}gOB|uluWvxxcd`F^C)c-E+xGy6;2X}$_g_1x!K1!gsln6t z;iLNI5zVQ@p~PcFdYn`}(lR3RhYJ>9qBch~kFvV)hXo&96*9hU#YiEkIlzoSHd_NPqW25s*h z9QyYCmpNt~Rq=S?_bCKlzgPkLKA-DNB_r^|#kPmi^5c1i~_4TTqbw+m9Lxy&XXV*R1 zo3^69+sV*;{d)b%b;;nDN(a@?a{fZ%V?}ZvRyotL3Z?@g=vc>eOsM@0NA|aM2k40H zue%47k?dc&^$ouL_0T{H@wazh)$h}{y1Sd(#~rurxIP(tOX>Su;+w3O|4e+VNH5K5 zfAxe5azY6DE@S#y)c%_PfA-!5KCY{}7d|6)CZdz}X*O=+eIxcU=bv(fciFy#Do@TD+gpMc2Ic9sB@8)rg#Ek4pkt7g!znA(q zZbz!_dx>^5Xn(&>@goNQMT~#0_ICrvt{y$(j1y_^TCJz9?oYWt&#l9`R9A0WwLg>o z!G&DUHto+=j?s?6!k*2beYh9?iR&NS5+J`s0CY}T`PWeQ6>eW+-B%OsJFWUtPi4SA z#Ax4auJ;AipVJ(p-fnWhfWJTAL3Z+D#otu-JmbH(?u!Zht%@I#2mFYE|3@!kyx*qy zTO<7Nw}AhK-fq$l0;E88N9(zy?vt#SZ>T$w;NNlWr`HfX>OqWpzQgsL(0)1|>7~ps z%KDHW?Bj9vCYoT-`y^W5+PXC1$fRzn!zZiU{udqDMRq(YyTIr9_vD^{+B z?YSJ@&7^Lx+e!G`_O+{CCGE?{xV~MgSM40bj_)Tc>e`pVTMFF1Zt~aC-fh~xLfv?x zT_?3&i?v;d(XJC*&vV+YlNIgyrqiypcf0D>&blup@E=t9J5TW=2L9h>{Ew^r9po78 zxRC_BL%%-)d3XHV8`Iw3a6K-cnw3u&2hcBwf&UQWU!{C%j`-Bu6(0|1{(2)7@w!VT z;?vd4Cl~)g<fl#Po;U8nQc|tKd_64LcJu{$1J+?HsF}SqHxK^p(iY{8k0Nlgf8u1@j#-_)-*l zmG37xmVVrr2fotgUcz^{0-s;Q&UZ1srP_X3zbk-@xNm_h2{8`?gfjKd$`6iV5TpG5E2W>v>W6J09`3ckl-GKX2;mrF8^Y zeepBN|L?%>4l8~O0Yq_3%%J=?A-iLO?<-I&lyCvrT+|b!`1M2N94br^+ zZ!79OrFw7)!JvJJ(Z0*LUir=@t&>#f!KARX0^c>QDP5QUzGd;(&Uk`B% zy`*{u;{I(kKPUWhp|@*a8fxg}Y-z9JZ;0f^#(#1jX`Scd3VQohkFa!zenO0Xdg%uk z@As)5^>Ylq#MfC~1s3sqrx28G!f*J?X^%xRrdP+cpOSvXzj8e%w4aVgdbNcdTj1;I z>nOSXGSn~Y2{a6oU1+IjPm9W3(*OH9*RxUWZ%c*Tl^j17a%XqTFR;@Sb=Rd*qZqs^OIj+$CXlF2kGtGQ8XqW2WyOn`?>zdwf=)q z{qQG%1OA3P&k0I<^T;0{0Jr^)J-vnA=dNgfgX(kAuf3D&pR4-Zz%lzdRJ&{6X`QpG zeJ`(%ZS70z4vH(kzSf)cb8q8%mukH}$F6^Ial($6fBf76=*bVjf;fL`jL$a-e^pNo za*Xy3(rnRPpXeRbeT4OU`dz-#_`C*n(K5gg&HwQ;R_`ILH)&U{<$8~4y@#TDZy6lg z;o6nKfgzT&L2`)Qde`rjb?3nwdTG3QzM|f7l2Uhu?>v@SOS`CnLXOh!&)Q1nbq|g|MD#2Md^adfplWaNA$j z#|>ov!S%Sjp3?f0e#$qw{^zy+Q&Ii2{>tlid-6SGZ_49sxt{CDe*m_4JuJ59qTWMV?`!D^ z^c*qd<@dSXV_NSajxlZy6!PqE2e%Yx+>(AlzRgqD^bExGrMuK2>lJ&tWA?|9|FEv5~{6j1EO12Ac;3sZ9r)$`SN4cICw4T$E zUiR*l^_LRc(=z{u_UO7y$GVu`;MfJy*NZFaZ&y3JjGlo1h|$h>aQ(Z~&bC+B*-s_L zFDo}r4YqqF+;;YBJ(p@dh*8g8u4kXt(_c}~4-)lQxvz0Oa|laZFI#oIdJW~HJ%~|H zH`lXG$E((8yuyCFyWW9)cHo2`?%Ew<_jSmJAMWZE4PR`hX_zB<1O%OZ(E9?yy_)_t znHRoGlCkmixbo!+dIowCgWg-1-V@4~;}v}QgTy+Jl{?9Nk?(l8{2x)f0t<(F5Tl+A zT+ah+PlBT(9J4-=!6Fdv)&llp&%#gY*S#X|R1P6(&k{-7y)7O4Zx^`3l8$?Ozk_}wIQmEDb!DFeX#_ft%=qZMJIA1(RLd(Ze=$n?fLlJ!X`J71@81oV ziypb>JC9NQ;d0R{`#yucr|H6-1f2&6IR(&pImOk!m%fkSz_%Ul{hvg~RRlkGCY^iu z4N7Rh{Yl%LH1Mt>Q-+w((D@x{r+uFzh`w*Li`y3*7XH}xIfBCnIX{fPr~bI6#orGO zAJX D}cih!*e>l8Jir->CkcFW~U}f0L>ieJGFClp1{cOMIv22*KffQcuG!O-ub@ zL%*h_{;*-6rrQ;MMAOo~u;Bqs_v`b6obKpT@#ykD6~{Uh%mm*wzzt{?sC%N8QzqxmuA0Pop)9%+G|M{3dYNT2cK zJknP@oJXpLZ{$!}9_al*#n+_gi{7Z`i@NlD(U&}&FRF&;_+b~%?-n48^!&{!59e>Hm2Vw&>3^q|U!~_~Zq@TMf9c`;Ottc-W9`3J%ipT! zUH+Gc^DfoOwa421D^WQ)pYjP0=ToYcI~nW$;i#OPFZsBK^Ci{Fd9il(N9E+)$j3aK z8>v?AV61)JQ8_v1@vMh)9@WZuv2r`2a&lhdPd%L1s8+5$)}OaU<>cH2o%g8GzC*G0 zZH>ywd5DjAI1f>+zUCM|Z{%`xUdog63@1IDXQ)>0bd1goT5imfa|zFSIG0ehT&&-1 zANZr5oG zxt9B1p6t7S+QYtkwQ>hz?OUkjKIO@N`d@k2Pp?*PJXYUpwA^Pr*&qLFzPG7bx#n2= zGFt9)p6qWw?_qztTDg-k`Fxd@`+_I?)_?0^-@014=2$s+DA*7F8&CG3zwBWjx>~t| zvHoLsh01-&OVb#bNqxn`esZ;Pr(*5(UGJjOp+_o>$2 z@mM?FR}?8nsBFL_41Zb)%Ko_!ELIEuOY^l^)=!A7+gzDxI;1iy}l;g z@fh5dHQ^d!a4T!V`7t=`PS&vFF}Ye&6K*61x1c86@fcs`*MvJ6gPU6ut|iuQ=hcL3 zjls$KZ8dprj>#1{XB4Wz9gN|liF*yWc8AZlegJ$3c0ZKe3x)Zk`&|&bAIe>4z_KUjAJ<(RMEMtJNVRd_id(eAUF>^|-{ zSHXvM3-8HtJ;49LDs=ud-*Ng^S^&2DI)VSQBuehRT`y5O$(J$Z3+`9NdWPMjIrbza zC?KDXJxqkFmyRQi`ymfG?Fd&lNBOU~x7@yP_1q|bBnIEW`Sd+aj?wSrE)rkmdwEDh z!sxwoejdHQ*M!=seyZZdd&>2ozW|SQqLfoV+W-10{6+pfBkJ z?-w|HkM5n<^%c9f(&QBMJ?+pv75M-D>dN*2&lOI+KTZ3dPPFfVgk1f;Q;+erD9g*9 z(GNMo`W)W7B=^|MUQUH5Wb__M<3pwnyU?^Ab}pom>GG|DUgu{ZV?bE=b)Md#~^Z^xXIo&{`#e!K3`&P(7ALd7qx6-KZJQzvGl2 z!=fmKm*YDu&rv-;%kQv!k?{$iZND!1K5UHkheGM)vUC{5p0CUhug;}qHfIf};BO)v1eth>L#_@XB>7K^+@^7W#~l_N*+8(crDH!*I*^?+a0?)V33Pv#E=^3&ilWoBH>`s3pH z!vr3T7-??_)03GoKlWV#_-!KpXQuDF3B1rO(04lKcZ;K$q3@_bWnH=+OO!|Z()<<{ z>D4so=t=iK5c2S2`eEbjbo|`|34GSCUW{J6 z4Kh7G98KVbO94Lk4qni`f%cB0@m0Sw8rgL+p2YgHU57EHfP0FOkNJh?)hEexd(IV z^z=;=fA=)uJEjSL$28&FrU`%ZG~wSgP5AZGguj;I?YjoiIHL1Uo0r0G$Gnn;2KcRa zWiOR^jXS@^P!j6*ErRnf3#9pFGe`8@TpFk-7=Da9&nL#0uf_Z?fv;UZyaK}C;B)Na z9Z%qW-o?8>@#?%7>n5>wt)mPI!2+LS|)N}~2r8Ug)`5Pg?O<*5E< z$%j55n7>Hx2M8aRNq#s_&T|D?aW1`x9~fVw`TDIgUq^jlZMa(I%eLNa^9t0*be@O5 zM4#5*run(LkMRThUU0qkXP|W3`kCcN?QT+h+U_>xM{edv`9W|*&J6}nNqfTe(tp7b zp*vhJ@)sNty2JG%AmJ4x1QhH(wt5H$h42cW<9g$h^2hoIb~CnqauG47AdESZW_H2sa78Oi$=uPNu`Y7dN&>;FeH3LHC&UW4-E~oo_77Sea za7@nm%_1g2AcFTvd$Mv2jOLT?XE@WV$S)#bz}H@H69Z!RwbjeC+bf>S4$_o6`Mqk?0j&sN#w}R^V;|1!g(TB!9t%A2TN7Y55K^8?>Jxd!(CTAO#{u? zTA?F+=#bREO487m&2)Zy>>ZL0j>&V=v*6HahBy0?_TD4qn*`qMzV&nDFDM_%{rgv3 zAl!6P%B!8he#B(`Rkm}V;qtcbK8u7aR!+nv`c7Cyxgn*O{12D_laFj0ut*wlMY&ew ziY)sSN9EFIC`a;-06p+2j>@%9UM@UG^d!9Xgz)JxV4=HD7D-&Req65osCL8bQn5+k zOipU*?YzesKgKzqin#Xn#8;}HqXr!0Ws_rHBm8-KNWuJuX#6z)hUA^9@AeRz_!?*I}!LV4W$15S^LxO=d3fCt^cn>~QPl17{?7oKxa_-Xta02I~#sKhqz z1y@SCV~50O$5Q&~^5-$)kNI~w7-T$G`T+-c@M&>1J{@3i&)!!JyL`@w_@(#CSi3^C zZ{ZRt=kkmFHysayBcfNqA+@tL`S|OM$lhBpxk3H(&&w{wUuh5GHqFnav|JN%NvPS0{pndJ)3qk{>=K`Vfq&UdeQ*j92wJyi=e5nv@SlMNjK5lC=4C)(`b( zOTO_rfN)RuUAWdLY|(W_g|v%KI->zk?S>5ehD?UnSPqxt{BG- zOFPSci?qM&w@CX+bA-_FZl4i{kBH)h14Iag=zR@c=M7a~lKu(ZSN9U&CtKfbP0S-d z>dYf2E4M3A?vI^vHr`>qU?c(eoC7x*{>KyLJ~+j4#}nm_O|jf_iE@XhSnhP9+!IqQ z_hO>lqf;!`@RTYK^(*A^SEpERX`mf{>`2_gJij= z9}eKJJV$x7>mC{)GF}fqNBs!VI>kfMUYqZRcZz*4(03Ivqy}vX#%+{K`5UC& zi&Jmreo6L&t-qij(0=s83G{>Voz4@Wx=5bwyWmB&Ggj{%Mb+2CfF?Sr6#GNk59VhA z|8Kkf9MvQJl9`oHL2xs(9!o(kjL+7Oi)YW8vOK*P_1HYPiX1_&tbdaIVeK+~Se!aB z0g;{x{|?6ZC;OF|Sr_wqD(nc_mG)#`EHmp~`ci7Son`&~-3obv-M0JFreeR&a_#6! zDonxVYmxt+SnrJNXk8b3=5*gDmzzp`FQVN~svJzazC71AnO~PYPcTU5P$5qk--63p zm`-?LUr zl6K4NK~ipm4a6V{u*y@F-&JmVRBvk4Z+yf20W%G>4|E$nv>u4+c|8UEPU0yY;Ky7J z&#heMtZ$`!O51vFWOrmb6WO~vivPy_HeY%_;&PV;@f*B;hQUGSOPMB{eSPj zwNvfz-dochR=?e_@U7x`5(53>14WJiAr|83CaUsR9yZ%O+e9$@k-#)XP;>V4v8 zU!&{6c0X?t-`EbpXZs$o=l@D$LjC=cZ{v~K6WEU?di2xVhq)=A@Vp%MVbdgXZu1Xo zm-)lfnOD8h?XOA3CHUR{@8o?K)ed>z#_?iWw}!o%Y+Q$*f&O0*llMos{LfO}FL3#n zkoR(bOnqMR3gDZhA26O-KbT*T_MYQ*mFt_jfBF*c-LEmey7rFGdk{YntX|Wb3Vp3u zA6Nl5roz9QvY)!K1;wfVn>k)g-%Ffo|9=(jtL3Lo(f(X>KqmIJhjbv zjrv`ATJ2dC?3z<&id!X-)W$ON$$kP#7{}0xY z(4gGa8zq083<%-XEtzAgz4)9A=`TIG>6I`~9>9F&cc7Dp%F_Zh{xf$R85%^8tN&GPi2A8!X zir%Y@&IOW_1-Pu83xv}}Avfb}&QE*q)$+SIzv5hB&GPaU@3i-BE^l;4>wQ)(vCp5I z@%KviK`FP8tL5`p=qX#Th|X_-FIV>&t?zCrcUbV*dU3UVfq$ff z3bp)~wD+|i0Yh@!u7>AJlj4~@WqLjbJPH3T?QN=BzS{cwU$}Hc{^UC*E${jte}?i= zx!ZW3KH2_i^?syky`Px0yj$;wV)cG+%H@7HR&FWlS9A}>liL3zpV%+J`tO>1c?T^L$_me=|bHwj<(%~lE2i0>Mc7D&! znFLK#fI_fE?p+9%KQ4A+i`=^qEa94+TYb?`Wv@6zB3_IWayU4)2tCdAM5E<%7`|na=r3 zTIea^+shG;7fc_Np2FB$CAM?uX*w;0oS;MUgU6Qgk6^8&=P#s=qG0yX=nd8i!k|Oq zI~K}0*+Ab92y~)z$3nr6@(96NvHwA*#CI%`bzbbB;eG2_v^WDkn&8@<4Wh<($D4RD;S^oSJ;OZzMo)RCST?JW1J5< z<~zC+qBX+QLx=dU1wg82>MrV)W#y-#9$Z{TLt<9Yp@AKa{Z zJa3o4nSQI@!wyjuq;Fd9yn_svNnOJA!EXK8v(G+@1VuA~r{#GzFM0v~oK2*f{V_fV zBHrFu7o*|x_6z8z*{^V()R%!kQLuCNz_b7F=)IS7IGf|ljr$* zk9qK<;EB#t-Xn0~CXwghUa3DAA%rMz`zQBH1BwqeaenbWpW{-8#*a#VSQ0qfhY4p0 zp70jMdqnC9*Ku*)rvx9+Y>w+he{*%;l>R#UxWvl9VDC~ci2YSGF>}@|No#xeR9;jJe{-X3~RVm)sk-ub+wH=UMP?RRAF=e@}J?zn%P3|lZNavnT6!q0;v zBG187{hT)WbL9ms2u2^^=N+m)_P$SWSn};WBFYC0e}dsNbz-oVQ2(Hx?7nCl2LOL9 z@z?IZi0*;W_bgnv)dXjHYw~Y$3OxUV`o!qZE1iY9vsv#8b@gO>=sXhLe?z2@{mjx| zvca;f!@ni}tt=mIJ`D|2_ALxksCxx}XSPsx0pC-esawwHr80G|s@$^WNA+nB2#yPvfX zq`!g(bY4D1S&l9=G%z*bsdUPd61iy@bxOi~FfW9kLkx$$El)tbdAAC)FenmbsFYV2*$Om83 zo}6EE>ph?I^;{=zY_O9L2o|ww`Awq37CTEnZ5sr@yi1IBzv#Z#)Dx} z5}yEUUfD(PNN?78AMPUu{e{$pL@VM&qK7HHe~`+ficD&U#wmWD=3DK>Z$t~z-rMLe z%F9hkg;bO1Vd@Ie!_<|mhj?E_m;Qb@g8^f+~~=y6K)81;#Ky;ks0dnCP)(*=4T6Y`WvEfsxEEn|H~IakhL?-jy@JOZp1MzkofiOlqN=!z6fD&Hyjz z6$8NEk#f&M$+dB1Lcstivk2p+8kJh&+E^qrBt_+98+(|Jeg-+4UG z-z@Jh=Ta|DbPg0ss2`!&+Q@Ov``$!}eq~Yu7v6e`%Y~cNe_1X549fWg7tT{ZM!%mC zE*C$@_OZhK;>XxJWw`$Z!M9)ho}_={-m8f90_ZU~Zu)EM;(?w64W1lle8CZ|XM=2f zhgU*Nh`x)2FQLA7V}1|l2M0^`J`M>dSW#k*Irg)KGAWoHEw?M)j&Q&7VZZPT_(51{ zp8BOn7!AKa&-aNvrD;f3i^>&gW zFub;Y61}&C$|#iaH*(tM-6;Pc8II`QJ7pd6?=OcP{$kJ3Pt+Wi{fUY1tONWrM8}xY`wZd2^8$?rjCX{i$o{ZDkXVO;{dm(s-%F z_WdEWXD4O3^Yz>QCjOo)+J)zU1O9&|-L-mxygv?%p|0x$dAV0NoVQKJg}mLT+b-!2 zSr?-B#kpK?K<$*?s}UTa3V=`Fj|~n;|A!3{2M73Z^j#vh8${sl2A?0;y&GYJ%9F}Z z*sxrm8~#f*E%n>`(_zDE&Iev}=Z#{@3a_h*8qq+e}aC3s5uHCk`k^suyJwcNuMEBd$G z-mzsGlZ`<@c{JVa-xt1ET`vKL`u98dtv~I(^Wb3upb+WR!zRC~SCM=(7}t-XE7Ge2 zk{{_+q?f8!k>09aMS5LbpF)*$v=hBx_sxX!L=Q^3{u}Opocrrc{pya($$p(p{c8Og zoU3xSP-DG+DOjw0SfK4(ep=+s?n%*mMeP3ZqVDgT{1r##-a>oNuQ>WuDZl(Vj*FvT z)AUJAe_hijH2n{nKCbD1)bue;%l$mIK3-J++xE$dqq1&m`((w@Z)th4FU3*W#|f7U ze~Y8v*5~^azufB>E*JeMj{b{2-=)vLqv>`{k866HrsX}4aCxhy}B>6_3b$P{k*IEYC+@ zlK6dkU(Cae+`*+LS!XD%l=ZCA8kq-|bbeM!$$C~PFY}p_u0xj&T*&2vQK75UBnlgh z3f-k9a!x1&qtdQY6B$=dOS?-=GCvGPg)gP1Ir?1qR%$v|)56!1?vDhc!uL`WX5GNQ zi`!LdlKFHn+OKJ>0^s>RP0Rc`7#-2H%x7&qy3{1|?O^nvJ{L#G?h`0Asa}j8(&yqR z2cyR{O#=+qcU;qCggAXd(`0x#eNxjh0kC@rN=;&eZ9Y?KB7?y2&nrA9%l3Goq$}5_ z7tkD>=Gt{D*`8$TWL(bF^|8IS_m*Jy?{wy2u;;K~Y3~mhaiOkB*QZy=x>#M0tc%t4 z^ZE+xF+#Xp+6R2w9KYN2(d@SAtIf;Z??P;&@hDs_d<353ZB2ouaB1&Gpdo(DXSht=9lCCw=XE)kAA26qMiD&tv4!Ha_Xvtp`Pb+=`gUDM z@8ESJxBPn^jF(@}`T-Ii&J+EGzkb^7 zM;*u9`BE$TQTIvReDs@r=M#7~x^kudwD}b_PTF@u&7XJivAn2Xj&jtsv>x&t%MZ^h zxCKVP=qKP1?7pS)_$+c7>isybyg`nQU+_adMJ6V#>%o=}`MxC4-*2FL>^^N5ZuH)G z|6ajxE%Z0upI=D8VTCpA$vUo!@4|$9H#6LoKo^sb>l1Krz0=;x3b?}wdDy^kud9F? zPRQG0hLd@;OW$J&zDT_bD)9YL0RjQa2Sc~J!uziEWwu+ zhLdr}g_}sg37=&=apAs^sP|&VC*y<**OGw4$O`%TWspMsoTO6ijB+d{sb z&|>!h0Pb-bBCFkxVBZxWai;wY9S0A;$odjqp#Gw+PlOi`Ar$PqN2uTZ0DeGrs2^|Z zo#vmq>llCXBgZdYDEPva2|u)ntBKm%MfiQn8rB&5LhvZCF9eFQF9c2&Xg`NQqWeiR zDVfM&KLhz`PaJ+*w@7;jDHr8t@eUvMh0u;d>QddWxJ~z8Qk+hE4>CN;qhHeA1Dr0T zUg<${3#pYJ_M+GsT+AGGn2Z>Tg2%U=cm0vhC_X#e=_kcq*mzu(tN1zKC4CjAGbDfTq%$PHuxo&a zo}}4INPkIM>^sWCQ@8zgq%lKCds+G`@bD+nd|Fb{3pu?EkGcOLclMnJl!siUS?c6D zQl+j$*sl1w2U_? z`X%*)lV;apN1;#VN5k$v_XYAZpp+DHXF(h2Il%z~-~bP}w-VzJ!;a(m5Sf78YQHfq z?DG3|qO9ND+i!Lp`Grou2l<8Gu0gZs$j|i__94H&&_Vh5CG|qTP%rp^`u>3EbI<)C zAI|}Y=Nl4qfnHmWvGvWcoiZtaZpfpJ7uXkg;Au#R1mGi)j`$VmePiYG2?FP?SN##u z7x7n7g-rry`4+=pds}K3Gx>*Yuk5jVrICMg>B0}A)GO!B{6w<6jmKlV1aBKL0dicJ zJ%jrxL-*An6x&74OkV7K9-f0V8!v~cjXtH(UZ48YzFSsorwj^h^dAFsRGv!1&X4ue z9}3nUl>ZQwkM?;E$aDDb{5>wJ6!m83$atTbE$a=zE?GASx*`2E-ao=obZ+gPltek4 z2Zp=_k4XEXet1;qv~@(#@gU?lFL+Eo&`&6d=l9a{=sxC!0%!f}euwRQWRR?V0gM@i zK+GAvA0c!EmqGeG4|Jj*4F0G2-r7G9ji$$-_m`C`_b*}PeC7k;UE3NKl+7#1Uq#h>jnIeCi?#$)jxuL zgvm7fYWtVbKEIfK_9O7q^;6#a`N{p1l{BCMKgP4t2>qZC_RDx;{s~4y8am7M!&#(| z{C;E`0rB{sYLxMx{C5N!|1kcdo?7$qaNg2!z{3w~KZ=o7LO4&p>k2;!eztv&6>#5k z)?LDR`khzG_hRK`UmD{!JdyBD*_Q@BI6d~gS9?Fh_FLiqe8<6$aT_iv-k-Y8`K~Vb zcNa}yZ2buH7f?S;z&^#+e!wjQpY?w0v8U-F1<-}{2!peIMEHSkaO%PPET9*7j#7Q@ zx*X0ES$ULm+Yk6Bs17@?g7kMOZS#wc&C-4vS<9)Lvecz%yqYvf2=GI5$AcIy9%C|WE3p&2)lt=mww3q%PjJ0zV z$*=WG$DMxxchYnF!R4dd{;#<7P$SU4sOK`Y|A^p6`~Sl22Lig>?LVjerxX7DCy9Q@ zBUGz2?;ApwgZCT2OV1Ie!`CtJMfrg9beLzL9*&7VphP?7CF}(9VMhRm=f6!Eh=~lI zXO(si^>paD4d`L7Um7A%ucM<-viS}2`}zw5$j=XU_k~m*q2iq4IWJVS*VTtw@&GyT z6LN4kAqTH<Kv(@xsH2WtMjeGj6L zI%m>#I<%*um;PwTq{jFc^0y9@^MMyEOM8FJ&&%s|KF>3;?v|k^nbfV^PbmMxhvMaB z{p|O({3~?5u9?^4GO0FR_dvPM|5`4W_I_L8lk0R_<^2W%?Mc)l>m^TXIa{aOqU&@y zUZ+DnA9m_N`($0>y;{!J>26{B0{GV_>XCJYUytB1ug3ZzRz?87Fo7Q)K-zmWf(Jh{ zsm(kN0RHK!_%VY5+)b?Kz)z$y{&@*_j3;UDet;8vtFF^+Vb25jUzwms`s0AY-|YEZ zZY%pIfPZHKUe>Kbg}+7D>E6P8WB3F;!cSI3q9>>8blcdj0RFQH`~u&n_}g@y?pB_k z0=~1VJa#MmTXmi8cKJ>v!EZ_6mvx^Gg};scm`v(zydDJnUr5j|>t1&-Jf8n^;<>DA zy)}B??C6oLhoW3QQBL^2B`S9)L8m;wDSG~as?Rq?&zB|eOFK72&*xSxzczaQM54U3 z3%iseXaDYwHza%__p77l|0Pjg*^E{pPKCg`H!i{y7j^n4)kT#Q zzb)}x+K*Pq^VJFbQXW*u^9@y>)4;0FpGn{sxq$VM@}EdN$GW=R$AR(Xwd8}DpKs$% zGHv;_VvM_|T{?*`mry-`{~nFsh!<&$@f>M7HpMa0w*CTsjwHs{e!Loz^Xw8SFeYZhTTBx}%sAnnA~wGp zq6fN$DZZBRiXK^gw$E$(4tAe{`@MP8WN>zGgL`g*{e8#JX1}vUg(!dzunaE;-&ZRB zB;V0a)QkLRp0E25nL1cgqGt`b1b;*9qTT{^6MZp#7Oy*xe$&7CB%ZzI9s>eu(HU_XyLcF*4P ziTE&2<`K4z0eIJrP4>ReNe3_J{sFZCG55C&Q_*{&_TC1bkA1n)K37{G|9fZrFgsoi z?w?%ys(NU89_aV@GIh(C-*(R4?$bzqzbIJ6U|#)3iE(cVk<8zj;C9_3`MEkdzZndO zd}T~tXUcQfe{>Pv7eaaKU;BO^(g?x1CjZi*D2K4;9x*iAFO_tg%15pavslmTqGF7n zese6vz07Qk(%84E<9-0YKSG2@{c?aGNAw{7a>$$J=Xh2mdIywtj|t#D=HRjSlI)%X z>{BDq_kku5KSTeKV{&HgE#Ffh^JM$3g=@!7Q$5M?dd#t7KPDdM*t>^4Q~9lNuEpN_ zOX`VxE*t#{xnJv!-^B0Bh<>b(J@3dl=IJjwY4GK>Qt<%66g}9&p<39kYFUtGA8X1v`8_#Um7#=E=EYdp=D0uwZz8nx9Mk z!=zJKYH6dG%Tqjp=lkV+GR8NEYMM_=P(SE>IyO$;F-HX1*73ln2I6xWjtWz#Z<4sA zc6*k}d8prKv~vtbZ)JOg9;5eqqU$7~EbUi5QkqZ_onnw`0MLQaUw5i(??eyK13VAEy2&WHtG^qn*9mkfPh1fg(N+0HZ*e)Ka%(fTdq80C?F z^s|(YNeYGB*=V(6XLfLs;a0hL9+v#5-5q7P4-x%gm(U%;AW{h5EzhHN$TZR$TPpe1 zt{{+d_MTp&)^klhJ}y_g-{pSrJ1Q@D>nEY}5cu3JaN)b9Uf4$jqZ9nuN9|7L+kSDH zxaz`NxoF?yLPp2@dn-+HrOEy4e~xCbnPkp zP_$WGG8zb+-ualJ@Pn3tJnk;Yr2l#&K z+t2_B=D)k+9kHvtk91Vvz^@aO@2W_oY zgD(@EEoY$f8#Ub1K5cp=X$fNudkv2$*A{uko_EM7+6!`@Lae8zju`$1%UJr1w4UUM}yCLBHV# z3s$P93LbFK@ECod3;AsnW4>?m*I~+p{cWR|^ZO}5VVM3yU)tzD=c_+3Ou*Eo9?rpW z{tzW743jxW54KT^{JErDgU-4-_G{gA{Vga(a0DOAzgP1Ke=HwFQh>FN<+mVL{P9@+ zBFTq;1$ycONrSI%r=O+e!o%Vtl3!Y`@71lfw7zdg@CYUKzl(QUTHnvxVrhME?@~+4 z`+Vpx9LSU0>ivbLS${D+6_^Yj{5SZcBy1!O6L#+}`j@Jk7^Zy4VH^F)QD{{8v~@}3 zUq%6P0TNLTY4f`cAD%;QEFb0SDJ-ElMFI6-e+v26Qap=d)c*{X!}yt`_Fkk*Y>7m^l3_lP% ztffn(EYi1=?cS~Ss$1VH-hGi6+F(@QSH4K_S^cGpWS^*{{!!X{4cjWaug~5i4d)%_ zeCYehtz~*`-P-kYj}x7d|9e#FC%b);@?Af79BIeTZ9Rkk_+F~k;N5vefvSl3CGNi$ zT;y}b!IGsC>ph{iP64}o@jJ`y0RJ#P!oPjCqraL767>BZiLljYbi4PK4^oBp-b!#kqo;mUy*N(<#+Bc8 z)Hfh-kO%Z17PEoFq)HG+P$+%xADW|+5BDb4f4EuwZ1pFymDXQpex6EZwcBL zUnh88!adDyLY*Ir|)mtK8joKF~V=_Cu5G? zgFSTHeHv-U?j3jdjsAgtU_Svd=*JI(ckSMv6CUHU-KS*l_lI^riQeBFu9kLkKUQgv z+m2-WWAFYWJT6 z=Yp|R&c2HdA?38rKQRbUF#Uu-3=q4=t|aEJyw7^R*pc9{$S3p;BAv9Gc7L4hkK|JK z5ES{_R38Kp;|)UY>;oKU_ipFd^x5t;G(W)Bc^lQvK;O`^?B%kaVe5uCuS-L)*G4hs zt#&T8aS@~UGBfd1dx4xZ|#9wepXan7L9yieUnzQF;_<3-a=)1kQ1vx&40v;m%ppN^Pe@?vg z(o4vv=%xB?_(f~d)NUeYV*4&h2b4w_>z4R~IE+W3UXE#%;r03E2jw~H9ie~};_X^4 zbGDv;-79c`-fumB-4f1dTqpVUYbAz$Bh=<|eT>icordf!G7lv`P0DM1^Do4#&FMew z*ZQrT?G>++I5YFCGvGa!0j=EFdMQ_bv&6P82YKTDzmNv%f$NM#tn#J^`>C_J(qJ0V5|5N)rwol5NzRWM`xq`zoe%QIz46PF)MCTzA zdW!M3y~=s#TKb!#buz|h_lq78dtv=*euwq{YYBh@XlCZX z1Sqz0X|JEl+4ybx9L!b!=Thod?2vR9wbQ4c!x~5R(O0+K`bsL# z!8-s={i=#@;|}ugL_2r3~svo%%tSrr>K2PQ7hG}>vZs+!Iz@$mtj8=>0GJ= zFfUyFIP<5tL*y<{ea%07IX}1cv^F9dmL}YEkm18y#ShQTkP2-b1@zzO_^X)|Wl%tV ztCNp$8ho(*a2vOShkby1(f3iV6aJVyS$l#fh3=eptH4{iM}(e0_c3fgELlG1$%0!{ zU!ol7eN%#7w8ZcPPfGjk`yWPE&f6&T=zE#AFJ}F2aQ2>R+FQ%;cCIS=?n{mKfUYeG zy1+-H%kbyCs~E5KV`={w_gnCY&-uZl+HXfV$>YWt#+yyYrGHl+lUTpkVeiG3?+p}v z3En0BlRwzZh>E|yisRA~VwXD35&iC%C+Blu|HmD_#r(kV*5{=@^G{blr}dxYxYEB8 zJ7xWA@&JGCA85fX$EUJM4-RYls9yMGwfYt1zRcyYItqKI{cH1^QN=_2KS_A3->qMB zJSwBy3ruei*-4=j_2v@&Mp;q6nLJqkmGoZa(%#uz@mRamAL+U3x9PR%Z%)4_0lO}G zE(Q*11owS7c`lA!utT2bn?=ppnyN8<@X(Bvbkx=*;RO1sjYI0%!KYfF>^JtoH` zz2Ccy@{k|3dl4llMD~r?gXd;_=JcKm<4frwwGRVIcS-QM^R7wl!vHt8JdYlfeh7xt zKJ+&;Kyg^@!~W^nhom0cyyHxE!}K($smId)KQlchc|<7bIT3tk3z8B38fRC$mu7NY zjLroKTrMRJu8phZaa+!HB8^~vtUWJ}Bf|G!mk^YraTs(I^WvZ8=w2a&;DC?F3+}Fz zpFd9Q-=nRgYC&Pb7LOxym89g6Y((|Hi>bE5CeX#S6kau@nfj!4z zh{$fVqLngFLOt0T!k6q7!br1^Valhc)L(i}Q`p2wFT7d!8LknzHoWEsy7$F5#KyN% zJRX=oYU{c-?(uqp!)KFgSKd$QxV7qiVuL^t+V{IZF0Wr;-U>gUv`O>|X`j-e-D|4z zd&6(?6Y72X;eHusgHkqd7$Th(&v54F**)IDI|Q$tgMfd7fHeBY)`!gR zG5&y&g@8J4}^a^VlwDYpF+Fi5y#E2N*sU&4>v=$;hm23n_z`;)h?fsF^WAdfvowG%0quJRml56N$B!}9*`XZ>J{PR?P z)X%BqkCydII>hXs-SdJpYBoDJ)kBx%Khb3+@wsXMYXUB46|X;}xD{W?BBV{Jc^9fZ~JD zR^pT13t;Q}g|p=ZQ0D9|es1e)wl16YIyoQw^HF}a=vOwS>sc%LarFMT-7kf9grp*A zK8;0m{{(!vhftUKpmyXj5eVaBFe?2MJSlQva%TPl_yUe3$8oghVzfus$AkAt`Lf)I zf9kFWqow9QVciSC);(>##r)*@W`4~3ET|v*gJd2jOm6EB%5(e9jh(->c~{!|Fw0$0 zy4UL>VM7moTx0mxz+0I4-H9>6i!?%-R&f#M4+sJFU0k#mIURE)zj#39LBI23d@k*i z{G=ac>%z7UUQKQ>g5|u=aQ!BCw(f`+?a!P=0|f?tTLkFR16)1KU) zl{x!WJl~1dD|MZ*JpUCuwd5j4Z(X25`;KX8uC`admumb0KM>O1GYoHfF-+uhe^Pr8 z-2YjH7KC0j=^W_NBWqc{aY5Uc#MBjJU z?-N5Wv1Dldo%4P}`Jv@>9ifcxd3m1DublT7=Nq3)ALr|OvgyT{+F|}gM*A0O@Wbq^ z(V4yAzF2)}?;cLuK3eqsgJsO#Xxy;%Ta2GRJsQ?n^!Hp^_d_n}^#P8e?=?qugy0cu ze8RlO(ukAacL>Zr89tq-+IL6|Z<^kQMfqraL&s3C@ncN&e)Cq&rgi4a_=kOeI$SOC zkV#+1`GMYJZ~IGj4@Lb#DQ|v|t^a0b>i&b6RWB+Z2>kr3ujU_P@0PUnQ&9)#u~y0N zqKNI1#sxZc#{K7%1IG*=`zWU=olQ%{E`FFWJRj%h!e{q6nLhS6(It(K&>sr*%HM3K zjHC0fTEO|m5=Y+HKPc(0+)nAc(=(uJ5S2~LrO(E2IpY^A$JJ@{B#`n@iGG2wk#@h0O zL7T#us6BnJDO?_;qe5@A9(`El&eo%g($1jDe#WHh(c-?44%1;q z3bwD&MwMeE%%yZadJ_CoS&weh_Sn2IvIon!S}(FYSNfb0tdxGVd0*sz=LH`90}m-& zEq*=vm;J8U$~W&b3>ft<9#Y7h{ZWo>ybhl@#^Z#&Uuox!ZG1I9)ZRxA_a9<-yPvuK zK}JXOuv47hX!h*M=LE0Hr>#59Kkq0PC^kzu8+YK>1N7q>hpPo&A+=b>i-)C*3_BJAYDW1~08x=xVZx*vdcR{DTzo)eAgP?vq4|IN2)U$eR zBm}^_c@6!cfb&;iWq7N!&-F`j^25#pZ(a*%vVT;5oZ{?E@pGbjj!658Yo%k_h(4~T ziHmt%lnqkR4&0b-@2Sipe2`09_p$oy-eugUKusaJQ2M|u3a;LMoyGxMe}>Yq<4!oi-=C{>9 z!r5MQF6dE72f99B>kKyEHT#(JZf3yzVet<;^xRXRe6f8P$Q#-Zdo)5Z=C_EgeZ`~t zUdCZLr*}lx9^SSbU!%l z$#>TxJ|B?swfI~}J!K%niKD3?EClfewDj_Gadd!=Q>pGtpDK0k5K(~uez;+ zbm%^FepKwgeYZL7$@l7DAJLxRsMtf;S>UmKnQYVT5Dz{_M@81cg}k;V3)^u{Xi1eSYBb zVF~4cPnZdyzrg7nTX*s=?xq9<*B(QT*$yjxH?bWye`f~EmDv~cGxWyZH?FiZmk55P z7t;{bUwX*wOvAM7jJ3o3|D5MD{h~t#+p36CnwDJk(AVwU0fjm-H?0twY)B7a` z@2(3Sar^7%uw94F(5`1|wClm2^LCv)L%WXEXjiY>F17nu7p8xFj}E`5Fevibc)rBh zMGx_hvBjFdUSh}zOnmm1`#2-ib0lM1pYtz7F4;ky-!|^$WHb-5 z{r!3!w`|=yH~VZEcaO;YvVM(}%hYA~hpkVyQHtB4^w(ohrC@Z}dPGs%S+QQLcGJfB z!pxL6M*3p&qG(;~EICJQ^P{vU_Ql?_fWHpQ0Xs;=qkY3+GJ_cZZGChu4cmB+6*MBY z?`IXSM-I(jh+RAmYHai4!Yti4lwqIjlh_NpPiX9ZDL+i*0CJSt1v-W)rYvvsK6!5M zXV|@L!6Ni3_0RS4JStD^;qnx7dF9{sPJyexN8(_q7`&gnei^`i()z(~pGdi5&X?Jr zF~7myrwERT{Mb2Q$SL|`>9>1_lGBV27r0Mgtz@FfgdKmfOFd~ zmvp`IXD%^IzOX0p3e5+6Gl80Xjdyz_ou1N5#O7*m}loD(%uKezm;s7M=s}IXI{rwJw&4^nEqg0fc`~#mZ|gcnA$Jz zv((?mN%lMNtBv>r6kQr)e0B9NXa^M0Pwhs4zMe(#QTosFPch4XEB&CbUB~x&pOd`5 z1v$VxkL?ig6QO(#SLP9@*OenXcd=dl-(f1l@|3{O^m2<;p7c53o9Taj3;m&B{s#Oh z@F()C-olS*9bpysL%6zG`h(gDE0kS)Ap>CF3I&S|Qdt)z*$!!3pj$!4h#`Ojf?@-s z;ae)=aOXsDFEJec694Ic94;Nf{g|E=8}PRp9Q6&=o82M;H-E7(*zWZ34RE{6@a}ek=SzG&Q>gTq5~K=TZo7-6;H-*CO%$Z4#f;%5ipK6T@W}`4X>_@@a1q zr(J)pmFP9U4EPM;cr0y(eH?D9WA?1+HdoyaCLtL-NFZHPbD9oXLwuRbLkd7)N1dE zihBBg!glt*zbr5CZ(t|TPQ=ikx6^t=H9vSADSD(|s*lO{I4kA-13ZsKJqTl4H7-aD zd=F4N3~xryA78Uj1awT?9?tF=Dylm8Q)aF+<9)O={FW$REKszWoQ53eZ?M6E3SM4duzC!dK=0d42Gm{ue zA-guqvF$51uH&RPf35H%`mWE61^mGL)1vm1`Nhd~jY8cDp>K}hfj@FBVX$$#joQ1VcW zK4(Pu&Lu)9v=Nz%Psgc>_3BF*EPBt@{B7ua%rCf|P@N&8Pm4#TPlh+CE$hwZk1(_BrR9tBogO z7t8i{%ey%754Q4PZs!{0Ky7Tt^S&oBvopB=y_-*O;Gx>+{v$Ha|7ndKCj^?-l>t>|93A z6Bu2X4--2l%)f>{g23WNsmJD>^XH0TkIomWoCilvb9;hg(ylW7LU*(tPUw(h=RED+ zMO*)|eA}mhUp+yX(SHbIs&960L9tWwua~&e{)#Nxc|be&J%8~lxj-A)@w@0(7scqO zVnOJ&^L3b)14H8t49@<&Pd`6SbRpjJsNg?Jzftmzi)8)|`-t?r=s!X&JB9s;6ONq1 zer$2=m5}3^od^7>1pJ3-K#lB1)tw_|@$mz=ZUafnPD3AJ?&C^Qk=M?})8mfS0OgyM^%=?MFJR=l+mJuyG7}@wSzO zk7A$lhc(9f&Z{Vm`8Jn-3;s$Pv8|gy-oKir@)Y}&KddpvZ+zzt_LIwFW0eBZ2yXet z^Q)I{B*!3Y<)~c8Q_=^TRpWDI{B;Xh6Nm&Bi```84&qi1*lhx-*P;Z9Dx_Cy_@_opv9 zPN4Zd(KW0w`Wfxy_XbmPw%i5QWV__JB#QXq4eTZ1IM;Mc0U?VA)F`r?)ooGua2`;zT$hCO;X~Qh z|2D1HOvS!zs={~uJV6zCCr6XQbmiTZb25Q+zZVVQ6inW0+i}^4e}-U1zD3@Dp5%LM zihQ2`AB4{$&p&^BrdQ#oB+ui{J(0GKmA~|Ik+(%0@jd47PjY%c9sDJq(&c+1UdMp; z{R|t=F%Dl(Pty9nEAkP3Vtu(t%18bW;dA|;VS4;C(HHeg%HzQ@_BU+(;EaAxqI`wl zqkfU`X)?d(t%-j8dF5YB4-)NP9G$ECf{eeD_;0`E$Rqq>%v>=~X`mn3jF0BCzl_-C zO;@Glxy@sikbet!v!jjefTpy#!F>NB)+Mf@bSLt=__4QSmZTf|CGDd)8w9f%zqw!HLD` zuTD&y{$3jCCG-UR?4UT!r-I9TXd^yxyC~*%wF*9zK^k*mgf5Di9{R)dP+p84C_4qz zhk23f*E1j1$n$QAyxl-X!PfK9UzpcqGcupC`f%JUR*(9LXRIg3=)K*#K4R-YD98H$ zlsw1$ndw`vX`-u{ewMVJTJ13Xgue=2HER2!d5z+?aTNL*Tel`U5Mb}VM(aQ3N0>de zbGD}MfIC8jC*ktCpV3A5e8Tr}jSDkpNIR7-vp;sv!kFe8ewk@!_xC&e~yZ);VTp-6wqwniQ=S9`d;oKZp6t#B|B`75CnXq<%j(1nFdzjBPQ8`P!3IcnW;d zLBm7`a_l`^cOM2r9Q6A~kKvbude!fIyQE#7FuflqUXAd8Ui_<0RuLw9e_O2LZXm$!_!JLo{EUzj;jdo{D6*&Yebmnr8e6Be zd^=}ff04l1I(KrNC_6`Jm__wcRbF*?7mV8zS* zJJ!xgub%W1!M?*Aofn6IPzd`ao<;b82X+~#vs>l9hqvp!SkZgaYWGY&>LEN7Y(KBG zRnou*JbTWQeH)`E;%i>uU_T&lX;0oiFu%a|vCqtp3v2L0_8pAQHfk3X68i)0d7%|b zKgJV;XC#XJ4C7Y_!JrWFiGHI zY(IFr%2~Ek+P@jZP_Xu7W{Tk3xV~M$yaL^ag?f|p>}gW{Aspb-{3bH+6zqMu3ivr< zxKN+K3wLdtH#)#apZoJ+ zu0X}eZ{a8!x9pyq6}lg5`;c~@6wbpE310Tq_)GkRQJ`Sw4{`3!NBSz{(zx($iE(a` z%ayd8r~|!MqWj+^fwOku{G(4Eo{fiZN<&zl6=>_^)BOU{^2=UWgWyqvN>FW!}z z@f;`O_`H$rI*xzP#>aLkllDH!KjtUtmB;#*@TNb)zbo)6ogd5#XqjHo*i2gE86Rc< z`~C&w8zIh@1}}TFwND&W_+c#smzjAnz@zuL%n!A3-QEi|yNBmwI-~bR-F!$wHF)%7 zwR~84&O;b9%7@@>^Afp?bxpH z^=gl7K8ELLkL81(_?{Z@AvQZ*F-|KU@M#snqCYT#HC~O9G`>QC2f$O- zk9seAL871Pw4W9Ni}=G-BszamjgPXZ-&Hj;Y;B(gKNBHTOXT|l4{Ea!3iTs#9 z(BN(ElzexcV4OPo8R~xoo9AF0m_zyX_e;KwS9YIDR+{Sa9?@7@@P;f}bj{-T2FHv6PM*t`a<9BU_vQn^hSCp@dmH*)c%A;K+MDd!9w&mF9BBI)q8qMl3qMx9_t6{0sR$z#Ug>*e7?kegA(KXfKNZ6e~9nW z^#X&tOY1lLX7deu|J2Se^8AU)YZ$Tj7Se1rh=0mwJFhk73*;RusbUHkPr(PfcgmjY zaOWA{({%b3@M6u$9_zi5X0Ol=;IVTB){iC+c+Prm?OF(I(tftbRr1*$SIK94TqWNp zd{*yKsto-J{>1FD_6O!cpx53{X!-$MN>H%<_NV-F|^wnjhAvcrk7u z-{!M%J8^2A<(nM9?=k(Lpa1FS8{h##X`o|8XJN&jzRpVqN;~u2J%vtxu+QJw-P7X_ z@9OI*_&bJn?ko%}U6%K+>n`>8kkwLhX#77T)x*Y3=H%Q z_(Q#gef@=w!9r(Guwqx=p2CWOq2AuYz>49%f!!+z$KcMsfj!y5zP_GPGTApYNYJIh z6+PWM2J!>JihNH`U&jj2SsEPZ?(HHvg>?R#9~>;~=^q5m`OZ#%xO;Gy-?z6gu(PLc zcs+>epz=gp`{sTSyL$Cd@9;prf9bMzpGeR9?Kk!H7TW#2`JSP|&yduPKB~0?HI`QF z7#t`RR`llgc6a3m3q=0bfndWx-<}(K2bscL#4RFYpgZ3?=y&&a7WS?7Z_MwzrBLX6 zbD_6uaM${M9rU}j_VwMehnPlXsOP&ox(UsOpw2G{rY z4R!6(^qUGnNq?@T`uc`9uvF6T(ykl&m}BLVTZp*z`yc^1BDcT4Z-9jEmY_t8B<3kx ziCYLUVu39sIJu?3B1Z5Io3;+*I|^~euN~^{8SL)W)|YN1ey^kcB|fj~+tWWZSfJJo z5|^X{grVFsYX(Rv_Y?-ZJ2tCie&GX$=l|~w@BP;ICw_S6FZJ9%pDp`w)Yfz{nDa96?a z7$T7%iOoxU{Zc>iEs1hnPhZI}Ry<>>*0PaFK5HY!73d6qUuWTyHIw5zoJd8?y-l;M@&6##SE;f6HIGBN!}{{Od@ANN{&k|7n+ecV*p^rN4RA=l=RV2lGqU&HTV` zwBCHt!S(*O+}E2Y7X09k+kU?6H0$dW?e#Cr-TzO`9rgcKvK3w3d&!cRrRXmCy?ulJ zo}t0~j-CRKcs>pOe&0@i2Q;Fznhgw$4}m%&RQ2Z?U)0g>Ad@^eknbj&G@LK_d%OF{ z-6(Xf>Gk_CO4fR=R-MJw@5m38$YtOrYd5JF-uOmyh+FwSV7ffys4Zgiye)~Yax2xb6dOO80@D2K=p*=ea1FQYk z!oVJk#C^Tj6?(g=t(~0%WLMVgrGXQ?ZC-ilWtU%Z2)C zNsOq$T{P$t(|i5Z1}SvCxv+C^wZEmiYZpbFkl$-~ERhyeZ;=a8M(^fUVL1j@>B%*v zQeQ_mx^ZjY?m{pBQIg9*H&T~hKhQVS-`YpN3Ipr+4HkOAlqrBj!^0F{xelTYgna!~?Lwu}0U_0IER;q(0wE zzQ=V1IKhL38dz(?S;2TOlIPc3q8ZP|zP{ZxP*w%0L1tB072X>z(cL?{$(X@__7C*!rL4{kdR=4i_ZJ3e_OBC=&hApjK=&TX21@F_J383Hq@cR+m)6#OS|R;(6X3Ji{tLQNICv(V8^)9%`xD^si5l@91EJmLhc zvB(rH8b{$sVWMPwF`fwr%7($l-M9xO&7T@m={^mma*Rs#s0g;~1tP&7!U z7(JYq6;Z!bpm}aDS!XiH3Vl;C4hqD!8rxKX1ttNurrbnt zXrWMrQZP_Jblai=1+{Fc+uatmUt3hV3u+6kpKh0m-q2TC_}()!$DZ>iZnsar;UUuR zyyu)bbJ5(+%-B2$rnVYa++tHfm*4lwXtZRWC`ta3jD8V`rtma0oBh{`A#>`_AM)MG(d~RFU6DE&<*rE`} z&Sww1RPe#5Rl!92hN!%GxsErFmEkSr%@7tMo3(T#$``ZkV)vAz>zSyLovHEpI%Rg& zDBDq(uxp(xlpNki7Z2FN(GCpIRm914f|Z{*QlP1$3+1dBpNVuacH%lY&1u%-FlZb^ zT(~yY9o@M7!mgb=H*Vn#Bs;H~m_qg|oT$NSuzBg?z%c7x()#Iw{t=pav~i}Z_3Q!yYvI~x7cE&9H!cm) zx^iIhK)Q#1ofG5N4iC`fnj>sIU|Hd6)nDtcVp(nRKDxkvD0%p(*s1mRbO6w4rO_F& zYv^ETBlX@Kp!Qoy>!|MylGZ1BjzH4Ro-26DhRKt}wf#r84h-#>=x(8NtSxL6*g;32 zz5V-pS?VOKx9?!|tM2kF8hE%2)k843Ky%a1Mg4fiE!V@xYK zjeu>4sI1xP!!ARz-wF$|!)EHMG#0GJR%TxOie9>+Xk6c?O_gyHZdOL?uJMzjy&x?^ zc1lVuV4ZfnBs)vu=PUg8nV>nwx2}hK`dC*M8!cOpSj)~f&kn7{H&NU;ZQ&bA>OHhN znkM={S)bd)=|9_?(GPy2vF16CwcTSs{14N`L$h79ejA&kiLC+K@R}Wv#(e4PNge7N z?xRheQA(o&9`mS$exvl0vHHsR4{eano#`Z<9q-Vui$0D1GU_L$4m0xyVy-1TzuAx6 zsTrFlt1EMm1E_S@^K!RwUBVd2#3p?oU87*zK;w{s+GN`n+D2!T8Kn8Z+C+O?zB1AVddRqv z!S`VMdfDaoiQX`F8Qr#p8la_4TX>@<{ezYCFJqTw#PV!9?d_PDH2O(VFY!P>ZQglf z*rCPb0m(k2FPN75kzV7Nf#xo2JD+E?vaX!i@0xk3t9+YzjiXarYs)9>eeCN&*W~KL z)@2$4ZJVg){qI`yw+;50m(`7(in&@F8@lxabPI&>N2reF*5WX z=$!b;n%#g$sq2pwWs%NgPyeC)SJCd5wn?2{x(|uAR>tOo?u}u)}U!$H8wRhH8-_1wKlaiwKs*DI+}ycjm=GTV_i#gYjaz3dvmC{qb1nV*wWO}+|tt0 z+S1n2-V$o*XbrYDwl=jkx3;vlwzjplw}x6f+JbG3ZB1>>Z7prBZEbDsZK1Y~_F#Ks zdsBOJdrNz3ds};Zd#Jr56bvGrJE8e9L^u5^$(A*kz;#u;Y`LRYSl`hkT*J7;T^ z`9O${4A@;CtCDm`ZuAecwbd=l4%w-=JRU_=YZR}mR+;AX$upFhu2W{5D$i2pD0Ax< zxE895<)!kK&a0Fs9ZxCGDK9JEQ+`nQ!vA~Hb{urbs~Ys<3muKq7dV&JEOM=IZE#Lou0QHt>Rjp! zs4cZy*B@)IneA2mt2cHy_Nz6)*{&sy`7Svea$ewC<@9=LJYj8_v#zGi(dnA!an^aF zUG2^F&7KC;d+f~Z7pzd1&z^VYf>YIR|#sMQXg8HqMWzJLeC2qDXSs8) z`%Ld9Z@_iR@!X}o7dSgSGs0|@xVx&}^rPi95B&02^K^Nkdzw={cH1q^t6cSt8jtT| z@y#_u=jea*4ywsno31&v?$o;7HFNck9NX-;dEN9`H$@k_-TDt#xXxW7C(m}wb1KKe zi)VDYMr)`PlOiMuXNUU zlxc4Lo*PTf8IF3#hn?N-I;T9n&KaVK3#g}UJ+`xMA+@DVokm$}Jo>+%;l0T%$qtvx z?N&T))l)OWyP$S%-Mo6=w7Tg|pJV3CQ)*_*bDVy8u4A5OzPvzLJX>?DaGYJ+AO{_d zN|XGs@`&=N^D*^L%Db+=DDOGmuX#Lm^w!%S2=0#EdRuzIe@&Zy!IpRb+_37ry_a?W z?55lAxa(t&JoU`8-+1X;-+t|lH{X|>#tPluxq404`Ip^v2L-?Q%(E|j`@1i{@uoDf zy02#I`{f6EZ@TN=`@Z$vm+NPo)wz0O*X~RAUQTy9-G0|2ROB1qdi{+zEA=xrb{*)| zZ~DS>&%f})S1NDcc=N3fKJ@$x-}vUsul^*G`RaFG`tHkJTet1rb9whIcij2Zm!E#& zYcGBCl^L_=T)Ov<@4WZE-uI!`UZ1wOe_+AF?(439;>jDHeQx%gMT<9W-nxyg|JUE} zrEmP;hyPi5`wvG3?;INb)R_&d9)9xa7ry!OE3e-ZzB?1VbMg0o@ZI;fZoA}Ck2>AA zY}H%8=^tocbKbg*>AQAZF+BFI;`d5F{w2LRLF+#4`0LK&8`Swu_l#qopQbPEm>hL%ehr?0lbUA9>^0Zm5t)BUw-5$j~ zr!MMT@1TdKoHN|h>pGna&*;|roL8QqkGYQL9P`}A|Kix=nO)@kJa?@_|2&0OHD2h@A5_nAOn02)38^bw$KRjfS69tA+p%Q&lIi+w z&f|B_t(`UU3D+vuYFg9$HTv_X4b|yCnpfx2-*@S+*ZuZBM|;h&y{GDVRsVOF*T34~ zb%)eVYMpzic9G)}=bjqC_tFAX6xn&YylDQVwVgFJvfnA! z(7wjC!f}qe+%IeGRKTgyg7SEkg>ok=?o=s@SD7a(N(b$foC>WN@*>3{*D|{(gM6wo zn|4{0o9b3&kHf1hl2=pNIw~2U>Zw+Ti&hzrQft)8nnWX2m=`D=)IL6zg>po8%2c_m z$`{Fsr%v4`D>b#AE@eK|C(G^AWE!KZR$f{oA9TuYYLqfpaXNg?div^?r^__&9SfC3 z^j}z!J*uqK*2uKF%EQWO^3@KfQX{(^KcSgGt@W@P71ixk`y!i7K>VqqfggT=Lz@yqWd# znd;oy21k&lO;MJ~>uJs_N*zttD!G|zRTLLZ_i{y*-(s_k{izL~&qt3e$Ul=mNe@ZW zR5}9=r~EmpUs9ruO|^~AYvs1-XVG+e9gS3{M_%Jt>XOxSuDcZevNg6-NWjaC#`5a&MnaO`%$@anlHBp3~aKMn!*ax>jj%x!5<^ zJzb*Tuq2=7q{jvosX>`T4^=pvE>%@Li=3ZuNbSxhRh}l#cFEJJ))_{Pt^;zG%B*qH z9Pspcq_|!&uc74W72oVR2R4{bb(-HpZ?Gpt=zX_S#N$?+=Zj_NAq^VFPd7d!b*cF| zW>wD9B`f{Dgd&-LC6M07U}iP`Elx4M@G>(~(kh>(d~6uAKG}D(#q66Tg{^#V(|C58 zNm4UCp3UB?%7!$hn@{&k(g|{#kt(J?LTR(C^iR{unXta^p-HtKL6HhHem>v$C(D*x zU}iq$N=2Gym17@M<+?{3e457>(|ycr1T@&&QCVfCm8hLOFaKl_ z+G-lZRP#}_;(3~1_Mz~*zrNl~702}^eUDjh=pD26nDrTX+cZy)TItg7Pd?uCpUnIP zD_@4%$A+r)$-djCJ8k9rm;RHl9~COc=Oh1Qb!30b{-w7cOc5_y@%)DrX@;4V{(`Id z_W&7xPw9NUV{Z#s!xCw*r?Y3B_~Kt^!Yf%pCI$!3d{EQ)}Nv2)L21l_($t|j@n~?eDmvMw*K?s2jtT@==1Mw z?;olBY+L#N-}9qxP%+-I!$NiyHZGQUZ-w{Pk7 z;`Hny+ovZ@KA#n|hF8h<_3d4Ux6hxI#}w=B`{oQdpKP!HDu~}gwzuc2 zWc&QAlI`p3vg6|Vx0h_+etev4Uq60Kw$G25H!9LOX48y+w~{y8{7JHX`oBoFuOIPl z`K0?>{c_o;WvaOEZ^Scu|9biAWq&=c{*8F`Z;ZcksagN5n=1$N%h_-`rJrJc zHRiANN*y8nQi}6D_Wb*8>1|XG-`^jiQM#-;?dgZ7NI#v@d3)^n*`)Df6?=LQrSoGC zd-}2|@~@a8o&D{GlhxlkMS5t8^wm?OpEpJN`YF=4P&z**vQHOFKUq63oFbjQ&V}dK z<0oIQ1HF`qhRw9xW?IYYc}n8jpo5fd-#_mm^E!V<`82D{-IUIb7uj$D{m;K+y4T1- z$Ic%Sk8}ENQH*zYT45>lZTYXB4^9=w{~Y zGruzH4_kkCDMR_#(0JSA?~!>H**b-jme8!>zt4h|pXD)2vTtqKw5FGpwdafd+LRxT z?>eYHdwXzv7f{^Z{sh&}r`x_f((jq|>kcz_wBG!@oXXEBOly8ZWR zPj97-AD=h&^ae^l&8Sh5*3;jSw6}j3na5a`7CL|6>lZV|KTP@U=NGq=`R|$K{|woF zz7_3b7po?RrBMIll;1wzpCI$!J}dPV@|lyxr9i(jv3|4U*C}p4pZZ(%y-E4)?Z^D@ zQk>7{8fq9ncAZUs&xap(v3bmo0qyB*+q8l;iiW4@J*olos}!YA{@tFwm(qD#UZ?zg z*|FmtJ`e2a`zW35uNKk&Y~b^i?=K6Fo9hr?zFL==kMDE&a-~20IKU!ba+q;G|Ekuz zJo&i!ddq*~eye`I4Sv8ZJ~0gz|JNUExzD7fAHKybQnE_2^@pX8-fSl1trdhFQ}Ai9 zvKk-kcS6b~NbGU?!vj}z8(-+&iT%l=6W{6H8S^`p>1Ox)@u%y%t^4$hLW7B(rq;HJip*OD z4bp85be~MO@%-?CZuagGBl!xdmfd*QZQe9T?Pf#HS`Mm7DQK>46Tim@I0i0&lh%a~ zUS9>QS^*ws?=5Eow+_x*3zf&K)#rgx_C^!Yqf(zg> zShY?p`TPlhqu>u@*|yM`-^Ku=humr){9oRh>n5BE)?Uwt)i3LMCZZ2s2God zvpdCjdbj8jIJ-xTkAoBJgpUS3e{^sGJi>N}w)`5~@Y-CwTy)|}(K@&QE`i6v+ErqG zC2$2i{vk1cWKeV*tb=pl@Q_%36kGsjhsFFQuzs}|uYx0NM@0i)J}Gb-oCU{IV)@Wf z(NS<5Tm+AUtKh&jV*Ocg@LDlm1jqgf;$ZDMF&+gcz$tL(da-=+2GJwn47dPRb+LR1 z96T<@gVym9U!F1RxQaUq);}ti*KQT-7CgNz_Cw@ap^wM;m?T9XGM>l5S@QObml?PxrapuMny*+6)im`I`etaqmPTO zg7qiFc;-pb<2ljUr$iV3RkZ($qO)M%m&N$V)1sr#ijF)dx&%%>FUDgpfD58Wz9u^I zb?}R#vtyzw;N*A2_&7N9T``^j>)^>q9xX0Vq3pc zYeW~;iuSJ;t%Eb0As!Ju4wlXr-rn zPJy%FF>nR!-zC-`1}DI2a2{L+s~3y)2f;D04ju&;!Bw!fTO3~moCIgU1@Ji77Zd9b zf#cv2a1LAoOMArn1K=n)1H3GfIw3od|5;40X6gV>%RI08<9b#NA( z2baJVuum7;697lRaj*`~fb-xYxB^y>L3_Yqa2%Wh$4A8aQsDUg5C@Ndb5Dx-OJLsN z#DA~jPl@@ZFNoH_A#mwm#rzep?~7tQ08TtD#=~C`9sjE69JmTjJ`ef9<6!LtF@Fr4 z1{c6;K`dVaOJ5V?0dN$Y0%yTv;0oCPb#Z)QZ~~kL=fP#L`l49B|J&gIBRUL@fwSN| zSo?ukUkp47E`zIJ{}09bLf}zw8C(U2ek9fx1qWUc<6&?W>??`+qu>#69$W!yKZg3i zIyeU|gMF`x^@YJna28wyOFt3o)4*YH44eXIz9Tm}38Q*2KN90Mo8X>bl)1XsYm z{}RU^1V_P1a2lKg7r_;9>@{)xS+MlF7|;A%^cc7Tj{ZW-UjUcDpQR^PF ziTxYc|36~+B)9SbhYY2aki(>%{U! z@HkjnFXj(}W8l&zF~7Q5bi}&hjxWCyxX>l$uYf}ri17qCyG4u_!Rl5q9s(DwKXl03 zH%1S{+kZbJ7l|%_qua%J9<1*WK?Tn3MWrF&p{!5TOO z4ufOhI5-8?!TgzVzCMjYJO>^F7r`ZP89WZIfU98XUYK8C4IBUm!69%I90Mo8Bj7Z6 z6r2N(fy>}3*!O91`ZaJ690o_hac~l>gVW$FI0r6(i{LW20+#L*r`HG8z(H^r90kY0 zNw5x1gR|fqxBxDK%is!Fx*w(=tbv2zFgOa1gOgw#oCasXIdB171ed`Tu=E+2ey|1( zg2Uh_I1WyNb#NM-1?Rv8a1mSvSHMyhrXQ?%$WXTdpe0bB%^!4MI0}w~lVBa324}%JZ~^22PeTgI1SE%bKnBF z2rh%GVCl2s^!vdYI0O!ZW8gSA1=hhCa2A{g7r-TO1*|?OPOk` z46cHGpA*{~0EfXba1uNM&VuvcBDe&ufF$G}B!30wwO!Nwncw_Q*2KP)a^4IBc8!7*?goC53M3^)rO1?Rv8a0y%iSHZqf zn0{~&90o_hac~l>gVW$qa1LAm7r|w41*|?IPOlH_2W#LEI0{aHb#NM-1?Rv8a1mSv zSHRMvFuh<690Z5KQE(ib1nb~5I1A2$i{Npv^q4q(esB(8#wF|dJU%_@VKE-*6CDMotmpA~`O=V>KW{x>$Kw@n-g-Wc$5YnxYuvtT z#QGxFiXI22t>?>l`P>a+{t|ffxERlY%eRT~ad6;MVmt^gJ|Mq~2Iaw0S&aL^qdyhn1#sl&VmuDcgHvyc`Ln+g9sITE5IFa?7>`)b>+tE#{aK7x zz=`+7xDFnFUySoNmhk$s9<~*cjQ8L;=(7T@g45RXCcJ#8RxF>X6Rl1c9RN!{F`fn| z&J^P%>;88>{?ryRKC)kQ7OYzLYx43MIBebj$m3b-en;*qxHKS+uRJI^J|sGQwdf4E za8!(sUn5$(UUUqsgY)1DIBnZ1CN8XV`6(^;56F0pOB9~ zd%sw|04{>VpB3}x!TLjDy!5DOe-8Ww(NVDaMKK-*kAe$Ni}}moa9)f@z9qU09{Ii) z&sq0#@%cAu-LJ)+2Zvr0%ZI@ca1^YA)8LV^Sbr8Q{Y;Ge!Ri}gJP6LdDaOaa(l5oh z`YX{x)h^4*+>Q6A&$( zB|5S~bj7+~fS1o&_XBXJtp0!QsMY_^9cdHm8|@G+b&9T_&k^IXHKMa?MHj)+Ix((o z7M+fWR?io$Um$wi>aXV07q$AQxyx36H21jG|I6)}95Ei5D>^n$ba=k# z!UECSLeVjBb&(j?HPPuMqEn}d)@<7sHhoq0f-V}^{9*5?()LU)FXrTt$vAt*Rq&F@ zICJ{R$vAuUQ09qAvs15>ZGTWhE_`k>&c>;~IO$rl)G$PUURi25aFqQqHTpFEE=2F) zh9d(~!x8$VfEhj7XMFbb(fghn1{0K<{?HHQ8DK?NP5;oqTE+h7@Aa}~v&26WSD5pG zkAz=O;||joR(__Hz}_*>2LAa?>%7hif8bqO?6j1XXUCvy;P*}N&kC>D3{O0tY|(h1 zFl#$6AFk6V#@10b@bUBZw^16Ob|ZuJPx+5#jS+hyeaG?t EKiFeb4gdfE 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 index e93ae379..2009814c 100644 --- 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 @@ -21,4 +21,3 @@ path = "../../programs/callee" [dependencies.caller] path = "../../programs/caller" -features = ["trident-fuzzing"] 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 index eba67958..6f92a3c9 100644 --- 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 @@ -1,4 +1,5 @@ // pub mod callee_fuzz_instructions { +// use crate::accounts_snapshots::*; // use trident_client::fuzzing::*; // #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] // pub enum FuzzInstruction { @@ -49,7 +50,7 @@ // } pub mod caller_fuzz_instructions { - use caller::trident_fuzz_InitializeCaller_snapshot::InitializeCallerSnapshot; + use crate::accounts_snapshots::*; use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { 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 index 16ed8311..7afeed42 100644 --- 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 @@ -7,19 +7,18 @@ 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; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -// mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_caller; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData {} +impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_caller, |fuzz_data: MyFuzzData| { + 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. diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index f0ed46fd..50e953f9 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -6037,10 +6037,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 62f6df2e..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 @@ -4,19 +4,16 @@ 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; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_unauthorized_access_2; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init_ix = FuzzInstruction_unauthorized_access_2::Initialize(Initialize::arbitrary(u)?); +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init_ix = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); Ok(vec![init_ix]) } @@ -24,7 +21,7 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_unauthorized_access_2, |fuzz_data: MyFuzzData| { + 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. diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index 4fee64df..040175d6 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -6037,10 +6037,10 @@ dependencies = [ name = "trident-derive-accounts-snapshots" version = "0.0.1" dependencies = [ + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", - "trident-fuzz", ] [[package]] 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 eda60538..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 @@ -4,26 +4,23 @@ 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; -// TODO: In case of using file extension for AccountsSnapshots -// uncomment the line below -mod accounts_snapshots; +pub type FuzzInstruction = FuzzInstruction_unchecked_arithmetic_0; struct MyFuzzData; -impl FuzzDataBuilder for MyFuzzData { - fn pre_ixs( - u: &mut arbitrary::Unstructured, - ) -> arbitrary::Result> { - let init = FuzzInstruction_unchecked_arithmetic_0::Initialize(Initialize::arbitrary(u)?); +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); Ok(vec![init]) } } fn main() { loop { - fuzz_trident!(fuzz_ix: FuzzInstruction_unchecked_arithmetic_0, |fuzz_data: MyFuzzData| { + 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. From e6b16b025596dff83ae2f69be09a64d7207bae40 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 14 Aug 2024 12:17:59 +0200 Subject: [PATCH 55/56] =?UTF-8?q?=F0=9F=93=9D=20Update=20Changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d621cf9..f1de3bfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,18 +9,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 incremented upon a breaking change and the patch version will be incremented for features. ## [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)) -- del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) - feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) -- del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) - 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)) -- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) - fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) -- feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) + +### 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 From 8ae445048b4613be9a5c080d4c17c051394b03c9 Mon Sep 17 00:00:00 2001 From: lukacan Date: Wed, 14 Aug 2024 13:01:26 +0200 Subject: [PATCH 56/56] =?UTF-8?q?=F0=9F=93=8C=20Update=20release=20version?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 12 ++++++------ crates/cli/Cargo.toml | 4 ++-- crates/client/Cargo.toml | 10 +++++----- .../src/templates/program_client/Cargo.toml.tmpl | 2 +- .../src/templates/trident-tests/Cargo_fuzz.toml.tmpl | 2 +- .../src/templates/trident-tests/Cargo_poc.toml.tmpl | 2 +- crates/fuzz/derive/display_ix/Cargo.toml | 2 +- crates/fuzz/derive/fuzz_deserialize/Cargo.toml | 2 +- crates/fuzz/derive/fuzz_test_executor/Cargo.toml | 2 +- crates/test/Cargo.toml | 2 +- .../docs/fuzzing/fuzzing-current-limitations.md | 1 - documentation/docs/fuzzing/fuzzing-examples.md | 7 +++++++ .../initialization/fuzzing-initialization-all.md | 2 +- documentation/docs/home/home-installation.md | 5 +++-- 14 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94052447..7dc015f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6157,7 +6157,7 @@ dependencies = [ [[package]] name = "trident-cli" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "clap 4.3.19", @@ -6169,7 +6169,7 @@ dependencies = [ [[package]] name = "trident-client" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anchor-client", "anchor-lang", @@ -6228,7 +6228,7 @@ dependencies = [ [[package]] name = "trident-derive-displayix" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "quote", @@ -6237,7 +6237,7 @@ dependencies = [ [[package]] name = "trident-derive-fuzz-deserialize" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "quote", @@ -6246,7 +6246,7 @@ dependencies = [ [[package]] name = "trident-derive-fuzz-test-executor" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "quote", @@ -6280,7 +6280,7 @@ dependencies = [ [[package]] name = "trident-test" -version = "0.3.2" +version = "0.3.3" dependencies = [ "darling 0.13.4", "macrotest", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 38a3435b..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" @@ -9,7 +9,7 @@ description = "Trident is Rust based testing framework providing several conveni [dependencies] # TRIDENT -trident-client = { path = "../client", version = "0.6.0" } +trident-client = { path = "../client", version = "0.7.0" } # SOLANA solana-sdk = { workspace = true } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 648d1cdd..0a951805 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trident-client" -version = "0.6.0" +version = "0.7.0" edition = "2021" repository = "https://github.com/Ackee-Blockchain/trident" license-file = "../../LICENSE" @@ -15,12 +15,12 @@ pretty_assertions = "1.1.0" [dependencies] # TRIDENT -trident-derive-displayix = { path = "../fuzz/derive/display_ix", version = "0.0.1" } -trident-derive-fuzz-deserialize = { path = "../fuzz/derive/fuzz_deserialize", version = "0.0.1" } -trident-derive-fuzz-test-executor = { path = "../fuzz/derive/fuzz_test_executor", version = "0.0.1" } +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.2" } +trident-test = { path = "../test", version = "0.3.3" } trident-fuzz = { path = "../fuzz", version = "0.1.0" } # ANCHOR 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 be583182..cd0687a6 100644 --- a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl @@ -13,4 +13,4 @@ assert_matches = "1.4.0" [dependencies.trident-client] -version = "0.6.0" +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/fuzz/derive/display_ix/Cargo.toml b/crates/fuzz/derive/display_ix/Cargo.toml index a8bf1c66..532dd5a0 100644 --- a/crates/fuzz/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/fuzz/derive/fuzz_deserialize/Cargo.toml b/crates/fuzz/derive/fuzz_deserialize/Cargo.toml index fe882895..f0b0a01a 100644 --- a/crates/fuzz/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/fuzz/derive/fuzz_test_executor/Cargo.toml b/crates/fuzz/derive/fuzz_test_executor/Cargo.toml index aabecf6c..655ba5dd 100644 --- a/crates/fuzz/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/test/Cargo.toml b/crates/test/Cargo.toml index d1593e22..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" 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/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` | |