use solana_hash::Hash;
use solana_instruction::Instruction;
use solana_keypair::Keypair;
pub use solana_message::v1::TransactionConfig;
use solana_message::{v1, VersionedMessage};
use solana_pubkey::Pubkey;
use solana_transaction::versioned::VersionedTransaction;
use crate::rpc::errors::RpcError;
pub const MAX_TX_V1_SIZE: usize = 4096;
pub const MAX_LEGACY_TX_SIZE: usize = 1232;
pub const DEFAULT_COMPUTE_UNIT_LIMIT: u32 = 1_000_000;
pub fn default_tx_config() -> TransactionConfig {
with_defaults(TransactionConfig::default())
}
pub const DEFAULT_LOADED_ACCOUNTS_DATA_SIZE_LIMIT: u32 = 64 * 1024 * 1024;
pub fn with_defaults(config: TransactionConfig) -> TransactionConfig {
TransactionConfig {
compute_unit_limit: config
.compute_unit_limit
.or(Some(DEFAULT_COMPUTE_UNIT_LIMIT)),
loaded_accounts_data_size_limit: config
.loaded_accounts_data_size_limit
.or(Some(DEFAULT_LOADED_ACCOUNTS_DATA_SIZE_LIMIT)),
..config
}
}
pub fn build_v1_transaction(
instructions: &[Instruction],
payer: &Pubkey,
signers: &[&Keypair],
recent_blockhash: Hash,
config: TransactionConfig,
) -> Result<VersionedTransaction, RpcError> {
let message = v1::Message::try_compile_with_config(
payer,
instructions,
recent_blockhash,
with_defaults(config),
)
.map_err(|e| RpcError::TransactionBuildError(format!("Failed to compile v1 message: {e}")))?;
VersionedTransaction::try_new(VersionedMessage::V1(message), signers)
.map_err(|e| RpcError::SigningError(e.to_string()))
}
pub fn serialized_size(transaction: &VersionedTransaction) -> Result<usize, RpcError> {
bincode::serialized_size(transaction)
.map(|size| size as usize)
.map_err(|e| RpcError::CustomError(format!("Failed to serialize transaction: {e}")))
}