From 34ac508ed12a1d7ce45b279d5c44c877ff8741d0 Mon Sep 17 00:00:00 2001 From: ananas Date: Wed, 4 Feb 2026 12:58:00 +0000 Subject: [PATCH 1/2] fix: compress only len check --- .../program/src/compressed_token/transfer2/token_inputs.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs b/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs index 2416f51153..5ccf5648de 100644 --- a/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs +++ b/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs @@ -57,6 +57,12 @@ pub fn set_input_compressed_accounts<'a>( if idx >= MAX_COMPRESSIONS { return Err(TokenError::CompressionIndexOutOfBounds.into()); } + // Check compression_index is within actual compressions length + let compressions_len = + inputs.compressions.as_ref().map(|c| c.len()).unwrap_or(0); + if idx >= compressions_len { + return Err(TokenError::CompressionIndexOutOfBounds.into()); + } // Check uniqueness - error if compression_index already used if compression_to_input[idx].is_some() { return Err(TokenError::DuplicateCompressionIndex.into()); From 7d8aaf038acce00163e1dcfe2c118f4573a5ecd0 Mon Sep 17 00:00:00 2001 From: ananas-block Date: Fri, 6 Feb 2026 07:35:54 +0100 Subject: [PATCH 2/2] perf: move len compute out of loop --- .../program/src/compressed_token/transfer2/token_inputs.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs b/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs index 5ccf5648de..f22e939936 100644 --- a/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs +++ b/programs/compressed-token/program/src/compressed_token/transfer2/token_inputs.rs @@ -28,6 +28,7 @@ pub fn set_input_compressed_accounts<'a>( ) -> Result<[Option; MAX_COMPRESSIONS], ProgramError> { // compression_to_input[compression_index] = Some(input_index), None means unset let mut compression_to_input: [Option; MAX_COMPRESSIONS] = [None; MAX_COMPRESSIONS]; + let compressions_len = inputs.compressions.as_ref().map(|c| c.len()).unwrap_or(0); for (i, input_data) in inputs.in_token_data.iter().enumerate() { let input_lamports = if let Some(lamports) = inputs.in_lamports.as_ref() { @@ -58,8 +59,6 @@ pub fn set_input_compressed_accounts<'a>( return Err(TokenError::CompressionIndexOutOfBounds.into()); } // Check compression_index is within actual compressions length - let compressions_len = - inputs.compressions.as_ref().map(|c| c.len()).unwrap_or(0); if idx >= compressions_len { return Err(TokenError::CompressionIndexOutOfBounds.into()); }