use light_sdk_types::constants::{
ACCOUNT_COMPRESSION_PROGRAM_ID, CPI_AUTHORITY_PDA_SEED, LIGHT_SYSTEM_PROGRAM_ID,
NOOP_PROGRAM_ID,
};
use crate::{find_cpi_signer_macro, AccountMeta, Pubkey};
#[cfg_attr(not(feature = "cpi-context"), doc = "```ignore")]
#[cfg_attr(feature = "cpi-context", doc = "```rust")]
#[derive(Debug, Default, Copy, Clone)]
#[non_exhaustive]
pub struct SystemAccountMetaConfig {
pub self_program: Option<Pubkey>,
#[cfg(feature = "cpi-context")]
pub cpi_context: Option<Pubkey>,
pub sol_compression_recipient: Option<Pubkey>,
pub sol_pool_pda: Option<Pubkey>,
}
impl SystemAccountMetaConfig {
pub fn new(self_program: Pubkey) -> Self {
Self {
self_program: Some(self_program),
#[cfg(feature = "cpi-context")]
cpi_context: None,
sol_compression_recipient: None,
sol_pool_pda: None,
}
}
#[cfg(feature = "cpi-context")]
pub fn new_with_cpi_context(self_program: Pubkey, cpi_context: Pubkey) -> Self {
Self {
self_program: Some(self_program),
cpi_context: Some(cpi_context),
sol_compression_recipient: None,
sol_pool_pda: None,
}
}
}
#[derive(Debug, Copy, Clone)]
pub struct SystemAccountPubkeys {
pub light_sytem_program: Pubkey,
pub system_program: Pubkey,
pub account_compression_program: Pubkey,
pub account_compression_authority: Pubkey,
pub registered_program_pda: Pubkey,
pub noop_program: Pubkey,
pub sol_pool_pda: Pubkey,
}
impl Default for SystemAccountPubkeys {
fn default() -> Self {
Self {
light_sytem_program: Pubkey::from(LIGHT_SYSTEM_PROGRAM_ID),
system_program: Pubkey::default(),
account_compression_program: Pubkey::from(ACCOUNT_COMPRESSION_PROGRAM_ID),
account_compression_authority: Pubkey::find_program_address(
&[CPI_AUTHORITY_PDA_SEED],
&Pubkey::from(LIGHT_SYSTEM_PROGRAM_ID),
)
.0,
registered_program_pda: Pubkey::find_program_address(
&[LIGHT_SYSTEM_PROGRAM_ID.as_slice()],
&Pubkey::from(ACCOUNT_COMPRESSION_PROGRAM_ID),
)
.0,
noop_program: Pubkey::from(NOOP_PROGRAM_ID),
sol_pool_pda: Pubkey::find_program_address(
&[b"sol_pool_pda"],
&Pubkey::from(LIGHT_SYSTEM_PROGRAM_ID),
)
.0,
}
}
}
pub fn get_light_system_account_metas(config: SystemAccountMetaConfig) -> Vec<AccountMeta> {
let default_pubkeys = SystemAccountPubkeys::default();
let mut vec = if let Some(self_program) = &config.self_program {
let cpi_signer = find_cpi_signer_macro!(self_program).0;
vec![
AccountMeta::new_readonly(default_pubkeys.light_sytem_program, false),
AccountMeta::new_readonly(cpi_signer, false),
AccountMeta::new_readonly(default_pubkeys.registered_program_pda, false),
AccountMeta::new_readonly(default_pubkeys.noop_program, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_authority, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_program, false),
AccountMeta::new_readonly(*self_program, false),
]
} else {
vec![
AccountMeta::new_readonly(default_pubkeys.light_sytem_program, false),
AccountMeta::new_readonly(default_pubkeys.registered_program_pda, false),
AccountMeta::new_readonly(default_pubkeys.noop_program, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_authority, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_program, false),
]
};
if let Some(pubkey) = config.sol_pool_pda {
vec.push(AccountMeta {
pubkey,
is_signer: false,
is_writable: true,
});
}
if let Some(pubkey) = config.sol_compression_recipient {
vec.push(AccountMeta {
pubkey,
is_signer: false,
is_writable: true,
});
}
vec.push(AccountMeta::new_readonly(
default_pubkeys.system_program,
false,
));
#[cfg(feature = "cpi-context")]
if let Some(pubkey) = config.cpi_context {
vec.push(AccountMeta {
pubkey,
is_signer: false,
is_writable: true,
});
}
vec
}
#[cfg(feature = "v2")]
pub fn get_light_system_account_metas_v2(config: SystemAccountMetaConfig) -> Vec<AccountMeta> {
let default_pubkeys = SystemAccountPubkeys::default();
let mut vec = if let Some(self_program) = &config.self_program {
let cpi_signer = find_cpi_signer_macro!(self_program).0;
vec![
AccountMeta::new_readonly(default_pubkeys.light_sytem_program, false),
AccountMeta::new_readonly(cpi_signer, false), AccountMeta::new_readonly(default_pubkeys.registered_program_pda, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_authority, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_program, false),
AccountMeta::new_readonly(default_pubkeys.system_program, false),
]
} else {
vec![
AccountMeta::new_readonly(default_pubkeys.light_sytem_program, false),
AccountMeta::new_readonly(default_pubkeys.registered_program_pda, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_authority, false),
AccountMeta::new_readonly(default_pubkeys.account_compression_program, false),
AccountMeta::new_readonly(default_pubkeys.system_program, false),
]
};
if let Some(pubkey) = config.sol_pool_pda {
vec.push(AccountMeta {
pubkey,
is_signer: false,
is_writable: true,
});
}
if let Some(pubkey) = config.sol_compression_recipient {
vec.push(AccountMeta {
pubkey,
is_signer: false,
is_writable: true,
});
}
#[cfg(feature = "cpi-context")]
if let Some(pubkey) = config.cpi_context {
vec.push(AccountMeta {
pubkey,
is_signer: false,
is_writable: true,
});
}
vec
}