gpl_governance/processor/
mod.rs

1//! Program processor
2
3mod process_add_signatory;
4mod process_cancel_proposal;
5mod process_cast_vote;
6mod process_create_account_governance;
7mod process_create_mint_governance;
8mod process_create_program_governance;
9mod process_create_proposal;
10mod process_create_realm;
11mod process_create_token_governance;
12mod process_create_token_owner_record;
13mod process_deposit_governing_tokens;
14mod process_execute_instruction;
15mod process_finalize_vote;
16mod process_flag_instruction_error;
17mod process_insert_instruction;
18mod process_relinquish_vote;
19mod process_remove_instruction;
20mod process_remove_signatory;
21mod process_set_governance_config;
22mod process_set_governance_delegate;
23mod process_set_realm_authority;
24mod process_set_realm_config;
25mod process_sign_off_proposal;
26mod process_withdraw_governing_tokens;
27
28use crate::instruction::GovernanceInstruction;
29
30use process_add_signatory::*;
31use process_cancel_proposal::*;
32use process_cast_vote::*;
33use process_create_account_governance::*;
34use process_create_mint_governance::*;
35use process_create_program_governance::*;
36use process_create_proposal::*;
37use process_create_realm::*;
38use process_create_token_governance::*;
39use process_create_token_owner_record::*;
40use process_deposit_governing_tokens::*;
41use process_execute_instruction::*;
42use process_finalize_vote::*;
43use process_flag_instruction_error::*;
44use process_insert_instruction::*;
45use process_relinquish_vote::*;
46use process_remove_instruction::*;
47use process_remove_signatory::*;
48use process_set_governance_config::*;
49use process_set_governance_delegate::*;
50use process_set_realm_authority::*;
51use process_set_realm_config::*;
52use process_sign_off_proposal::*;
53use process_withdraw_governing_tokens::*;
54
55use gemachain_program::{
56    account_info::AccountInfo, borsh::try_from_slice_unchecked, entrypoint::ProgramResult, msg,
57    program_error::ProgramError, pubkey::Pubkey,
58};
59
60/// Processes an instruction
61pub fn process_instruction(
62    program_id: &Pubkey,
63    accounts: &[AccountInfo],
64    input: &[u8],
65) -> ProgramResult {
66    // Use try_from_slice_unchecked to support forward compatibility of newer UI with older program
67    let instruction: GovernanceInstruction =
68        try_from_slice_unchecked(input).map_err(|_| ProgramError::InvalidInstructionData)?;
69
70    if let GovernanceInstruction::InsertInstruction {
71        index,
72        hold_up_time,
73        instruction: _,
74    } = instruction
75    {
76        // Do not dump instruction data into logs
77        msg!(
78            "GOVERNANCE-INSTRUCTION: InsertInstruction {{ index: {:?}, hold_up_time: {:?} }}",
79            index,
80            hold_up_time
81        );
82    } else {
83        msg!("GOVERNANCE-INSTRUCTION: {:?}", instruction);
84    }
85
86    match instruction {
87        GovernanceInstruction::CreateRealm { name, config_args } => {
88            process_create_realm(program_id, accounts, name, config_args)
89        }
90
91        GovernanceInstruction::DepositGoverningTokens { amount } => {
92            process_deposit_governing_tokens(program_id, accounts, amount)
93        }
94
95        GovernanceInstruction::WithdrawGoverningTokens {} => {
96            process_withdraw_governing_tokens(program_id, accounts)
97        }
98
99        GovernanceInstruction::SetGovernanceDelegate {
100            new_governance_delegate,
101        } => process_set_governance_delegate(program_id, accounts, &new_governance_delegate),
102
103        GovernanceInstruction::CreateProgramGovernance {
104            config,
105            transfer_upgrade_authority,
106        } => process_create_program_governance(
107            program_id,
108            accounts,
109            config,
110            transfer_upgrade_authority,
111        ),
112
113        GovernanceInstruction::CreateMintGovernance {
114            config,
115            transfer_mint_authority,
116        } => process_create_mint_governance(program_id, accounts, config, transfer_mint_authority),
117
118        GovernanceInstruction::CreateTokenGovernance {
119            config,
120            transfer_token_owner,
121        } => process_create_token_governance(program_id, accounts, config, transfer_token_owner),
122
123        GovernanceInstruction::CreateAccountGovernance { config } => {
124            process_create_account_governance(program_id, accounts, config)
125        }
126
127        GovernanceInstruction::CreateProposal {
128            name,
129            description_link,
130            governing_token_mint,
131        } => process_create_proposal(
132            program_id,
133            accounts,
134            name,
135            description_link,
136            governing_token_mint,
137        ),
138        GovernanceInstruction::AddSignatory { signatory } => {
139            process_add_signatory(program_id, accounts, signatory)
140        }
141        GovernanceInstruction::RemoveSignatory { signatory } => {
142            process_remove_signatory(program_id, accounts, signatory)
143        }
144        GovernanceInstruction::SignOffProposal {} => {
145            process_sign_off_proposal(program_id, accounts)
146        }
147        GovernanceInstruction::CastVote { vote } => process_cast_vote(program_id, accounts, vote),
148
149        GovernanceInstruction::FinalizeVote {} => process_finalize_vote(program_id, accounts),
150
151        GovernanceInstruction::RelinquishVote {} => process_relinquish_vote(program_id, accounts),
152
153        GovernanceInstruction::CancelProposal {} => process_cancel_proposal(program_id, accounts),
154
155        GovernanceInstruction::InsertInstruction {
156            index,
157            hold_up_time,
158            instruction,
159        } => process_insert_instruction(program_id, accounts, index, hold_up_time, instruction),
160
161        GovernanceInstruction::RemoveInstruction {} => {
162            process_remove_instruction(program_id, accounts)
163        }
164        GovernanceInstruction::ExecuteInstruction {} => {
165            process_execute_instruction(program_id, accounts)
166        }
167
168        GovernanceInstruction::SetGovernanceConfig { config } => {
169            process_set_governance_config(program_id, accounts, config)
170        }
171
172        GovernanceInstruction::FlagInstructionError {} => {
173            process_flag_instruction_error(program_id, accounts)
174        }
175        GovernanceInstruction::SetRealmAuthority {
176            new_realm_authority,
177        } => process_set_realm_authority(program_id, accounts, new_realm_authority),
178        GovernanceInstruction::SetRealmConfig { config_args } => {
179            process_set_realm_config(program_id, accounts, config_args)
180        }
181        GovernanceInstruction::CreateTokenOwnerRecord {} => {
182            process_create_token_owner_record(program_id, accounts)
183        }
184    }
185}