From 9dff24ac1b4b857c18d0f3c3d5f5b123d805b86c Mon Sep 17 00:00:00 2001 From: Shahan Khatchadourian Date: Tue, 4 Aug 2026 15:53:27 -0400 Subject: [PATCH] build(fmt): extend make fmt to the Solana preset tree `cargo fmt` stops at `presets/mod.rs`, which declares its submodules through `include!(concat!(env!("OUT_DIR"), ...))` -- rustfmt does not follow an `include!` of a generated path, so no preset source is formatted or checked. The CI gate (`make generated` followed by a clean-tree check) inherits that blind spot. Enumerate the preset sources in the `fmt` target so they are covered by the same gate as the rest of `src/`, and reformat the 11 files that the gate never saw. The reformat is pure re-wrapping; no tokens change. Add `src/rustfmt.toml` pinning edition 2024 so running `rustfmt ` directly on a preset matches what `cargo fmt` and the Makefile produce (bare rustfmt otherwise defaults to edition 2015). Closes #434 --- src/Makefile | 14 ++++++++++++++ .../visualsign-solana/src/presets/drift/mod.rs | 6 ++---- .../src/presets/exponent_finance/mod.rs | 11 +++++------ .../src/presets/jupiter_borrow/mod.rs | 11 +++++------ .../src/presets/jupiter_earn/mod.rs | 11 +++++------ .../src/presets/jupiter_perps/mod.rs | 11 +++++------ .../src/presets/kamino_borrow/mod.rs | 11 +++++------ .../src/presets/meteora_damm_v2/mod.rs | 5 ++++- .../src/presets/meteora_dlmm/mod.rs | 12 ++++++------ .../src/presets/neutral_trade/mod.rs | 6 +----- .../src/presets/orca_whirlpool/mod.rs | 6 +++++- .../src/presets/swig_wallet/mod.rs | 18 +++++------------- src/rustfmt.toml | 1 + 13 files changed, 63 insertions(+), 60 deletions(-) create mode 100644 src/rustfmt.toml diff --git a/src/Makefile b/src/Makefile index 7ba8d6016..3429dfcec 100644 --- a/src/Makefile +++ b/src/Makefile @@ -46,9 +46,23 @@ test: build cargo test -p visualsign --features diagnostics --lib cargo test -p visualsign-solana --features diagnostics --lib +# Solana preset sources, which `cargo fmt` cannot reach. `presets/mod.rs` +# declares its submodules through `include!(concat!(env!("OUT_DIR"), ...))`, a +# path that exists only after codegen, and rustfmt does not follow an `include!` +# of a generated path -- so `cargo fmt` formats `presets/mod.rs` and nothing +# beneath it. These files are enumerated so `fmt` covers them directly. +# +# `find` rather than a literal list: presets are scaffolded one directory per +# program and the set grows with each new one, so a hardcoded list drops files +# out of the gate as soon as it goes stale. +SOLANA_PRESET_SOURCES := $(shell find chain_parsers/visualsign-solana/src/presets -name '*.rs' 2>/dev/null | sort) + .PHONY: fmt fmt: cargo fmt + @test -n "$(SOLANA_PRESET_SOURCES)" || { echo "no preset sources found under chain_parsers/visualsign-solana/src/presets"; exit 1; } + @echo "rustfmt $(words $(SOLANA_PRESET_SOURCES)) Solana preset sources" + @rustfmt $(SOLANA_PRESET_SOURCES) .PHONY: lint lint: diff --git a/src/chain_parsers/visualsign-solana/src/presets/drift/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/drift/mod.rs index 0bdf12ccd..da4a3bfa5 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/drift/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/drift/mod.rs @@ -250,8 +250,7 @@ mod tests { #[test] fn test_build_fallback_fields_renders_unknown_instruction() { - let (title, condensed, expanded) = - build_fallback_fields(DRIFT_PROGRAM_ID).unwrap(); + let (title, condensed, expanded) = build_fallback_fields(DRIFT_PROGRAM_ID).unwrap(); assert_eq!(title, "Drift: Unknown Instruction"); assert_eq!(condensed.len(), 2); assert_eq!(expanded.len(), 2); @@ -261,8 +260,7 @@ mod tests { fn test_build_parsed_fields_renders_deposit_instruction() { let instruction = make_parsed_instruction("deposit"); let (title, condensed, expanded) = - build_parsed_fields(&instruction, DRIFT_PROGRAM_ID) - .unwrap(); + build_parsed_fields(&instruction, DRIFT_PROGRAM_ID).unwrap(); assert_eq!(title, "Drift: deposit"); assert!(!condensed.is_empty()); assert!(!expanded.is_empty()); diff --git a/src/chain_parsers/visualsign-solana/src/presets/exponent_finance/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/exponent_finance/mod.rs index ab94990d8..7982a80a9 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/exponent_finance/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/exponent_finance/mod.rs @@ -36,7 +36,10 @@ impl InstructionVisualizer for ExponentFinanceVisualizer { let data = context.data(); let instruction_data_hex = hex::encode(data); - let fallback_text = format!("Program ID: {}\nData: {instruction_data_hex}", view.program_id); + let fallback_text = format!( + "Program ID: {}\nData: {instruction_data_hex}", + view.program_id + ); let parsed = parse_exponent_finance_instruction(data, &view.accounts); @@ -110,11 +113,7 @@ fn parse_exponent_finance_instruction( }) } -fn build_named_accounts( - data: &[u8], - idl: &Idl, - accounts: &[String], -) -> BTreeMap { +fn build_named_accounts(data: &[u8], idl: &Idl, accounts: &[String]) -> BTreeMap { let mut named_accounts = BTreeMap::new(); let idl_instruction = idl.instructions.iter().find(|inst| { diff --git a/src/chain_parsers/visualsign-solana/src/presets/jupiter_borrow/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/jupiter_borrow/mod.rs index 2f2d43c22..425592c37 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/jupiter_borrow/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/jupiter_borrow/mod.rs @@ -35,7 +35,10 @@ impl InstructionVisualizer for JupiterBorrowVisualizer { let data = context.data(); let instruction_data_hex = hex::encode(data); - let fallback_text = format!("Program ID: {}\nData: {instruction_data_hex}", view.program_id); + let fallback_text = format!( + "Program ID: {}\nData: {instruction_data_hex}", + view.program_id + ); let parsed = parse_jupiter_borrow_instruction(data, &view.accounts); @@ -106,11 +109,7 @@ fn parse_jupiter_borrow_instruction( }) } -fn build_named_accounts( - data: &[u8], - idl: &Idl, - accounts: &[String], -) -> BTreeMap { +fn build_named_accounts(data: &[u8], idl: &Idl, accounts: &[String]) -> BTreeMap { let mut named_accounts = BTreeMap::new(); let idl_instruction = idl.instructions.iter().find(|inst| { diff --git a/src/chain_parsers/visualsign-solana/src/presets/jupiter_earn/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/jupiter_earn/mod.rs index a884db93f..5eed32147 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/jupiter_earn/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/jupiter_earn/mod.rs @@ -35,7 +35,10 @@ impl InstructionVisualizer for JupiterEarnVisualizer { let data = context.data(); let instruction_data_hex = hex::encode(data); - let fallback_text = format!("Program ID: {}\nData: {instruction_data_hex}", view.program_id); + let fallback_text = format!( + "Program ID: {}\nData: {instruction_data_hex}", + view.program_id + ); let parsed = parse_jupiter_earn_instruction(data, &view.accounts); @@ -106,11 +109,7 @@ fn parse_jupiter_earn_instruction( }) } -fn build_named_accounts( - data: &[u8], - idl: &Idl, - accounts: &[String], -) -> BTreeMap { +fn build_named_accounts(data: &[u8], idl: &Idl, accounts: &[String]) -> BTreeMap { let mut named_accounts = BTreeMap::new(); let idl_instruction = idl.instructions.iter().find(|inst| { diff --git a/src/chain_parsers/visualsign-solana/src/presets/jupiter_perps/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/jupiter_perps/mod.rs index 9518e17d4..47e8eb222 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/jupiter_perps/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/jupiter_perps/mod.rs @@ -36,7 +36,10 @@ impl InstructionVisualizer for JupiterPerpsVisualizer { let data = context.data(); let instruction_data_hex = hex::encode(data); - let fallback_text = format!("Program ID: {}\nData: {instruction_data_hex}", view.program_id); + let fallback_text = format!( + "Program ID: {}\nData: {instruction_data_hex}", + view.program_id + ); let parsed = parse_jupiter_perps_instruction(data, &view.accounts); @@ -110,11 +113,7 @@ fn parse_jupiter_perps_instruction( }) } -fn build_named_accounts( - data: &[u8], - idl: &Idl, - accounts: &[String], -) -> BTreeMap { +fn build_named_accounts(data: &[u8], idl: &Idl, accounts: &[String]) -> BTreeMap { let mut named_accounts = BTreeMap::new(); let idl_instruction = idl.instructions.iter().find(|inst| { diff --git a/src/chain_parsers/visualsign-solana/src/presets/kamino_borrow/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/kamino_borrow/mod.rs index 2130c33a1..57776de54 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/kamino_borrow/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/kamino_borrow/mod.rs @@ -35,7 +35,10 @@ impl InstructionVisualizer for KaminoBorrowVisualizer { let data = context.data(); let instruction_data_hex = hex::encode(data); - let fallback_text = format!("Program ID: {}\nData: {instruction_data_hex}", view.program_id); + let fallback_text = format!( + "Program ID: {}\nData: {instruction_data_hex}", + view.program_id + ); let parsed = parse_kamino_borrow_instruction(data, &view.accounts); @@ -106,11 +109,7 @@ fn parse_kamino_borrow_instruction( }) } -fn build_named_accounts( - data: &[u8], - idl: &Idl, - accounts: &[String], -) -> BTreeMap { +fn build_named_accounts(data: &[u8], idl: &Idl, accounts: &[String]) -> BTreeMap { let mut named_accounts = BTreeMap::new(); let idl_instruction = idl.instructions.iter().find(|inst| { diff --git a/src/chain_parsers/visualsign-solana/src/presets/meteora_damm_v2/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/meteora_damm_v2/mod.rs index 4ae48cd3d..0048a3e4a 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/meteora_damm_v2/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/meteora_damm_v2/mod.rs @@ -78,7 +78,10 @@ impl InstructionVisualizer for MeteoraDammV2Visualizer { }), }; - let fallback_text = format!("Program ID: {}\nData: {instruction_data_hex}", view.program_id); + let fallback_text = format!( + "Program ID: {}\nData: {instruction_data_hex}", + view.program_id + ); Ok(AnnotatedPayloadField { static_annotation: None, diff --git a/src/chain_parsers/visualsign-solana/src/presets/meteora_dlmm/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/meteora_dlmm/mod.rs index 820a6b274..fbd8b081d 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/meteora_dlmm/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/meteora_dlmm/mod.rs @@ -86,7 +86,11 @@ impl InstructionVisualizer for MeteoraDlmmVisualizer { expanded: Some(expanded), }; - let fallback_text = format!("Program ID: {}\nData: {}", view.program_id, hex::encode(data)); + let fallback_text = format!( + "Program ID: {}\nData: {}", + view.program_id, + hex::encode(data) + ); Ok(AnnotatedPayloadField { static_annotation: None, @@ -116,11 +120,7 @@ fn get_meteora_dlmm_idl() -> Option<&'static Idl> { .as_ref() } -fn build_named_accounts( - idl: &Idl, - data: &[u8], - accounts: &[String], -) -> Vec<(String, String)> { +fn build_named_accounts(idl: &Idl, data: &[u8], accounts: &[String]) -> Vec<(String, String)> { if data.len() < 8 { return Vec::new(); } diff --git a/src/chain_parsers/visualsign-solana/src/presets/neutral_trade/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/neutral_trade/mod.rs index a8145cdfb..16642762d 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/neutral_trade/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/neutral_trade/mod.rs @@ -102,11 +102,7 @@ fn load_idl() -> Result { .map_err(|e| VisualSignError::DecodeError(format!("Invalid Neutral Trade IDL: {e}"))) } -fn build_named_accounts( - data: &[u8], - accounts: &[String], - idl: &Idl, -) -> BTreeMap { +fn build_named_accounts(data: &[u8], accounts: &[String], idl: &Idl) -> BTreeMap { let mut named_accounts = BTreeMap::new(); let matching_idl_instruction = idl.instructions.iter().find(|inst| { diff --git a/src/chain_parsers/visualsign-solana/src/presets/orca_whirlpool/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/orca_whirlpool/mod.rs index 6a6728ff5..48e66df29 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/orca_whirlpool/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/orca_whirlpool/mod.rs @@ -62,7 +62,11 @@ impl InstructionVisualizer for OrcaWhirlpoolVisualizer { expanded: Some(expanded), }; - let fallback_text = format!("Program ID: {}\nData: {}", view.program_id, hex::encode(data)); + let fallback_text = format!( + "Program ID: {}\nData: {}", + view.program_id, + hex::encode(data) + ); Ok(AnnotatedPayloadField { static_annotation: None, diff --git a/src/chain_parsers/visualsign-solana/src/presets/swig_wallet/mod.rs b/src/chain_parsers/visualsign-solana/src/presets/swig_wallet/mod.rs index 44a3e2002..2312cca22 100644 --- a/src/chain_parsers/visualsign-solana/src/presets/swig_wallet/mod.rs +++ b/src/chain_parsers/visualsign-solana/src/presets/swig_wallet/mod.rs @@ -871,10 +871,7 @@ fn build_inner_instruction( }) } -fn visualize_inner_instruction( - instruction: Instruction, - parent_depth: usize, -) -> Option { +fn visualize_inner_instruction(instruction: Instruction, parent_depth: usize) -> Option { let visualizers: Vec> = available_visualizers(); let visualizer_refs: Vec<&dyn InstructionVisualizer> = visualizers.iter().map(|viz| viz.as_ref()).collect(); @@ -1140,9 +1137,7 @@ fn nested_too_deeply_field( instruction_number: usize, depth: usize, ) -> Result { - let summary = format!( - "Swig: Nested too deeply (depth {depth}, limit {MAX_CALL_DEPTH})" - ); + let summary = format!("Swig: Nested too deeply (depth {depth}, limit {MAX_CALL_DEPTH})"); let condensed = SignablePayloadFieldListLayout { fields: vec![make_text_field("Instruction", summary.clone())?], }; @@ -1150,10 +1145,7 @@ fn nested_too_deeply_field( fields: vec![ make_text_field("Instruction Type", "Nested Too Deeply")?, make_text_field("Nesting Depth", depth.to_string())?, - make_text_field( - "Nesting Depth Limit", - MAX_CALL_DEPTH.to_string(), - )?, + make_text_field("Nesting Depth Limit", MAX_CALL_DEPTH.to_string())?, ], }; let preview_layout = SignablePayloadFieldPreviewLayout { @@ -2772,8 +2764,8 @@ mod tests { // data(inner_data)] let mut data: Vec = vec![0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; for _ in 0..levels { - let inner_len = u16::try_from(data.len()) - .expect("nested payload exceeds u16 bound"); + let inner_len = + u16::try_from(data.len()).expect("nested payload exceeds u16 bound"); let mut next = Vec::with_capacity(data.len() + 14); // SignV1 header: payload_len = 6 + inner_len (compact bytes wrapping `data`). let payload_len = 6u16 + inner_len; diff --git a/src/rustfmt.toml b/src/rustfmt.toml new file mode 100644 index 000000000..f216078d9 --- /dev/null +++ b/src/rustfmt.toml @@ -0,0 +1 @@ +edition = "2024"