Skip to main content

dlp_api/instruction_builder/
commit_finalize.rs

1use dlp::{
2    args::{CommitBumps, CommitFinalizeArgs},
3    delegation_metadata_seeds_from_delegated_account,
4    delegation_record_seeds_from_delegated_account,
5    discriminator::DlpDiscriminator,
6    pod_view::PodView,
7    total_size_budget, validator_fees_vault_seeds_from_validator,
8    AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS,
9};
10use solana_program::{
11    instruction::{AccountMeta, Instruction},
12    pubkey::Pubkey,
13    system_program,
14};
15
16pub struct CommitPDAs {
17    pub delegation_record: Pubkey,
18    pub delegation_metadata: Pubkey,
19    pub validator_fees_vault: Pubkey,
20}
21
22/// Builds a commit finalize instruction.
23/// See [dlp::processor::process_commit_finalize] for docs.
24pub fn commit_finalize(
25    validator: Pubkey,
26    delegated_account: Pubkey,
27    args: &mut CommitFinalizeArgs,
28    state_or_diff: &[u8],
29) -> (Instruction, CommitPDAs) {
30    let delegation_record = Pubkey::find_program_address(
31        delegation_record_seeds_from_delegated_account!(delegated_account),
32        &dlp::id(),
33    );
34
35    let delegation_metadata = Pubkey::find_program_address(
36        delegation_metadata_seeds_from_delegated_account!(delegated_account),
37        &dlp::id(),
38    );
39
40    let validator_fees_vault = Pubkey::find_program_address(
41        validator_fees_vault_seeds_from_validator!(validator),
42        &dlp::id(),
43    );
44
45    // save the bumps in the args
46    args.bumps = CommitBumps {
47        delegation_record: delegation_record.1,
48        delegation_metadata: delegation_metadata.1,
49        validator_fees_vault: validator_fees_vault.1,
50    };
51
52    (
53        Instruction {
54            program_id: dlp::id(),
55            accounts: vec![
56                AccountMeta::new(validator, true),
57                AccountMeta::new(delegated_account, false),
58                AccountMeta::new(delegation_record.0, false),
59                AccountMeta::new(delegation_metadata.0, false),
60                AccountMeta::new(validator_fees_vault.0, false),
61                AccountMeta::new_readonly(system_program::id(), false),
62            ],
63            data: [
64                DlpDiscriminator::CommitFinalize.to_vec(),
65                args.to_bytes(),
66                state_or_diff.to_vec(),
67            ]
68            .concat(),
69        },
70        CommitPDAs {
71            delegation_record: delegation_record.0,
72            delegation_metadata: delegation_metadata.0,
73            validator_fees_vault: validator_fees_vault.0,
74        },
75    )
76}
77
78///
79/// Returns accounts-data-size budget for commit_finalize instruction.
80///
81/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
82///
83pub fn commit_finalize_size_budget(delegated_account: AccountSizeClass) -> u32 {
84    total_size_budget(&[
85        DLP_PROGRAM_DATA_SIZE_CLASS,
86        AccountSizeClass::Tiny, // validator
87        delegated_account,      // delegated_account
88        AccountSizeClass::Tiny, // delegation_record_pda
89        AccountSizeClass::Tiny, // delegation_metadata_pda
90        AccountSizeClass::Tiny, // validator_fees_vault_pda
91        AccountSizeClass::Tiny, // system_program
92    ])
93}