1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use crate::{
    state::{
        enums::GovernanceAccountType,
        governance::{
            assert_is_valid_governance_config, get_account_governance_address_seeds, Governance,
            GovernanceConfig,
        },
    },
    tools::account::create_and_serialize_account_signed,
};
use solana_program::{
    account_info::{next_account_info, AccountInfo},
    entrypoint::ProgramResult,
    pubkey::Pubkey,
    rent::Rent,
    sysvar::Sysvar,
};
pub fn process_create_account_governance(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    config: GovernanceConfig,
) -> ProgramResult {
    let account_info_iter = &mut accounts.iter();
    let realm_info = next_account_info(account_info_iter)?; 
    let account_governance_info = next_account_info(account_info_iter)?; 
    let payer_info = next_account_info(account_info_iter)?; 
    let system_info = next_account_info(account_info_iter)?; 
    let rent_sysvar_info = next_account_info(account_info_iter)?; 
    let rent = &Rent::from_account_info(rent_sysvar_info)?;
    assert_is_valid_governance_config(program_id, &config, realm_info)?;
    let account_governance_data = Governance {
        account_type: GovernanceAccountType::AccountGovernance,
        config: config.clone(),
        proposals_count: 0,
        reserved: 0,
    };
    create_and_serialize_account_signed::<Governance>(
        payer_info,
        account_governance_info,
        &account_governance_data,
        &get_account_governance_address_seeds(&config.realm, &config.governed_account),
        program_id,
        system_info,
        rent,
    )?;
    Ok(())
}