1use base64::Engine;
2use solana_primitives::{
3 Pubkey, TransactionBuilder, get_public_key, instructions::system::transfer,
4};
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("š Solana Primitives - Transaction Signing Example");
8 println!("āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā");
9
10 let private_key_base58 = "3KSeAx7jkVrjJ2PXjhzVMnJfV3zsyT4ADWtpnHxks5eD";
14 let private_key = bs58::decode(private_key_base58).into_vec()?;
15
16 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 let recent_blockhash = [1u8; 32]; println!("\nš Building Transaction:");
26 println!(" - Fee payer: {}", fee_payer.to_base58());
27 println!(" - Recipient: {}", recipient.to_base58());
28
29 let transfer_instruction = transfer(&fee_payer, &recipient, 1_000_000); 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 transaction.validate_size()?;
55 println!("ā
Transaction size validation passed");
56
57 println!("\nš Signing Transaction:");
58
59 let private_keys = [private_key.as_ref()]; 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 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 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 println!("\nš Demonstrating Partial Signing:");
84
85 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 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}