Skip to main content

dlp_api/instruction_builder/
finalize.rs

1use dlp::{
2    discriminator::DlpDiscriminator,
3    pda::{
4        commit_record_pda_from_delegated_account,
5        commit_state_pda_from_delegated_account,
6        delegation_metadata_pda_from_delegated_account,
7        delegation_record_pda_from_delegated_account,
8        validator_fees_vault_pda_from_validator,
9    },
10    total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS,
11};
12use solana_program::{
13    instruction::{AccountMeta, Instruction},
14    pubkey::Pubkey,
15    system_program,
16};
17
18/// Builds a finalize state instruction.
19/// See [dlp::processor::process_finalize] for docs.
20pub fn finalize(validator: Pubkey, delegated_account: Pubkey) -> Instruction {
21    let commit_state_pda =
22        commit_state_pda_from_delegated_account(&delegated_account);
23    let commit_record_pda =
24        commit_record_pda_from_delegated_account(&delegated_account);
25    let delegation_record_pda =
26        delegation_record_pda_from_delegated_account(&delegated_account);
27    let delegation_metadata_pda =
28        delegation_metadata_pda_from_delegated_account(&delegated_account);
29    let validator_fees_vault_pda =
30        validator_fees_vault_pda_from_validator(&validator);
31    Instruction {
32        program_id: dlp::id(),
33        accounts: vec![
34            AccountMeta::new(validator, true),
35            AccountMeta::new(delegated_account, false),
36            AccountMeta::new(commit_state_pda, false),
37            AccountMeta::new(commit_record_pda, false),
38            AccountMeta::new(delegation_record_pda, false),
39            AccountMeta::new(delegation_metadata_pda, false),
40            AccountMeta::new(validator_fees_vault_pda, false),
41            AccountMeta::new_readonly(system_program::id(), false),
42        ],
43        data: DlpDiscriminator::Finalize.to_vec(),
44    }
45}
46
47///
48/// Returns accounts-data-size budget for finalize instruction.
49///
50/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
51///
52pub fn finalize_size_budget(delegated_account: AccountSizeClass) -> u32 {
53    total_size_budget(&[
54        DLP_PROGRAM_DATA_SIZE_CLASS,
55        AccountSizeClass::Tiny, // validator
56        delegated_account,      // delegated_account
57        delegated_account,      // commit_state_pda
58        AccountSizeClass::Tiny, // commit_record_pda
59        AccountSizeClass::Tiny, // delegation_record_pda
60        AccountSizeClass::Tiny, // delegation_metadata_pda
61        AccountSizeClass::Tiny, // validator_fees_vault_pda
62        AccountSizeClass::Tiny, // system_program
63    ])
64}