pub struct TransactionBuilder { /* private fields */ }Expand description
A builder for constructing Solana transactions
Implementationsยง
Sourceยงimpl TransactionBuilder
impl TransactionBuilder
Sourcepub fn new(fee_payer: Pubkey, recent_blockhash: [u8; 32]) -> Self
pub fn new(fee_payer: Pubkey, recent_blockhash: [u8; 32]) -> Self
Create a new transaction builder
Examples found in repository?
examples/basic.rs (line 33)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("๐ Solana Primitives - Transaction Signing Example");
8 println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
9
10 // Generate a test private key from base58 string
11 // โ ๏ธ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n๐ Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("โ
Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("โ
Transaction size validation passed");
56
57 println!("\n๐ Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("โ
Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n๐ฆ Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n๐ Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("โ
Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n๐ฏ Summary:");
106 println!(" โ Transaction built using InstructionBuilder");
107 println!(" โ Transaction validated for size limits");
108 println!(" โ Transaction signed with private key");
109 println!(" โ Partial signing demonstrated");
110 println!(" โ Transaction serialized for network submission");
111
112 println!("\n๐ก Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Sourcepub fn add_instruction(&mut self, instruction: Instruction) -> &mut Self
pub fn add_instruction(&mut self, instruction: Instruction) -> &mut Self
Add an instruction to the transaction
Examples found in repository?
examples/basic.rs (line 34)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("๐ Solana Primitives - Transaction Signing Example");
8 println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
9
10 // Generate a test private key from base58 string
11 // โ ๏ธ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n๐ Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("โ
Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("โ
Transaction size validation passed");
56
57 println!("\n๐ Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("โ
Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n๐ฆ Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n๐ Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("โ
Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n๐ฏ Summary:");
106 println!(" โ Transaction built using InstructionBuilder");
107 println!(" โ Transaction validated for size limits");
108 println!(" โ Transaction signed with private key");
109 println!(" โ Partial signing demonstrated");
110 println!(" โ Transaction serialized for network submission");
111
112 println!("\n๐ก Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Sourcepub fn add_instructions<I>(&mut self, instructions: I) -> &mut Selfwhere
I: IntoIterator<Item = Instruction>,
pub fn add_instructions<I>(&mut self, instructions: I) -> &mut Selfwhere
I: IntoIterator<Item = Instruction>,
Add multiple instructions to the transaction.
Sourcepub fn build(self) -> Result<Transaction>
pub fn build(self) -> Result<Transaction>
Build the transaction
Examples found in repository?
examples/basic.rs (line 36)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("๐ Solana Primitives - Transaction Signing Example");
8 println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
9
10 // Generate a test private key from base58 string
11 // โ ๏ธ WARNING: This is for demonstration only!
12 // In production, use proper key generation and secure storage
13 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 // Generate corresponding public key
17 let fee_payer_pubkey_bytes = get_public_key(&private_key)?;
18 let fee_payer = Pubkey::new(fee_payer_pubkey_bytes);
19
20 let recipient = Pubkey::from_base58("4fYNw3dojWmQ4dXtSGE9epjRGy9uFrCRgbvGgQBNZCQF")?;
21
22 // Use a dummy blockhash for this example (in production, get from RPC)
23 let recent_blockhash = [1u8; 32]; // Use non-zero for visual distinction
24
25 println!("\n๐ Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 // Create a simple SOL transfer instruction
30 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); // 0.001 SOL
31
32 // Build transaction
33 let mut tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
34 tx_builder.add_instruction(transfer_instruction);
35
36 let mut transaction = tx_builder.build()?;
37
38 println!("โ
Unsigned transaction created:");
39 println!(
40 " - Instructions: {}",
41 transaction.message.instructions.len()
42 );
43 println!(
44 " - Account keys: {}",
45 transaction.message.account_keys.len()
46 );
47 println!(
48 " - Required signatures: {}",
49 transaction.message.header.num_required_signatures
50 );
51 println!(" - Is signed: {}", transaction.is_signed());
52
53 // Validate transaction size
54 transaction.validate_size()?;
55 println!("โ
Transaction size validation passed");
56
57 println!("\n๐ Signing Transaction:");
58
59 // Method 1: Sign the entire transaction at once
60 let private_keys = [private_key.as_ref()]; // References to private keys
61 transaction.sign(&private_keys)?;
62
63 println!("โ
Transaction signed successfully!");
64 println!(" - Is signed: {}", transaction.is_signed());
65 println!(" - Signature count: {}", transaction.signatures.len());
66
67 // Display the signature (first 16 bytes for brevity)
68 if let Some(first_signature) = transaction.signatures.first() {
69 let sig_bytes = first_signature.as_bytes();
70 println!(" - First signature: {}...", hex::encode(&sig_bytes[..16]));
71 }
72
73 println!("\n๐ฆ Final Transaction:");
74 // Serialize the complete signed transaction
75 let transaction_bytes = borsh::to_vec(&transaction)?;
76 println!(" - Serialized size: {} bytes", transaction_bytes.len());
77 println!(
78 " - Base64 encoded: {}",
79 base64::prelude::BASE64_STANDARD.encode(&transaction_bytes)
80 );
81
82 // Demonstrate partial signing (useful for multi-sig scenarios)
83 println!("\n๐ Demonstrating Partial Signing:");
84
85 // Create a new transaction builder for partial signing demo
86 let mut partial_tx_builder = TransactionBuilder::new(fee_payer, recent_blockhash);
87 partial_tx_builder.add_instruction(transfer(&fee_payer, &recipient, 1_000_000));
88 let mut partial_tx = partial_tx_builder.build()?;
89 println!(
90 " - Before partial sign - Is signed: {}",
91 partial_tx.is_signed()
92 );
93
94 // Partial sign with specific keys and their corresponding public keys
95 let private_keys_for_partial = [private_key.as_ref()];
96 let public_keys_for_partial = [fee_payer];
97 partial_tx.partial_sign(&private_keys_for_partial, &public_keys_for_partial)?;
98
99 println!("โ
Partial signing completed!");
100 println!(
101 " - After partial sign - Is signed: {}",
102 partial_tx.is_signed()
103 );
104
105 println!("\n๐ฏ Summary:");
106 println!(" โ Transaction built using InstructionBuilder");
107 println!(" โ Transaction validated for size limits");
108 println!(" โ Transaction signed with private key");
109 println!(" โ Partial signing demonstrated");
110 println!(" โ Transaction serialized for network submission");
111
112 println!("\n๐ก Next Steps:");
113 println!(" - Submit transaction_bytes to Solana RPC endpoint");
114 println!(" - Monitor transaction status on-chain");
115 println!(" - Handle success/failure responses");
116
117 Ok(())
118}Sourcepub fn build_v0(
self,
address_lookup_tables: &[AddressLookupTableAccount],
) -> Result<VersionedTransaction>
pub fn build_v0( self, address_lookup_tables: &[AddressLookupTableAccount], ) -> Result<VersionedTransaction>
Build a V0 versioned transaction.
Sourcepub fn build_v0_transaction(
fee_payer: Pubkey,
recent_blockhash: [u8; 32],
instructions: &[Instruction],
address_lookup_tables: &[AddressLookupTableAccount],
) -> Result<VersionedTransaction>
pub fn build_v0_transaction( fee_payer: Pubkey, recent_blockhash: [u8; 32], instructions: &[Instruction], address_lookup_tables: &[AddressLookupTableAccount], ) -> Result<VersionedTransaction>
One-shot helper for compiling a V0 transaction.
Trait Implementationsยง
Auto Trait Implementationsยง
impl Freeze for TransactionBuilder
impl RefUnwindSafe for TransactionBuilder
impl Send for TransactionBuilder
impl Sync for TransactionBuilder
impl Unpin for TransactionBuilder
impl UnsafeUnpin for TransactionBuilder
impl UnwindSafe for TransactionBuilder
Blanket Implementationsยง
Sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more