Skip to main content

dlp_api/instruction_builder/
call_handler_v2.rs

1use 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
16/// Builds a call handler v2 instruction.
17/// See [dlp::processor::call_handler_v2] for docs.
18pub 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    // handler accounts
30    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    // append other accounts at the end
41    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
54///
55/// Returns accounts-data-size budget for call_handler_v2 instruction.
56///
57/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
58///
59pub 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, // validator
67        AccountSizeClass::Tiny, // validator_fees_vault_pda
68        destination_program,
69        source_program,
70        AccountSizeClass::Tiny, // escrow_authority
71        AccountSizeClass::Tiny, // escrow_account
72    ]) + other_accounts
73}