spl_governance/processor/
process_finalize_vote.rs1use {
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
20pub 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)?; let governance_info = next_account_info(account_info_iter)?; let proposal_info = next_account_info(account_info_iter)?; let proposal_owner_record_info = next_account_info(account_info_iter)?; let governing_token_mint_info = next_account_info(account_info_iter)?; 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)?; 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, 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 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}