Skip to main content

dlp_api/instruction_builder/
commit_state_from_buffer.rs

1use borsh::to_vec;
2use dlp::{
3    args::CommitStateFromBufferArgs,
4    discriminator::DlpDiscriminator,
5    pda::{
6        commit_record_pda_from_delegated_account,
7        commit_state_pda_from_delegated_account,
8        delegation_metadata_pda_from_delegated_account,
9        delegation_record_pda_from_delegated_account,
10        program_config_from_program_id,
11        validator_fees_vault_pda_from_validator,
12    },
13    total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS,
14};
15use solana_program::{
16    instruction::{AccountMeta, Instruction},
17    pubkey::Pubkey,
18    system_program,
19};
20
21/// Builds a commit state from buffer instruction.
22/// See [dlp::processor::process_commit_state_from_buffer] for docs.
23pub fn commit_state_from_buffer(
24    validator: Pubkey,
25    delegated_account: Pubkey,
26    delegated_account_owner: Pubkey,
27    commit_state_buffer: Pubkey,
28    commit_args: CommitStateFromBufferArgs,
29) -> Instruction {
30    let commit_args = to_vec(&commit_args).unwrap();
31    let delegation_record_pda =
32        delegation_record_pda_from_delegated_account(&delegated_account);
33    let commit_state_pda =
34        commit_state_pda_from_delegated_account(&delegated_account);
35    let commit_record_pda =
36        commit_record_pda_from_delegated_account(&delegated_account);
37    let validator_fees_vault_pda =
38        validator_fees_vault_pda_from_validator(&validator);
39    let delegation_metadata_pda =
40        delegation_metadata_pda_from_delegated_account(&delegated_account);
41    let program_config_pda =
42        program_config_from_program_id(&delegated_account_owner);
43    Instruction {
44        program_id: dlp::id(),
45        accounts: vec![
46            AccountMeta::new(validator, true),
47            AccountMeta::new_readonly(delegated_account, false),
48            AccountMeta::new(commit_state_pda, false),
49            AccountMeta::new(commit_record_pda, false),
50            AccountMeta::new_readonly(delegation_record_pda, false),
51            AccountMeta::new(delegation_metadata_pda, false),
52            AccountMeta::new_readonly(commit_state_buffer, false),
53            AccountMeta::new_readonly(validator_fees_vault_pda, false),
54            AccountMeta::new_readonly(program_config_pda, false),
55            AccountMeta::new_readonly(system_program::id(), false),
56        ],
57        data: [
58            DlpDiscriminator::CommitStateFromBuffer.to_vec(),
59            commit_args,
60        ]
61        .concat(),
62    }
63}
64
65///
66/// Returns accounts-data-size budget for commit_state_from_buffer instruction.
67///
68/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
69///
70pub fn commit_state_from_buffer_size_budget(
71    delegated_account: AccountSizeClass,
72) -> u32 {
73    total_size_budget(&[
74        DLP_PROGRAM_DATA_SIZE_CLASS,
75        AccountSizeClass::Tiny, // validator
76        delegated_account,      // delegated_account
77        delegated_account,      // commit_state_pda
78        AccountSizeClass::Tiny, // commit_record_pda
79        AccountSizeClass::Tiny, // delegation_record_pda
80        AccountSizeClass::Tiny, // delegation_metadata_pda
81        delegated_account,      // commit_state_buffer
82        AccountSizeClass::Tiny, // validator_fees_vault_pda
83        AccountSizeClass::Tiny, // program_config_pda
84        AccountSizeClass::Tiny, // system_program
85    ])
86}