spl_governance/processor/
process_finalize_vote.rs

1//! Program state processor
2
3use {
4    crate::state::{
5        governance::get_governance_data_for_realm,
6        proposal::get_proposal_data_for_governance_and_governing_mint,
7        realm::get_realm_data_for_governing_token_mint,
8        realm_config::get_realm_config_data_for_realm,
9        token_owner_record::get_token_owner_record_data_for_proposal_owner, vote_record::VoteKind,
10    },
11    solana_program::{
12        account_info::{next_account_info, AccountInfo},
13        clock::Clock,
14        entrypoint::ProgramResult,
15        pubkey::Pubkey,
16        sysvar::Sysvar,
17    },
18};
19
20/// Processes FinalizeVote instruction
21pub fn process_finalize_vote(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
22    let account_info_iter = &mut accounts.iter();
23
24    let realm_info = next_account_info(account_info_iter)?; // 0
25    let governance_info = next_account_info(account_info_iter)?; // 1
26    let proposal_info = next_account_info(account_info_iter)?; // 2
27    let proposal_owner_record_info = next_account_info(account_info_iter)?; // 3
28
29    let governing_token_mint_info = next_account_info(account_info_iter)?; // 4
30
31    let clock = Clock::get()?;
32
33    let realm_data = get_realm_data_for_governing_token_mint(
34        program_id,
35        realm_info,
36        governing_token_mint_info.key,
37    )?;
38    let mut governance_data =
39        get_governance_data_for_realm(program_id, governance_info, realm_info.key)?;
40
41    let mut proposal_data = get_proposal_data_for_governance_and_governing_mint(
42        program_id,
43        proposal_info,
44        governance_info.key,
45        governing_token_mint_info.key,
46    )?;
47
48    let realm_config_info = next_account_info(account_info_iter)?; //5
49    let realm_config_data =
50        get_realm_config_data_for_realm(program_id, realm_config_info, realm_info.key)?;
51
52    let max_voter_weight = proposal_data.resolve_max_voter_weight(
53        account_info_iter, // *6
54        realm_info.key,
55        &realm_data,
56        &realm_config_data,
57        governing_token_mint_info,
58        &VoteKind::Electorate,
59    )?;
60
61    let vote_threshold = governance_data.resolve_vote_threshold(
62        &realm_data,
63        governing_token_mint_info.key,
64        &VoteKind::Electorate,
65    )?;
66
67    proposal_data.finalize_vote(
68        max_voter_weight,
69        &governance_data.config,
70        clock.unix_timestamp,
71        &vote_threshold,
72    )?;
73
74    let mut proposal_owner_record_data = get_token_owner_record_data_for_proposal_owner(
75        program_id,
76        proposal_owner_record_info,
77        &proposal_data.token_owner_record,
78    )?;
79
80    proposal_owner_record_data.decrease_outstanding_proposal_count();
81    proposal_owner_record_data.serialize(&mut proposal_owner_record_info.data.borrow_mut()[..])?;
82
83    proposal_data.serialize(&mut proposal_info.data.borrow_mut()[..])?;
84
85    // Update  Governance active_proposal_count
86    governance_data.active_proposal_count = governance_data.active_proposal_count.saturating_sub(1);
87    governance_data.serialize(&mut governance_info.data.borrow_mut()[..])?;
88
89    Ok(())
90}