spl_governance/processor/
mod.rs

1//! Program processor
2
3mod process_add_required_signatory;
4mod process_add_signatory;
5mod process_cancel_proposal;
6mod process_cast_vote;
7mod process_complete_proposal;
8mod process_create_governance;
9mod process_create_mint_governance;
10mod process_create_native_treasury;
11mod process_create_program_governance;
12mod process_create_proposal;
13mod process_create_realm;
14mod process_create_token_governance;
15mod process_create_token_owner_record;
16mod process_deposit_governing_tokens;
17mod process_execute_transaction;
18mod process_finalize_vote;
19mod process_flag_transaction_error;
20mod process_insert_transaction;
21mod process_refund_proposal_deposit;
22mod process_relinquish_vote;
23mod process_remove_required_signatory;
24mod process_remove_transaction;
25mod process_revoke_governing_tokens;
26mod process_set_governance_config;
27mod process_set_governance_delegate;
28mod process_set_realm_authority;
29mod process_set_realm_config;
30mod process_sign_off_proposal;
31mod process_update_program_metadata;
32mod process_withdraw_governing_tokens;
33
34use {
35    crate::{error::GovernanceError, instruction::GovernanceInstruction},
36    process_add_required_signatory::*,
37    process_add_signatory::*,
38    process_cancel_proposal::*,
39    process_cast_vote::*,
40    process_complete_proposal::*,
41    process_create_governance::*,
42    process_create_mint_governance::*,
43    process_create_native_treasury::*,
44    process_create_program_governance::*,
45    process_create_proposal::*,
46    process_create_realm::*,
47    process_create_token_governance::*,
48    process_create_token_owner_record::*,
49    process_deposit_governing_tokens::*,
50    process_execute_transaction::*,
51    process_finalize_vote::*,
52    process_flag_transaction_error::*,
53    process_insert_transaction::*,
54    process_refund_proposal_deposit::*,
55    process_relinquish_vote::*,
56    process_remove_required_signatory::*,
57    process_remove_transaction::*,
58    process_revoke_governing_tokens::*,
59    process_set_governance_config::*,
60    process_set_governance_delegate::*,
61    process_set_realm_authority::*,
62    process_set_realm_config::*,
63    process_sign_off_proposal::*,
64    process_update_program_metadata::*,
65    process_withdraw_governing_tokens::*,
66    solana_program::{
67        account_info::AccountInfo, borsh0_10::try_from_slice_unchecked, entrypoint::ProgramResult,
68        msg, program_error::ProgramError, pubkey::Pubkey,
69    },
70};
71
72/// Processes an instruction
73pub fn process_instruction(
74    program_id: &Pubkey,
75    accounts: &[AccountInfo],
76    input: &[u8],
77) -> ProgramResult {
78    msg!("VERSION:{:?}", env!("CARGO_PKG_VERSION"));
79    // Use try_from_slice_unchecked to support forward compatibility of newer UI
80    // with older program
81    let instruction: GovernanceInstruction =
82        try_from_slice_unchecked(input).map_err(|_| ProgramError::InvalidInstructionData)?;
83
84    if let GovernanceInstruction::InsertTransaction {
85        option_index,
86        index,
87        hold_up_time,
88        instructions: _,
89    } = instruction
90    {
91        // Do not dump instruction data into logs
92        msg!(
93            "GOVERNANCE-INSTRUCTION: InsertInstruction {{option_index: {:?}, index: {:?}, hold_up_time: {:?} }}",
94            option_index,
95            index,
96            hold_up_time
97        );
98    } else {
99        msg!("GOVERNANCE-INSTRUCTION: {:?}", instruction);
100    }
101
102    match instruction {
103        GovernanceInstruction::CreateRealm { name, config_args } => {
104            process_create_realm(program_id, accounts, name, config_args)
105        }
106
107        GovernanceInstruction::DepositGoverningTokens { amount } => {
108            process_deposit_governing_tokens(program_id, accounts, amount)
109        }
110
111        GovernanceInstruction::WithdrawGoverningTokens {} => {
112            process_withdraw_governing_tokens(program_id, accounts)
113        }
114
115        GovernanceInstruction::SetGovernanceDelegate {
116            new_governance_delegate,
117        } => process_set_governance_delegate(program_id, accounts, &new_governance_delegate),
118
119        GovernanceInstruction::CreateProgramGovernance {
120            config,
121            transfer_upgrade_authority,
122        } => process_create_program_governance(
123            program_id,
124            accounts,
125            config,
126            transfer_upgrade_authority,
127        ),
128
129        GovernanceInstruction::CreateMintGovernance {
130            config,
131            transfer_mint_authorities,
132        } => {
133            process_create_mint_governance(program_id, accounts, config, transfer_mint_authorities)
134        }
135
136        GovernanceInstruction::CreateTokenGovernance {
137            config,
138            transfer_account_authorities,
139        } => process_create_token_governance(
140            program_id,
141            accounts,
142            config,
143            transfer_account_authorities,
144        ),
145
146        GovernanceInstruction::CreateGovernance { config } => {
147            process_create_governance(program_id, accounts, config)
148        }
149
150        GovernanceInstruction::CreateProposal {
151            name,
152            description_link,
153            vote_type: proposal_type,
154            options,
155            use_deny_option,
156            proposal_seed,
157        } => process_create_proposal(
158            program_id,
159            accounts,
160            name,
161            description_link,
162            proposal_type,
163            options,
164            use_deny_option,
165            proposal_seed,
166        ),
167        GovernanceInstruction::AddSignatory { signatory } => {
168            process_add_signatory(program_id, accounts, signatory)
169        }
170        GovernanceInstruction::Legacy1 => {
171            Err(GovernanceError::InstructionDeprecated.into()) // No-op
172        }
173        GovernanceInstruction::SignOffProposal {} => {
174            process_sign_off_proposal(program_id, accounts)
175        }
176        GovernanceInstruction::CastVote { vote } => process_cast_vote(program_id, accounts, vote),
177
178        GovernanceInstruction::FinalizeVote {} => process_finalize_vote(program_id, accounts),
179
180        GovernanceInstruction::RelinquishVote {} => process_relinquish_vote(program_id, accounts),
181
182        GovernanceInstruction::CancelProposal {} => process_cancel_proposal(program_id, accounts),
183
184        GovernanceInstruction::InsertTransaction {
185            option_index,
186            index,
187            hold_up_time,
188            instructions,
189        } => process_insert_transaction(
190            program_id,
191            accounts,
192            option_index,
193            index,
194            hold_up_time,
195            instructions,
196        ),
197
198        GovernanceInstruction::RemoveTransaction {} => {
199            process_remove_transaction(program_id, accounts)
200        }
201        GovernanceInstruction::ExecuteTransaction {} => {
202            process_execute_transaction(program_id, accounts)
203        }
204
205        GovernanceInstruction::SetGovernanceConfig { config } => {
206            process_set_governance_config(program_id, accounts, config)
207        }
208
209        GovernanceInstruction::FlagTransactionError {} => {
210            process_flag_transaction_error(program_id, accounts)
211        }
212        GovernanceInstruction::SetRealmAuthority { action } => {
213            process_set_realm_authority(program_id, accounts, action)
214        }
215        GovernanceInstruction::SetRealmConfig { config_args } => {
216            process_set_realm_config(program_id, accounts, config_args)
217        }
218        GovernanceInstruction::CreateTokenOwnerRecord {} => {
219            process_create_token_owner_record(program_id, accounts)
220        }
221        GovernanceInstruction::UpdateProgramMetadata {} => {
222            process_update_program_metadata(program_id, accounts)
223        }
224        GovernanceInstruction::CreateNativeTreasury {} => {
225            process_create_native_treasury(program_id, accounts)
226        }
227
228        GovernanceInstruction::RevokeGoverningTokens { amount } => {
229            process_revoke_governing_tokens(program_id, accounts, amount)
230        }
231
232        GovernanceInstruction::RefundProposalDeposit {} => {
233            process_refund_proposal_deposit(program_id, accounts)
234        }
235
236        GovernanceInstruction::CompleteProposal {} => {
237            process_complete_proposal(program_id, accounts)
238        }
239
240        GovernanceInstruction::AddRequiredSignatory { signatory } => {
241            process_add_required_signatory(program_id, accounts, signatory)
242        }
243        GovernanceInstruction::RemoveRequiredSignatory => {
244            process_remove_required_signatory(program_id, accounts)
245        }
246    }
247}