#![allow(clippy::too_many_arguments)]
#![allow(unexpected_cfgs)]
pub mod errors;
pub mod instructions;
pub use instructions::*;
pub mod state;
pub use state::*;
pub mod context;
pub mod processor;
pub mod utils;
use anchor_lang::prelude::*;
use errors::AccountCompressionErrorCode;
use light_batched_merkle_tree::{
initialize_address_tree::InitAddressTreeAccountsInstructionData,
initialize_state_tree::InitStateTreeAccountsInstructionData,
merkle_tree::{InstructionDataBatchAppendInputs, InstructionDataBatchNullifyInputs},
};
declare_id!("compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq");
#[cfg(not(feature = "no-entrypoint"))]
solana_security_txt::security_txt! {
name: "account-compression",
project_url: "lightprotocol.com",
contacts: "email:security@lightprotocol.com",
policy: "https://github.com/Lightprotocol/light-protocol/blob/main/SECURITY.md",
source_code: "https://github.com/Lightprotocol/light-protocol"
}
#[program]
pub mod account_compression {
use super::*;
use crate::processor::insert_into_queues::process_insert_into_queues;
pub fn initialize_address_merkle_tree_and_queue<'info>(
ctx: Context<'_, '_, '_, 'info, InitializeAddressMerkleTreeAndQueue<'info>>,
index: u64,
program_owner: Option<Pubkey>,
forester: Option<Pubkey>,
address_merkle_tree_config: AddressMerkleTreeConfig,
address_queue_config: AddressQueueConfig,
) -> Result<()> {
process_initialize_address_merkle_tree_and_queue(
ctx,
index,
program_owner,
forester,
address_merkle_tree_config,
address_queue_config,
)
}
pub fn update_address_merkle_tree<'info>(
ctx: Context<'_, '_, '_, 'info, UpdateAddressMerkleTree<'info>>,
changelog_index: u16,
indexed_changelog_index: u16,
value: u16,
low_address_index: u64,
low_address_value: [u8; 32],
low_address_next_index: u64,
low_address_next_value: [u8; 32],
low_address_proof: [[u8; 32]; 16],
) -> Result<()> {
process_update_address_merkle_tree(
ctx,
changelog_index,
indexed_changelog_index,
value,
low_address_value,
low_address_next_index,
low_address_next_value,
low_address_index,
low_address_proof,
)
}
pub fn rollover_address_merkle_tree_and_queue<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, RolloverAddressMerkleTreeAndQueue<'info>>,
) -> Result<()> {
process_rollover_address_merkle_tree_and_queue(ctx)
}
pub fn initialize_group_authority<'info>(
ctx: Context<'_, '_, '_, 'info, InitializeGroupAuthority<'info>>,
authority: Pubkey,
) -> Result<()> {
let seed_pubkey = ctx.accounts.seed.key();
set_group_authority(
&mut ctx.accounts.group_authority,
authority,
Some(seed_pubkey),
)?;
Ok(())
}
pub fn update_group_authority<'info>(
ctx: Context<'_, '_, '_, 'info, UpdateGroupAuthority<'info>>,
authority: Pubkey,
) -> Result<()> {
set_group_authority(&mut ctx.accounts.group_authority, authority, None)
}
pub fn register_program_to_group<'info>(
ctx: Context<'_, '_, '_, 'info, RegisterProgramToGroup<'info>>,
) -> Result<()> {
process_register_program(ctx)
}
pub fn deregister_program(_ctx: Context<DeregisterProgram>) -> Result<()> {
Ok(())
}
pub fn resize_registered_program_pda<'info>(
ctx: Context<'_, '_, '_, 'info, ResizeRegisteredProgramPda<'info>>,
) -> Result<()> {
process_resize_registered_program_pda(ctx)
}
pub fn initialize_state_merkle_tree_and_nullifier_queue<'info>(
ctx: Context<'_, '_, '_, 'info, InitializeStateMerkleTreeAndNullifierQueue<'info>>,
index: u64,
program_owner: Option<Pubkey>,
forester: Option<Pubkey>,
state_merkle_tree_config: StateMerkleTreeConfig,
nullifier_queue_config: NullifierQueueConfig,
additional_bytes: u64,
) -> Result<()> {
if additional_bytes != 0 {
msg!("additional_bytes is not supported yet");
return err!(AccountCompressionErrorCode::UnsupportedAdditionalBytes);
}
process_initialize_state_merkle_tree_and_nullifier_queue(
ctx,
index,
program_owner,
forester,
state_merkle_tree_config,
nullifier_queue_config,
additional_bytes,
)
}
pub fn insert_into_queues<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, GenericInstruction<'info>>,
bytes: Vec<u8>,
) -> Result<()> {
process_insert_into_queues(&ctx, bytes)
}
pub fn nullify_leaves<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, NullifyLeaves<'info>>,
change_log_indices: Vec<u64>,
leaves_queue_indices: Vec<u16>,
leaf_indices: Vec<u64>,
proofs: Vec<Vec<[u8; 32]>>,
) -> Result<()> {
process_nullify_leaves(
&ctx,
&change_log_indices,
&leaves_queue_indices,
&leaf_indices,
&proofs,
)
}
pub fn rollover_state_merkle_tree_and_nullifier_queue<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, RolloverStateMerkleTreeAndNullifierQueue<'info>>,
) -> Result<()> {
process_rollover_state_merkle_tree_nullifier_queue_pair(ctx)
}
pub fn initialize_batched_state_merkle_tree<'info>(
ctx: Context<'_, '_, '_, 'info, InitializeBatchedStateMerkleTreeAndQueue<'info>>,
bytes: Vec<u8>,
) -> Result<()> {
let params = InitStateTreeAccountsInstructionData::try_from_slice(&bytes)
.map_err(|_| AccountCompressionErrorCode::InputDeserializationFailed)?;
process_initialize_batched_state_merkle_tree(ctx, params)
}
pub fn initialize_batched_address_merkle_tree<'info>(
ctx: Context<'_, '_, '_, 'info, InitializeBatchedAddressMerkleTree<'info>>,
bytes: Vec<u8>,
) -> Result<()> {
let params = InitAddressTreeAccountsInstructionData::try_from_slice(&bytes)
.map_err(|_| AccountCompressionErrorCode::InputDeserializationFailed)?;
process_initialize_batched_address_merkle_tree(ctx, params)
}
pub fn batch_nullify<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, BatchNullify<'info>>,
data: Vec<u8>,
) -> Result<()> {
let instruction_data = InstructionDataBatchNullifyInputs::try_from_slice(&data)
.map_err(|_| AccountCompressionErrorCode::InputDeserializationFailed)?;
process_batch_nullify(&ctx, instruction_data)
}
pub fn batch_append<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, BatchAppend<'info>>,
data: Vec<u8>,
) -> Result<()> {
let instruction_data = InstructionDataBatchAppendInputs::try_from_slice(&data)
.map_err(|_| AccountCompressionErrorCode::InputDeserializationFailed)?;
process_batch_append_leaves(&ctx, instruction_data)
}
pub fn batch_update_address_tree<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, BatchUpdateAddressTree<'info>>,
data: Vec<u8>,
) -> Result<()> {
let instruction_data = InstructionDataBatchNullifyInputs::try_from_slice(&data)
.map_err(|_| AccountCompressionErrorCode::InputDeserializationFailed)?;
process_batch_update_address_tree(&ctx, instruction_data)
}
pub fn rollover_batched_address_merkle_tree<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, RolloverBatchedAddressMerkleTree<'info>>,
network_fee: Option<u64>,
) -> Result<()> {
process_rollover_batched_address_merkle_tree(ctx, network_fee)
}
pub fn rollover_batched_state_merkle_tree<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, RolloverBatchedStateMerkleTree<'info>>,
additional_bytes: u64,
network_fee: Option<u64>,
) -> Result<()> {
process_rollover_batched_state_merkle_tree(ctx, additional_bytes, network_fee)
}
pub fn migrate_state<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, MigrateState<'info>>,
input: MigrateLeafParams,
) -> Result<()> {
process_migrate_state(&ctx, input)
}
}