From bbe997de14f70d31a3552e1328ee80b8652f04a2 Mon Sep 17 00:00:00 2001 From: Sarfaraz Nawaz Date: Thu, 2 Oct 2025 19:24:28 +0530 Subject: [PATCH] feat: optimize commit-from-buffer instruction using Pinocchio for lower CU consumption --- src/lib.rs | 3 ++ .../fast/commit_state_from_buffer.rs | 46 +++++++++++++++++++ src/processor/fast/mod.rs | 2 + 3 files changed, 51 insertions(+) create mode 100644 src/processor/fast/commit_state_from_buffer.rs diff --git a/src/lib.rs b/src/lib.rs index 1ff540f4..f31027cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -112,6 +112,9 @@ pub fn fast_process_instruction( discriminator::DlpDiscriminator::CommitState => Some( processor::fast::process_commit_state(program_id, accounts, data), ), + discriminator::DlpDiscriminator::CommitStateFromBuffer => Some( + processor::fast::process_commit_state_from_buffer(program_id, accounts, data), + ), discriminator::DlpDiscriminator::Undelegate => Some(processor::fast::process_undelegate( program_id, accounts, data, )), diff --git a/src/processor/fast/commit_state_from_buffer.rs b/src/processor/fast/commit_state_from_buffer.rs new file mode 100644 index 00000000..0fd66d7e --- /dev/null +++ b/src/processor/fast/commit_state_from_buffer.rs @@ -0,0 +1,46 @@ +use crate::args::CommitStateFromBufferArgs; +use crate::processor::fast::{process_commit_state_internal, CommitStateInternalArgs}; + +use borsh::BorshDeserialize; +use pinocchio::account_info::AccountInfo; +use pinocchio::program_error::ProgramError; +use pinocchio::pubkey::Pubkey; +use pinocchio::ProgramResult; + +pub fn process_commit_state_from_buffer( + _program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> ProgramResult { + let args = + CommitStateFromBufferArgs::try_from_slice(data).map_err(|_| ProgramError::BorshIoError)?; + + let commit_record_lamports = args.lamports; + let commit_record_nonce = args.nonce; + let allow_undelegation = args.allow_undelegation; + + let [validator, delegated_account, commit_state_account, commit_record_account, delegation_record_account, delegation_metadata_account, state_buffer_account, validator_fees_vault, program_config_account, system_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + let state = state_buffer_account.try_borrow_data()?; + let commit_state_bytes: &[u8] = &state; + + let commit_args = CommitStateInternalArgs { + commit_state_bytes, + commit_record_lamports, + commit_record_nonce, + allow_undelegation, + validator, + delegated_account, + commit_state_account, + commit_record_account, + delegation_record_account, + delegation_metadata_account, + validator_fees_vault, + program_config_account, + system_program, + }; + process_commit_state_internal(commit_args) +} diff --git a/src/processor/fast/mod.rs b/src/processor/fast/mod.rs index cc342996..034f329c 100644 --- a/src/processor/fast/mod.rs +++ b/src/processor/fast/mod.rs @@ -1,9 +1,11 @@ mod commit_state; +mod commit_state_from_buffer; mod delegate; mod undelegate; mod utils; pub use commit_state::*; +pub use commit_state_from_buffer::*; pub use delegate::*; pub use undelegate::*;