use crate::{get_hash_set, rpc::rpc_connection::RpcConnection, AccountZeroCopy};
use account_compression::{QueueAccount, QueueMetadata, QueueType, RolloverMetadata};
use light_utils::fee::compute_rollover_fee;
use solana_sdk::pubkey::Pubkey;
#[allow(clippy::too_many_arguments)]
pub async fn assert_address_queue_initialized<R: RpcConnection>(
rpc: &mut R,
queue_pubkey: &Pubkey,
queue_config: &account_compression::AddressQueueConfig,
associated_merkle_tree_pubkey: &Pubkey,
associated_tree_config: &account_compression::AddressMerkleTreeConfig,
expected_queue_type: QueueType,
expected_index: u64,
expected_program_owner: Option<Pubkey>,
expected_forester: Option<Pubkey>,
payer_pubkey: &Pubkey,
) {
assert_address_queue(
rpc,
queue_pubkey,
queue_config,
associated_merkle_tree_pubkey,
associated_tree_config,
expected_queue_type,
expected_index,
expected_program_owner,
expected_forester,
None,
None,
payer_pubkey,
)
.await;
}
#[allow(clippy::too_many_arguments)]
pub async fn assert_nullifier_queue_initialized<R: RpcConnection>(
rpc: &mut R,
queue_pubkey: &Pubkey,
queue_config: &account_compression::NullifierQueueConfig,
associated_merkle_tree_pubkey: &Pubkey,
associated_tree_config: &account_compression::StateMerkleTreeConfig,
expected_queue_type: QueueType,
expected_index: u64,
expected_program_owner: Option<Pubkey>,
expected_forester: Option<Pubkey>,
payer_pubkey: &Pubkey,
) {
let associated_tree_config = account_compression::AddressMerkleTreeConfig {
height: associated_tree_config.height,
changelog_size: associated_tree_config.changelog_size,
address_changelog_size: 0,
roots_size: associated_tree_config.roots_size,
canopy_depth: associated_tree_config.canopy_depth,
rollover_threshold: associated_tree_config.rollover_threshold,
close_threshold: associated_tree_config.close_threshold,
network_fee: associated_tree_config.network_fee,
};
let expected_rollover_fee = 0;
assert_queue(
rpc,
queue_pubkey,
queue_config,
associated_merkle_tree_pubkey,
&associated_tree_config,
expected_rollover_fee,
expected_queue_type,
expected_index,
expected_program_owner,
expected_forester,
None,
None,
payer_pubkey,
)
.await;
}
#[allow(clippy::too_many_arguments)]
pub async fn assert_address_queue<R: RpcConnection>(
rpc: &mut R,
queue_pubkey: &Pubkey,
queue_config: &account_compression::AddressQueueConfig,
associated_merkle_tree_pubkey: &Pubkey,
associated_tree_config: &account_compression::AddressMerkleTreeConfig,
expected_queue_type: QueueType,
expected_index: u64,
expected_program_owner: Option<Pubkey>,
expected_forester: Option<Pubkey>,
expected_rolledover_slot: Option<u64>,
expected_next_queue: Option<Pubkey>,
payer_pubkey: &Pubkey,
) {
let balance_merkle_tree = rpc
.get_account(*associated_merkle_tree_pubkey)
.await
.unwrap()
.unwrap()
.lamports;
let balance_queue = rpc
.get_account(*queue_pubkey)
.await
.unwrap()
.unwrap()
.lamports;
let expected_rollover_fee = match associated_tree_config.rollover_threshold {
Some(threshold) => {
compute_rollover_fee(threshold, associated_tree_config.height, balance_queue).unwrap()
+ compute_rollover_fee(
threshold,
associated_tree_config.height,
balance_merkle_tree,
)
.unwrap()
}
None => 0,
};
assert_queue(
rpc,
queue_pubkey,
queue_config,
associated_merkle_tree_pubkey,
associated_tree_config,
expected_rollover_fee,
expected_queue_type,
expected_index,
expected_program_owner,
expected_forester,
expected_rolledover_slot,
expected_next_queue,
payer_pubkey,
)
.await;
}
#[allow(clippy::too_many_arguments)]
pub async fn assert_queue<R: RpcConnection>(
rpc: &mut R,
queue_pubkey: &Pubkey,
queue_config: &account_compression::AddressQueueConfig,
associated_merkle_tree_pubkey: &Pubkey,
associated_tree_config: &account_compression::AddressMerkleTreeConfig,
expected_rollover_fee: u64,
expected_queue_type: QueueType,
expected_index: u64,
expected_program_owner: Option<Pubkey>,
expected_forester: Option<Pubkey>,
expected_rolledover_slot: Option<u64>,
expected_next_queue: Option<Pubkey>,
payer_pubkey: &Pubkey,
) {
let queue = AccountZeroCopy::<account_compression::QueueAccount>::new(rpc, *queue_pubkey).await;
let queue_account = queue.deserialized();
let expected_rollover_meta_data = RolloverMetadata {
index: expected_index,
rolledover_slot: expected_rolledover_slot.unwrap_or(u64::MAX),
rollover_threshold: associated_tree_config
.rollover_threshold
.unwrap_or_default(),
network_fee: queue_config.network_fee.unwrap_or_default(),
rollover_fee: expected_rollover_fee,
close_threshold: associated_tree_config.close_threshold.unwrap_or(u64::MAX),
additional_bytes: 0,
};
let expected_access_meta_data = account_compression::AccessMetadata {
owner: *payer_pubkey,
program_owner: expected_program_owner.unwrap_or_default(),
forester: expected_forester.unwrap_or_default(),
};
let expected_queue_meta_data = QueueMetadata {
access_metadata: expected_access_meta_data,
rollover_metadata: expected_rollover_meta_data,
associated_merkle_tree: *associated_merkle_tree_pubkey,
next_queue: expected_next_queue.unwrap_or_default(),
queue_type: expected_queue_type as u64,
};
assert_eq!(queue_account.metadata, expected_queue_meta_data);
let queue = unsafe { get_hash_set::<QueueAccount, R>(rpc, *queue_pubkey).await };
assert_eq!(queue.capacity, queue_config.capacity as usize);
assert_eq!(
queue.sequence_threshold,
queue_config.sequence_threshold as usize
);
}