dlp_api/instruction_builder/
call_handler_v2.rs1use borsh::to_vec;
2use dlp::{
3 args::CallHandlerArgs,
4 discriminator::DlpDiscriminator,
5 pda::{
6 ephemeral_balance_pda_from_payer,
7 validator_fees_vault_pda_from_validator,
8 },
9 total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS,
10};
11use solana_program::{
12 instruction::{AccountMeta, Instruction},
13 pubkey::Pubkey,
14};
15
16pub fn call_handler_v2(
19 validator: Pubkey,
20 destination_program: Pubkey,
21 source_program: Pubkey,
22 escrow_authority: Pubkey,
23 other_accounts: Vec<AccountMeta>,
24 args: CallHandlerArgs,
25) -> Instruction {
26 let validator_fees_vault_pda =
27 validator_fees_vault_pda_from_validator(&validator);
28
29 let escrow_account =
31 ephemeral_balance_pda_from_payer(&escrow_authority, args.escrow_index);
32 let mut accounts = vec![
33 AccountMeta::new(validator, true),
34 AccountMeta::new(validator_fees_vault_pda, false),
35 AccountMeta::new_readonly(destination_program, false),
36 AccountMeta::new_readonly(source_program, false),
37 AccountMeta::new(escrow_authority, false),
38 AccountMeta::new(escrow_account, false),
39 ];
40 accounts.extend(other_accounts);
42
43 Instruction {
44 program_id: dlp::id(),
45 accounts,
46 data: [
47 DlpDiscriminator::CallHandlerV2.to_vec(),
48 to_vec(&args).unwrap(),
49 ]
50 .concat(),
51 }
52}
53
54pub fn call_handler_v2_size_budget(
60 destination_program: AccountSizeClass,
61 source_program: AccountSizeClass,
62 other_accounts: u32,
63) -> u32 {
64 total_size_budget(&[
65 DLP_PROGRAM_DATA_SIZE_CLASS,
66 AccountSizeClass::Tiny, AccountSizeClass::Tiny, destination_program,
69 source_program,
70 AccountSizeClass::Tiny, AccountSizeClass::Tiny, ]) + other_accounts
73}