Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Use on-chain queues with different sizes #879

Merged
merged 5 commits into from
Jun 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,6 @@ pub fn process_initialize_address_merkle_tree_and_queue<'info>(
merkle_tree_config: AddressMerkleTreeConfig,
queue_config: AddressQueueConfig,
) -> Result<()> {
if queue_config != AddressQueueConfig::default() {
unimplemented!("Only default address queue config is supported.");
}

let merkle_tree_rent = ctx.accounts.merkle_tree.get_lamports();
process_initialize_address_queue(
&ctx.accounts.queue.to_account_info(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,6 @@ pub fn process_initialize_state_merkle_tree_and_nullifier_queue(
nullifier_queue_config: NullifierQueueConfig,
additional_rent: u64,
) -> Result<()> {
if nullifier_queue_config != NullifierQueueConfig::default() {
unimplemented!("Only default nullifier queue config is supported.");
}
// Will be used to configure rollover fees for additional accounts (cpi
// context account).
if additional_rent != 0 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use account_compression::{
errors::AccountCompressionErrorCode,
state::QueueAccount,
utils::constants::{ADDRESS_MERKLE_TREE_CANOPY_DEPTH, ADDRESS_MERKLE_TREE_HEIGHT},
AddressMerkleTreeAccount, AddressMerkleTreeConfig, AddressQueueConfig, ID,
AddressMerkleTreeAccount, AddressMerkleTreeConfig, AddressQueueConfig, ID, SAFETY_MARGIN,
};
use anchor_lang::error::ErrorCode;
use light_hash_set::{HashSet, HashSetError};
Expand Down Expand Up @@ -42,10 +42,13 @@ use solana_sdk::{
/// 2. inserts two addresses to the queue
/// 3. inserts two addresses into the address Merkle tree
/// 4. insert third address
async fn address_queue_and_tree_functional(merkle_tree_config: &AddressMerkleTreeConfig) {
async fn address_queue_and_tree_functional(
merkle_tree_config: &AddressMerkleTreeConfig,
queue_config: &AddressQueueConfig,
) {
// CHECK: 1 create address Merkle tree and queue accounts
let (mut context, _, mut address_merkle_tree_bundle) =
test_setup_with_address_merkle_tree(merkle_tree_config).await;
test_setup_with_address_merkle_tree(merkle_tree_config, queue_config).await;
let payer = context.get_payer().insecure_clone();
let address_queue_pubkey = address_merkle_tree_bundle.accounts.queue;
let address_merkle_tree_pubkey = address_merkle_tree_bundle.accounts.merkle_tree;
Expand Down Expand Up @@ -104,26 +107,39 @@ async fn address_queue_and_tree_functional(merkle_tree_config: &AddressMerkleTre

#[tokio::test]
async fn test_address_queue_and_tree_functional_default() {
address_queue_and_tree_functional(&AddressMerkleTreeConfig::default()).await
address_queue_and_tree_functional(
&AddressMerkleTreeConfig::default(),
&AddressQueueConfig::default(),
)
.await
}

#[tokio::test]
async fn test_address_queue_and_tree_functional_custom() {
for changelog_size in (500..5000).step_by(500) {
let roots_size = changelog_size * 2;

for address_changelog_size in (250..1000).step_by(250) {
address_queue_and_tree_functional(&AddressMerkleTreeConfig {
height: ADDRESS_MERKLE_TREE_HEIGHT as u32,
changelog_size,
roots_size,
canopy_depth: ADDRESS_MERKLE_TREE_CANOPY_DEPTH,
address_changelog_size,
network_fee: Some(5000),
rollover_threshold: Some(95),
close_threshold: None,
})
.await;
for changelog_size in (1000..5000).step_by(1000) {
for queue_capacity in [5003, 6857, 7901] {
let roots_size = changelog_size * 2;

for address_changelog_size in (250..1000).step_by(250) {
address_queue_and_tree_functional(
&AddressMerkleTreeConfig {
height: ADDRESS_MERKLE_TREE_HEIGHT as u32,
changelog_size,
roots_size,
canopy_depth: ADDRESS_MERKLE_TREE_CANOPY_DEPTH,
address_changelog_size,
network_fee: Some(5000),
rollover_threshold: Some(95),
close_threshold: None,
},
&AddressQueueConfig {
capacity: queue_capacity,
sequence_threshold: roots_size + SAFETY_MARGIN,
network_fee: None,
},
)
.await;
}
}
}
}
Expand Down Expand Up @@ -241,9 +257,12 @@ async fn test_address_queue_and_tree_invalid_sizes() {
/// 11. invalid queue account
/// 12. invalid Merkle tree account
/// 13. non-associated Merkle tree
async fn update_address_merkle_tree_failing_tests(merkle_tree_config: &AddressMerkleTreeConfig) {
async fn update_address_merkle_tree_failing_tests(
merkle_tree_config: &AddressMerkleTreeConfig,
queue_config: &AddressQueueConfig,
) {
let (mut context, payer, mut address_merkle_tree_bundle) =
test_setup_with_address_merkle_tree(merkle_tree_config).await;
test_setup_with_address_merkle_tree(merkle_tree_config, queue_config).await;
let address_queue_pubkey = address_merkle_tree_bundle.accounts.queue;
let address_merkle_tree_pubkey = address_merkle_tree_bundle.accounts.merkle_tree;
// Insert a pair of addresses, correctly. Just do it with relayer.
Expand Down Expand Up @@ -627,6 +646,7 @@ async fn update_address_merkle_tree_failing_tests(merkle_tree_config: &AddressMe
&invalid_address_queue_keypair,
None,
merkle_tree_config,
queue_config,
2,
)
.await;
Expand Down Expand Up @@ -659,26 +679,39 @@ async fn update_address_merkle_tree_failing_tests(merkle_tree_config: &AddressMe

#[tokio::test]
async fn update_address_merkle_tree_failing_tests_default() {
update_address_merkle_tree_failing_tests(&AddressMerkleTreeConfig::default()).await
update_address_merkle_tree_failing_tests(
&AddressMerkleTreeConfig::default(),
&AddressQueueConfig::default(),
)
.await
}

#[tokio::test]
async fn update_address_merkle_tree_failing_tests_custom() {
for changelog_size in (500..5000).step_by(500) {
let roots_size = changelog_size * 2;

for address_changelog_size in (250..1000).step_by(250) {
update_address_merkle_tree_failing_tests(&AddressMerkleTreeConfig {
height: ADDRESS_MERKLE_TREE_HEIGHT as u32,
changelog_size,
roots_size,
canopy_depth: ADDRESS_MERKLE_TREE_CANOPY_DEPTH,
address_changelog_size,
network_fee: Some(5000),
rollover_threshold: Some(95),
close_threshold: None,
})
.await;
for changelog_size in (1000..5000).step_by(1000) {
for queue_capacity in [5003, 6857, 7901] {
let roots_size = changelog_size * 2;

for address_changelog_size in (250..1000).step_by(250) {
update_address_merkle_tree_failing_tests(
&AddressMerkleTreeConfig {
height: ADDRESS_MERKLE_TREE_HEIGHT as u32,
changelog_size,
roots_size,
canopy_depth: ADDRESS_MERKLE_TREE_CANOPY_DEPTH,
address_changelog_size,
network_fee: Some(5000),
rollover_threshold: Some(95),
close_threshold: None,
},
&AddressQueueConfig {
capacity: queue_capacity,
sequence_threshold: roots_size + SAFETY_MARGIN,
network_fee: None,
},
)
.await;
}
}
}
}
Expand All @@ -690,9 +723,12 @@ async fn update_address_merkle_tree_failing_tests_custom() {
/// 4. Merkle tree and queue not associated (Invalid Merkle tree).
/// 5. Successful rollover.
/// 6. Attempt to rollover already rolled over Queue and Merkle tree.
async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerkleTreeConfig) {
async fn address_merkle_tree_and_queue_rollover(
merkle_tree_config: &AddressMerkleTreeConfig,
queue_config: &AddressQueueConfig,
) {
let (mut context, payer, bundle) =
test_setup_with_address_merkle_tree(merkle_tree_config).await;
test_setup_with_address_merkle_tree(merkle_tree_config, queue_config).await;
let address_merkle_tree_pubkey = bundle.accounts.merkle_tree;
let address_queue_pubkey = bundle.accounts.queue;
let address_merkle_tree_keypair_2 = Keypair::new();
Expand All @@ -705,6 +741,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_queue_keypair_2,
None,
merkle_tree_config,
queue_config,
2,
)
.await;
Expand All @@ -722,6 +759,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_merkle_tree_pubkey,
&address_queue_pubkey,
merkle_tree_config,
queue_config,
)
.await;

Expand Down Expand Up @@ -770,6 +808,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_merkle_tree_pubkey,
&address_queue_pubkey,
merkle_tree_config,
queue_config,
)
.await;

Expand All @@ -796,6 +835,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_merkle_tree_pubkey,
&address_queue_keypair_2.pubkey(),
merkle_tree_config,
queue_config,
)
.await;

Expand All @@ -814,6 +854,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_merkle_tree_keypair_2.pubkey(),
&address_queue_pubkey,
merkle_tree_config,
queue_config,
)
.await;

Expand All @@ -838,6 +879,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_merkle_tree_pubkey,
&address_queue_pubkey,
merkle_tree_config,
queue_config,
)
.await
.unwrap();
Expand All @@ -863,6 +905,7 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk
&address_merkle_tree_pubkey,
&address_queue_pubkey,
merkle_tree_config,
queue_config,
)
.await;

Expand All @@ -876,32 +919,46 @@ async fn address_merkle_tree_and_queue_rollover(merkle_tree_config: &AddressMerk

#[tokio::test]
async fn test_address_merkle_tree_and_queue_rollover_default() {
address_merkle_tree_and_queue_rollover(&AddressMerkleTreeConfig::default()).await
address_merkle_tree_and_queue_rollover(
&AddressMerkleTreeConfig::default(),
&AddressQueueConfig::default(),
)
.await
}

#[tokio::test]
async fn test_address_merkle_tree_and_queue_rollover_custom() {
for changelog_size in (500..5000).step_by(500) {
let roots_size = changelog_size * 2;

for address_changelog_size in (250..1000).step_by(250) {
address_merkle_tree_and_queue_rollover(&AddressMerkleTreeConfig {
height: ADDRESS_MERKLE_TREE_HEIGHT as u32,
changelog_size,
roots_size,
canopy_depth: ADDRESS_MERKLE_TREE_CANOPY_DEPTH,
address_changelog_size,
network_fee: Some(5000),
rollover_threshold: Some(95),
close_threshold: None,
})
.await;
for changelog_size in (1000..5000).step_by(1000) {
for queue_capacity in [5003, 6857, 7901] {
let roots_size = changelog_size * 2;

for address_changelog_size in (250..1000).step_by(250) {
address_merkle_tree_and_queue_rollover(
&AddressMerkleTreeConfig {
height: ADDRESS_MERKLE_TREE_HEIGHT as u32,
changelog_size,
roots_size,
canopy_depth: ADDRESS_MERKLE_TREE_CANOPY_DEPTH,
address_changelog_size,
network_fee: Some(5000),
rollover_threshold: Some(95),
close_threshold: None,
},
&AddressQueueConfig {
capacity: queue_capacity,
sequence_threshold: roots_size + SAFETY_MARGIN,
network_fee: None,
},
)
.await;
}
}
}
}

pub async fn test_setup_with_address_merkle_tree(
merkle_tree_config: &AddressMerkleTreeConfig,
queue_config: &AddressQueueConfig,
) -> (
ProgramTestRpcConnection, // rpc
Keypair, // payer
Expand All @@ -924,6 +981,7 @@ pub async fn test_setup_with_address_merkle_tree(
&address_queue_keypair,
None,
merkle_tree_config,
queue_config,
1,
)
.await;
Expand Down
Loading