Skip to content

Commit b516506

Browse files
[Solana]: Support adding instruction at specified index (#4415)
* [Solana]: Support adding instruction at specified index * Rename tw_solana_transaction_add_instruction to tw_solana_transaction_insert_instruction --------- Co-authored-by: Sergei Boiko <[email protected]>
1 parent 9693d83 commit b516506

File tree

3 files changed

+177
-95
lines changed

3 files changed

+177
-95
lines changed

rust/chains/tw_solana/src/modules/utils.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,15 +175,30 @@ impl SolanaTransaction {
175175
.tw_err(SigningErrorType::Error_internal)
176176
}
177177

178-
pub fn add_instruction(encoded_tx: &str, instruction: &str) -> SigningResult<String> {
178+
pub fn insert_instruction(
179+
encoded_tx: &str,
180+
insert_at: i32,
181+
instruction: &str,
182+
) -> SigningResult<String> {
179183
let tx_bytes = base64::decode(encoded_tx, STANDARD)?;
180184
let mut tx: VersionedTransaction =
181185
bincode::deserialize(&tx_bytes).map_err(|_| SigningErrorType::Error_input_parse)?;
182186

183187
let instruction: Instruction =
184188
serde_json::from_str(instruction).map_err(|_| SigningErrorType::Error_input_parse)?;
185189

186-
tx.message.push_instruction(
190+
if insert_at >= 0 && insert_at as usize > tx.message.instructions().len() {
191+
return Err(SigningError::from(SigningErrorType::Error_invalid_params));
192+
}
193+
194+
let final_insert_at = if insert_at < 0 {
195+
tx.message.instructions().len() // Append to the end if negative
196+
} else {
197+
insert_at as usize // Use the specified position
198+
};
199+
200+
tx.message.insert_instruction(
201+
final_insert_at,
187202
instruction.program_id,
188203
instruction.accounts,
189204
instruction.data,

0 commit comments

Comments
 (0)