Skip to main content

dlp_api/instruction_builder/
commit_finalize_from_buffer.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
16/// Builds a commit state from buffer instruction.
17/// See [dlp::processor::process_commit_diff_from_buffer] for docs.
18pub fn commit_finalize_from_buffer(
19    validator: Pubkey,
20    delegated_account: Pubkey,
21    data_buffer: Pubkey,
22    commit_args: &mut CommitFinalizeArgs,
23) -> (Instruction, super::CommitPDAs) {
24    let delegation_record = Pubkey::find_program_address(
25        delegation_record_seeds_from_delegated_account!(delegated_account),
26        &dlp::id(),
27    );
28
29    let validator_fees_vault = Pubkey::find_program_address(
30        validator_fees_vault_seeds_from_validator!(validator),
31        &dlp::id(),
32    );
33
34    let delegation_metadata = Pubkey::find_program_address(
35        delegation_metadata_seeds_from_delegated_account!(delegated_account),
36        &dlp::id(),
37    );
38
39    // save the bumps in the args
40    commit_args.bumps = CommitBumps {
41        delegation_record: delegation_record.1,
42        delegation_metadata: delegation_metadata.1,
43        validator_fees_vault: validator_fees_vault.1,
44    };
45
46    (
47        Instruction {
48            program_id: dlp::id(),
49            accounts: vec![
50                AccountMeta::new(validator, true),
51                AccountMeta::new(delegated_account, false),
52                AccountMeta::new(delegation_record.0, false),
53                AccountMeta::new(delegation_metadata.0, false),
54                AccountMeta::new_readonly(data_buffer, false),
55                AccountMeta::new(validator_fees_vault.0, false),
56                AccountMeta::new_readonly(system_program::id(), false),
57            ],
58            data: [
59                DlpDiscriminator::CommitFinalizeFromBuffer.to_vec(),
60                commit_args.to_bytes(),
61            ]
62            .concat(),
63        },
64        super::CommitPDAs {
65            delegation_record: delegation_record.0,
66            delegation_metadata: delegation_metadata.0,
67            validator_fees_vault: validator_fees_vault.0,
68        },
69    )
70}
71
72///
73/// Returns accounts-data-size budget for commit_diff_from_buffer instruction.
74///
75/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
76///
77pub fn commit_finalize_from_buffer_size_budget(
78    delegated_account: AccountSizeClass,
79) -> u32 {
80    total_size_budget(&[
81        DLP_PROGRAM_DATA_SIZE_CLASS,
82        AccountSizeClass::Tiny, // validator
83        delegated_account,      // delegated_account
84        AccountSizeClass::Tiny, // delegation_record_pda
85        AccountSizeClass::Tiny, // delegation_metadata_pda
86        delegated_account,      // data_buffer
87        AccountSizeClass::Tiny, // validator_fees_vault_pda
88        AccountSizeClass::Tiny, // program_config_pda
89        AccountSizeClass::Tiny, // system_program
90    ])
91}