From b958071fdb1e943c95de5049b66ef6ee9b8c7aab Mon Sep 17 00:00:00 2001 From: ananas Date: Sun, 1 Mar 2026 01:36:46 +0000 Subject: [PATCH 1/2] fix: migrate trees ix preserve work --- program-tests/registry-test/tests/tests.rs | 24 ++++++++++++++++++++++ programs/registry/src/lib.rs | 13 +++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/program-tests/registry-test/tests/tests.rs b/program-tests/registry-test/tests/tests.rs index 399435372c..836a8524ca 100644 --- a/program-tests/registry-test/tests/tests.rs +++ b/program-tests/registry-test/tests/tests.rs @@ -453,6 +453,30 @@ async fn test_initialize_protocol_config() { .await .unwrap(); } + // FAIL: initialize a Merkle tree with network_fee + forester (must be rejected) + { + let merkle_tree_keypair = Keypair::new(); + let nullifier_queue_keypair = Keypair::new(); + let cpi_context_keypair = Keypair::new(); + let result = create_state_merkle_tree_and_queue_account( + &payer, + true, + &mut rpc, + &merkle_tree_keypair, + &nullifier_queue_keypair, + Some(&cpi_context_keypair), + None, + Some(Pubkey::new_unique()), + 1, + &StateMerkleTreeConfig { + network_fee: Some(5000), + ..Default::default() + }, + &NullifierQueueConfig::default(), + ) + .await; + assert_rpc_error(result, 3, RegistryError::ForesterDefined.into()).unwrap(); + } // FAIL: initialize a Merkle tree with network fee != 0 || 5000 { let merkle_tree_keypair = Keypair::new(); diff --git a/programs/registry/src/lib.rs b/programs/registry/src/lib.rs index 201d78ff16..38bca66614 100644 --- a/programs/registry/src/lib.rs +++ b/programs/registry/src/lib.rs @@ -677,13 +677,16 @@ pub mod light_registry { bump: u8, inputs: MigrateLeafParams, ) -> Result<()> { - check_forester( - &ctx.accounts.merkle_tree.load()?.metadata, - ctx.accounts.authority.key(), - ctx.accounts.merkle_tree.key(), - &mut Some(ctx.accounts.registered_forester_pda.clone()), + let metadata = ctx.accounts.merkle_tree.load()?.metadata; + ForesterEpochPda::check_forester_in_program( + &mut ctx.accounts.registered_forester_pda, + &ctx.accounts.authority.key(), + &ctx.accounts.merkle_tree.key(), DEFAULT_WORK_V1, )?; + if metadata.rollover_metadata.network_fee == 0 { + return err!(RegistryError::InvalidNetworkFee); + } process_migrate_state(&ctx, bump, inputs) } From 6a2e0ad2e1412be75638a48c9d8416c0dbb12385 Mon Sep 17 00:00:00 2001 From: ananas Date: Mon, 2 Mar 2026 18:33:43 +0000 Subject: [PATCH 2/2] fix ci Entire-Checkpoint: c994844a3394 --- program-tests/registry-test/tests/tests.rs | 2 ++ programs/registry/src/lib.rs | 4 ++++ sdk-libs/program-test/src/indexer/test_indexer.rs | 10 +++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/program-tests/registry-test/tests/tests.rs b/program-tests/registry-test/tests/tests.rs index 836a8524ca..569959f476 100644 --- a/program-tests/registry-test/tests/tests.rs +++ b/program-tests/registry-test/tests/tests.rs @@ -619,6 +619,8 @@ async fn test_custom_forester() { let (mut state_merkle_tree_bundle, _, mut rpc) = { let mut e2e_env = init_program_test_env(rpc, &env, 50).await; e2e_env.indexer.state_merkle_trees.clear(); + // Custom forester trees have no network fee, disable fee assertions. + e2e_env.keypair_action_config.fee_assert = false; // add state merkle tree to the indexer e2e_env .indexer diff --git a/programs/registry/src/lib.rs b/programs/registry/src/lib.rs index 38bca66614..0bd6dc01af 100644 --- a/programs/registry/src/lib.rs +++ b/programs/registry/src/lib.rs @@ -341,6 +341,10 @@ pub mod light_registry { if network_fee != ctx.accounts.protocol_config_pda.config.network_fee { return err!(RegistryError::InvalidNetworkFee); } + if forester.is_some() { + msg!("Forester pubkey must not be defined for trees serviced by light foresters."); + return err!(RegistryError::ForesterDefined); + } } else if forester.is_none() { msg!("Forester pubkey required for trees without a network fee."); msg!("Trees without a network fee will not be serviced by light foresters."); diff --git a/sdk-libs/program-test/src/indexer/test_indexer.rs b/sdk-libs/program-test/src/indexer/test_indexer.rs index 32249ab81b..6218a75fd4 100644 --- a/sdk-libs/program-test/src/indexer/test_indexer.rs +++ b/sdk-libs/program-test/src/indexer/test_indexer.rs @@ -1638,6 +1638,14 @@ impl TestIndexer { ) { let (rollover_fee, merkle_tree, output_queue_batch_size) = match tree_type { TreeType::StateV1 => { + let config = if forester.is_some() { + StateMerkleTreeConfig { + network_fee: None, + ..StateMerkleTreeConfig::default() + } + } else { + StateMerkleTreeConfig::default() + }; create_state_merkle_tree_and_queue_account( &self.payer, true, @@ -1648,7 +1656,7 @@ impl TestIndexer { owning_program_id, forester, self.state_merkle_trees.len() as u64, - &StateMerkleTreeConfig::default(), + &config, &NullifierQueueConfig::default(), ) .await