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