diff --git a/creator-keys/src/lib.rs b/creator-keys/src/lib.rs index 1adb1f23..7d0329d3 100644 --- a/creator-keys/src/lib.rs +++ b/creator-keys/src/lib.rs @@ -2403,6 +2403,7 @@ impl CreatorKeysContract { protocol_bps: u32, ) -> Result<(), ContractError> { admin.require_auth(); + assert_is_admin(&env, &admin)?; fee::assert_valid_fee_bps(creator_bps, protocol_bps)?; let config = fee::FeeConfig { @@ -2597,6 +2598,7 @@ impl CreatorKeysContract { recipient: Address, ) -> Result<(), ContractError> { admin.require_auth(); + assert_is_admin(&env, &admin)?; validate_non_zero_address(&env, &recipient)?; let old_recipient: Option
= env diff --git a/creator-keys/tests/admin_unauthorized.rs b/creator-keys/tests/admin_unauthorized.rs index 3fcb4cf0..1dc0cbaa 100644 --- a/creator-keys/tests/admin_unauthorized.rs +++ b/creator-keys/tests/admin_unauthorized.rs @@ -1,11 +1,11 @@ //! Integration tests for admin-only functions reverting when called by a non-admin. -//! +// //! Every function gated by `assert_is_admin` must reject a non-admin caller with //! `ContractError::Unauthorized` and must not mutate any contract state. mod contract_test_env; -use contract_test_env::{register_creator_keys, set_pricing_and_fees, test_env_with_auths}; +use contract_test_env::{register_creator_keys, set_pricing_and_fees, set_protocol_fee_bps, test_env_with_auths}; use creator_keys::{ContractError, CreatorKeysContractClient}; use soroban_sdk::{testutils::Address as _, Address, Env}; @@ -131,6 +131,74 @@ fn test_update_protocol_fee_recipient_no_state_change_on_non_admin_call() { ); } +// ── set_fee_config ────────────────────────────────────────────────────── + +#[test] +fn test_set_fee_config_reverts_for_non_admin() { + let env = test_env_with_auths(); + let (client, _admin) = full_setup(&env); + + let non_admin = Address::generate(&env); + let result = client.try_set_fee_config(&non_admin, &8000u32, &2000u32); + assert_eq!(result, Err(Ok(ContractError::Unauthorized))); +} + +#[test] +fn test_set_fee_config_no_state_change_on_non_admin_call() { + let env = test_env_with_auths(); + let (client, _admin) = full_setup(&env); + + let protocol_bps_before = client.get_protocol_fee_bps().unwrap(); + + let non_admin = Address::generate(&env); + let result = client.try_set_fee_config(&non_admin, &8000u32, &2000u32); + assert_eq!(result, Err(Ok(ContractError::Unauthorized))); + + let protocol_bps_after = client.get_protocol_fee_bps().unwrap(); + assert_eq!( + protocol_bps_before, protocol_bps_after, + "protocol fee bps must not change when non-admin set_fee_config call is rejected" + ); +} + +// ── set_protocol_fee_recipient ────────────────────────────────────────── + +#[test] +fn test_set_protocol_fee_recipient_reverts_for_non_admin() { + let env = test_env_with_auths(); + let (client, _admin) = full_setup(&env); + + let original_recipient = Address::generate(&env); + let admin = setup_admin(&env, &client); + client.set_protocol_fee_recipient(&admin, &original_recipient); + + let non_admin = Address::generate(&env); + let new_recipient = Address::generate(&env); + let result = client.try_set_protocol_fee_recipient(&non_admin, &new_recipient); + assert_eq!(result, Err(Ok(ContractError::Unauthorized))); +} + +#[test] +fn test_set_protocol_fee_recipient_no_state_change_on_non_admin_call() { + let env = test_env_with_auths(); + let (client, _admin) = full_setup(&env); + + let admin = setup_admin(&env, &client); + let original_recipient = Address::generate(&env); + client.set_protocol_fee_recipient(&admin, &original_recipient); + + let non_admin = Address::generate(&env); + let new_recipient = Address::generate(&env); + let _ = client.try_set_protocol_fee_recipient(&non_admin, &new_recipient); + + let stored = client.get_protocol_fee_recipient(); + assert_eq!( + stored, + Some(original_recipient), + "fee recipient must not change when non-admin set_protocol_fee_recipient call is rejected" + ); +} + // ── withdraw_treasury ───────────────────────────────────────────────────────── #[test] diff --git a/creator-keys/tests/buy_quote_monotonicity.rs b/creator-keys/tests/buy_quote_monotonicity.rs index 33ffca6b..82c0eaa8 100644 --- a/creator-keys/tests/buy_quote_monotonicity.rs +++ b/creator-keys/tests/buy_quote_monotonicity.rs @@ -381,6 +381,7 @@ fn test_buy_quote_updates_after_fee_config_mutation() { // Update fee config: 50% creator, 50% protocol let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &5000u32, &5000u32); // Get quote after fee config update diff --git a/creator-keys/tests/contract_test_env/mod.rs b/creator-keys/tests/contract_test_env/mod.rs index 4172695e..3160fe82 100644 --- a/creator-keys/tests/contract_test_env/mod.rs +++ b/creator-keys/tests/contract_test_env/mod.rs @@ -80,6 +80,7 @@ pub fn set_protocol_fee_bps( protocol_bps: u32, ) -> Address { let admin = Address::generate(env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &creator_bps, &protocol_bps); admin } @@ -93,6 +94,7 @@ pub fn set_pricing_and_fees( protocol_bps: u32, ) -> Address { let admin = Address::generate(env); + client.set_protocol_admin(&admin, &admin); client.set_key_price(&admin, &key_price); client.set_fee_config(&admin, &creator_bps, &protocol_bps); admin @@ -139,6 +141,7 @@ pub fn register_test_creator_with_fee_config( protocol_bps: u32, ) -> Address { let admin = Address::generate(env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &creator_bps, &protocol_bps); let creator = Address::generate(env); client.register_creator( diff --git a/creator-keys/tests/creator_fee_bps.rs b/creator-keys/tests/creator_fee_bps.rs index b9cc8297..99b8e944 100644 --- a/creator-keys/tests/creator_fee_bps.rs +++ b/creator-keys/tests/creator_fee_bps.rs @@ -11,6 +11,7 @@ fn test_get_creator_fee_bps_returns_configured_value() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); client.register_creator( @@ -38,6 +39,7 @@ fn test_get_creator_fee_bps_is_read_only() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); client.register_creator( @@ -68,6 +70,7 @@ fn test_get_creator_fee_bps_tracks_fee_config_updates() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); client.register_creator( diff --git a/creator-keys/tests/creator_fee_config_view.rs b/creator-keys/tests/creator_fee_config_view.rs index 8979fd73..ed14e6a2 100644 --- a/creator-keys/tests/creator_fee_config_view.rs +++ b/creator-keys/tests/creator_fee_config_view.rs @@ -58,6 +58,7 @@ fn test_get_creator_fee_config_registered_with_fee_config() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); @@ -92,6 +93,7 @@ fn test_get_creator_fee_config_is_read_only() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); @@ -127,6 +129,7 @@ fn test_get_creator_fee_config_updates_after_fee_reconfiguration() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = soroban_sdk::Address::generate(&env); let handle = String::from_str(&env, "test_creator"); @@ -163,6 +166,7 @@ fn test_get_creator_fee_config_multiple_creators_independent() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator1 = soroban_sdk::Address::generate(&env); let creator2 = soroban_sdk::Address::generate(&env); let handle1 = String::from_str(&env, "creator_one"); @@ -212,6 +216,7 @@ fn test_get_creator_fee_config_unregistered_after_fee_config_set() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let unregistered_creator = soroban_sdk::Address::generate(&env); client.set_fee_config(&admin, &9000u32, &1000u32); diff --git a/creator-keys/tests/creator_treasury_share.rs b/creator-keys/tests/creator_treasury_share.rs index 49f3f50e..ac0a6a87 100644 --- a/creator-keys/tests/creator_treasury_share.rs +++ b/creator-keys/tests/creator_treasury_share.rs @@ -11,6 +11,7 @@ fn test_get_creator_treasury_share_returns_configured_value() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); client.register_creator( @@ -38,6 +39,7 @@ fn test_get_creator_treasury_share_is_read_only() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); client.register_creator( diff --git a/creator-keys/tests/fee_config_updated_event.rs b/creator-keys/tests/fee_config_updated_event.rs index 35f3859e..04aadc03 100644 --- a/creator-keys/tests/fee_config_updated_event.rs +++ b/creator-keys/tests/fee_config_updated_event.rs @@ -14,6 +14,7 @@ fn test_fee_config_updated_event_emitted() { let env = test_env_with_auths(); let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); // Initial set (no old config) client.set_fee_config(&admin, &9000, &1000); diff --git a/creator-keys/tests/fee_config_view.rs b/creator-keys/tests/fee_config_view.rs index a9b36335..5e212774 100644 --- a/creator-keys/tests/fee_config_view.rs +++ b/creator-keys/tests/fee_config_view.rs @@ -23,6 +23,7 @@ fn test_get_protocol_fee_view_returns_configured_values() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); @@ -40,6 +41,7 @@ fn test_get_protocol_fee_view_is_read_only() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8000u32, &2000u32); @@ -59,6 +61,7 @@ fn test_get_protocol_fee_view_updates_after_reconfiguration() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); let v1 = client.get_protocol_fee_view(); @@ -78,6 +81,7 @@ fn test_protocol_fee_bps_multiple_sequential_updates() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); // First update client.set_fee_config(&admin, &9000u32, &1000u32); diff --git a/creator-keys/tests/fee_split.rs b/creator-keys/tests/fee_split.rs index 0d6e7890..1cabb520 100644 --- a/creator-keys/tests/fee_split.rs +++ b/creator-keys/tests/fee_split.rs @@ -12,6 +12,7 @@ fn test_set_and_get_fee_config() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); let config = client.get_fee_config(); @@ -28,6 +29,7 @@ fn test_compute_fees_for_payment() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); @@ -45,6 +47,7 @@ fn test_set_fee_config_invalid_sum_fails() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let result = client.try_set_fee_config(&admin, &8000u32, &1000u32); assert_eq!(result, Err(Ok(ContractError::InvalidFeeConfig))); @@ -58,6 +61,7 @@ fn test_set_fee_config_max_protocol_bps_succeeds() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &5000u32, &5000u32); let config = client.get_fee_config().unwrap(); @@ -73,6 +77,7 @@ fn test_set_fee_config_max_creator_bps_succeeds() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &10000u32, &0u32); let config = client.get_fee_config().unwrap(); @@ -88,6 +93,7 @@ fn test_set_fee_config_creator_bps_above_max_fails() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let result = client.try_set_fee_config(&admin, &10001u32, &0u32); assert_eq!(result, Err(Ok(ContractError::InvalidFeeConfig))); @@ -101,6 +107,7 @@ fn test_set_fee_config_protocol_bps_above_max_fails() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let result = client.try_set_fee_config(&admin, &4999u32, &5001u32); assert_eq!(result, Err(Ok(ContractError::ProtocolFeeExceedsCap))); diff --git a/creator-keys/tests/identical_fee_configs_independent.rs b/creator-keys/tests/identical_fee_configs_independent.rs index 7aaa664d..1ecfeebe 100644 --- a/creator-keys/tests/identical_fee_configs_independent.rs +++ b/creator-keys/tests/identical_fee_configs_independent.rs @@ -78,6 +78,7 @@ fn test_fee_config_update_does_not_affect_other_creator() { // Update global fee config let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8000u32, &2000u32); // Both creators should see the new fee config (since it's global) diff --git a/creator-keys/tests/initialization_event_fields.rs b/creator-keys/tests/initialization_event_fields.rs index fc04716a..6af0054f 100644 --- a/creator-keys/tests/initialization_event_fields.rs +++ b/creator-keys/tests/initialization_event_fields.rs @@ -16,6 +16,7 @@ fn test_initialization_event_admin_matches_argument() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); let handle = String::from_str(&env, "test_handle"); @@ -50,6 +51,7 @@ fn test_initialization_event_protocol_fee_bps_matches_argument() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); let handle = String::from_str(&env, "test_handle"); @@ -89,6 +91,7 @@ fn test_initialization_event_protocol_fee_recipient_matches_argument() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); let handle = String::from_str(&env, "test_handle"); @@ -126,6 +129,7 @@ fn test_initialization_event_initialized_at_ledger_matches_current() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); let handle = String::from_str(&env, "test_handle"); diff --git a/creator-keys/tests/max_amount_inputs.rs b/creator-keys/tests/max_amount_inputs.rs index 083d652b..79999973 100644 --- a/creator-keys/tests/max_amount_inputs.rs +++ b/creator-keys/tests/max_amount_inputs.rs @@ -56,6 +56,7 @@ fn test_buy_quote_with_large_amount_succeeds() { let large_price = 500_000_000_000i128; set_stored_key_price(&env, &contract_id, large_price); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); let creator = register_test_creator(&env, &client, "creator3"); @@ -71,6 +72,7 @@ fn test_buy_quote_with_maximum_safe_amount_succeeds() { let max_safe_amount = 9_223_372_036_854_775i128; set_stored_key_price(&env, &contract_id, max_safe_amount); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); let creator = register_test_creator(&env, &client, "creator4"); @@ -86,6 +88,7 @@ fn test_sell_quote_with_large_amount_succeeds() { let large_price = 500_000_000_000i128; set_stored_key_price(&env, &contract_id, large_price); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); let creator = register_test_creator(&env, &client, "creator5"); let holder = register_holder_with_one_key(&env, &client, &creator); @@ -102,6 +105,7 @@ fn test_sell_quote_with_maximum_safe_amount_succeeds() { let max_safe_amount = 9_223_372_036_854_775i128; set_stored_key_price(&env, &contract_id, max_safe_amount); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); let creator = register_test_creator(&env, &client, "creator6"); let holder = register_holder_with_one_key(&env, &client, &creator); @@ -117,6 +121,7 @@ fn test_buy_quote_with_maximum_safe_amount_50_50_fees_succeeds() { let max_safe_amount = 9_223_372_036_854_775i128; set_stored_key_price(&env, &contract_id, max_safe_amount); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &5000u32, &5000u32); let creator = register_test_creator(&env, &client, "creator7"); @@ -135,6 +140,7 @@ fn test_sell_quote_with_maximum_safe_amount_50_50_fees_succeeds() { let max_safe_amount = 9_223_372_036_854_775i128; set_stored_key_price(&env, &contract_id, max_safe_amount); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &5000u32, &5000u32); let creator = register_test_creator(&env, &client, "creator8"); let holder = register_holder_with_one_key(&env, &client, &creator); diff --git a/creator-keys/tests/multiple_creators_independent.rs b/creator-keys/tests/multiple_creators_independent.rs index f4be92a2..cb3a0289 100644 --- a/creator-keys/tests/multiple_creators_independent.rs +++ b/creator-keys/tests/multiple_creators_independent.rs @@ -67,6 +67,7 @@ fn test_fee_bps_update_for_a_does_not_change_b() { assert_eq!(fee_b_before.creator_bps, 9_000); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8_000u32, &2_000u32); let fee_a_after = client.get_creator_fee_config(&creator_a); diff --git a/creator-keys/tests/protocol_config_initialized.rs b/creator-keys/tests/protocol_config_initialized.rs index e555021f..1c72e180 100644 --- a/creator-keys/tests/protocol_config_initialized.rs +++ b/creator-keys/tests/protocol_config_initialized.rs @@ -26,6 +26,7 @@ fn test_is_protocol_config_initialized_returns_true_after_fee_config_is_set() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000u32, &1000u32); @@ -40,6 +41,7 @@ fn test_is_protocol_config_initialized_is_read_only() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8000u32, &2000u32); diff --git a/creator-keys/tests/protocol_fee_bps_read.rs b/creator-keys/tests/protocol_fee_bps_read.rs index 4753d0bf..79e925f1 100644 --- a/creator-keys/tests/protocol_fee_bps_read.rs +++ b/creator-keys/tests/protocol_fee_bps_read.rs @@ -15,6 +15,7 @@ fn test_get_protocol_fee_bps_returns_stored_value() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000, &1000); let bps = client.get_protocol_fee_bps(); @@ -27,6 +28,7 @@ fn test_get_protocol_fee_bps_returns_updated_value() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9000, &1000); assert_eq!(client.get_protocol_fee_bps(), 1000); @@ -58,6 +60,7 @@ fn test_get_protocol_fee_bps_does_not_mutate_state() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &9500, &500); let first = client.get_protocol_fee_bps(); @@ -75,6 +78,7 @@ fn test_get_protocol_fee_bps_persists_across_operations() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8500, &1500); let creator = soroban_sdk::Address::generate(&env); diff --git a/creator-keys/tests/protocol_fee_recipient.rs b/creator-keys/tests/protocol_fee_recipient.rs index 3b17c4e2..6ce252df 100644 --- a/creator-keys/tests/protocol_fee_recipient.rs +++ b/creator-keys/tests/protocol_fee_recipient.rs @@ -53,6 +53,7 @@ fn test_get_protocol_fee_recipient_reflects_set_entrypoint() { let admin = Address::generate(&env); let recipient = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_protocol_fee_recipient(&admin, &recipient); assert_eq!( @@ -92,6 +93,7 @@ fn test_get_protocol_fee_recipient_tracks_overwrites() { let first = Address::generate(&env); let second = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_protocol_fee_recipient(&admin, &first); assert_eq!( client.get_protocol_fee_recipient(), diff --git a/creator-keys/tests/protocol_state_version.rs b/creator-keys/tests/protocol_state_version.rs index 447b1f5c..32760e84 100644 --- a/creator-keys/tests/protocol_state_version.rs +++ b/creator-keys/tests/protocol_state_version.rs @@ -33,6 +33,7 @@ fn test_protocol_state_version_increments_on_fee_config_update() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); // Read initial version let version_before = client.get_protocol_state_version(); @@ -64,6 +65,7 @@ fn test_protocol_state_version_monotonically_increasing() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let mut previous_version = client.get_protocol_state_version(); @@ -89,6 +91,7 @@ fn test_get_protocol_state_version_increments_only_on_config_updates() { let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); let buyer = Address::generate(&env); diff --git a/creator-keys/tests/protocol_treasury_share.rs b/creator-keys/tests/protocol_treasury_share.rs index 0cfa6245..8976d6b4 100644 --- a/creator-keys/tests/protocol_treasury_share.rs +++ b/creator-keys/tests/protocol_treasury_share.rs @@ -32,6 +32,7 @@ fn test_get_protocol_treasury_share_bps_returns_configured_value() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8000u32, &2000u32); @@ -52,6 +53,7 @@ fn test_get_protocol_treasury_share_bps_tracks_configuration_updates() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); // First configuration: 2000 bps protocol share client.set_fee_config(&admin, &8000u32, &2000u32); @@ -78,6 +80,7 @@ fn test_get_protocol_treasury_share_bps_is_read_only() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &7000u32, &3000u32); @@ -106,6 +109,7 @@ fn test_get_protocol_treasury_share_bps_explicit_basis_point_units() { let contract_id = env.register(CreatorKeysContract, ()); let client = CreatorKeysContractClient::new(&env, &contract_id); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); // Test: 100 bps = 1% protocol share client.set_fee_config(&admin, &9900u32, &100u32); diff --git a/creator-keys/tests/registration_event_details.rs b/creator-keys/tests/registration_event_details.rs index 9232ee53..0e9763a0 100644 --- a/creator-keys/tests/registration_event_details.rs +++ b/creator-keys/tests/registration_event_details.rs @@ -16,6 +16,7 @@ fn test_register_creator_event_field_values_match_fixtures() { // 1. Setup deterministic fixtures let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let creator = Address::generate(&env); let handle_str = "fixture_handle"; let handle = String::from_str(&env, handle_str); @@ -91,6 +92,7 @@ fn test_register_creator_event_fields_update_with_fee_config() { let env = test_env_with_auths(); let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); // First registration with one config client.set_fee_config(&admin, &9000, &1000); diff --git a/creator-keys/tests/sell_after_fee_config_mutation.rs b/creator-keys/tests/sell_after_fee_config_mutation.rs index ed78fa8f..0e9a7bb5 100644 --- a/creator-keys/tests/sell_after_fee_config_mutation.rs +++ b/creator-keys/tests/sell_after_fee_config_mutation.rs @@ -18,6 +18,7 @@ fn test_sell_execution_applies_updated_protocol_fee() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_key_price(&admin, &1000); // Original fee config: 90/10 split client.set_fee_config(&admin, &9000, &1000); @@ -69,6 +70,7 @@ fn test_sell_execution_fee_matches_quote_after_fee_config_update() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_key_price(&admin, &500); client.set_fee_config(&admin, &9000, &1000); diff --git a/creator-keys/tests/sell_quote_after_fee_config_update.rs b/creator-keys/tests/sell_quote_after_fee_config_update.rs index bd240424..002a299a 100644 --- a/creator-keys/tests/sell_quote_after_fee_config_update.rs +++ b/creator-keys/tests/sell_quote_after_fee_config_update.rs @@ -16,6 +16,7 @@ fn test_sell_quote_reflects_updated_fee_config() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_key_price(&admin, &1000); // Original fee config: 90/10 split client.set_fee_config(&admin, &9000, &1000); @@ -61,6 +62,7 @@ fn test_sell_quote_total_amount_updates_after_fee_config_change() { let (client, _) = register_creator_keys(&env); let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_key_price(&admin, &500); client.set_fee_config(&admin, &9000, &1000); diff --git a/creator-keys/tests/set_protocol_fee_recipient.rs b/creator-keys/tests/set_protocol_fee_recipient.rs index 7dfcd489..112ebe0d 100644 --- a/creator-keys/tests/set_protocol_fee_recipient.rs +++ b/creator-keys/tests/set_protocol_fee_recipient.rs @@ -16,6 +16,7 @@ fn test_set_protocol_fee_recipient_rejects_zero_address() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let zero_str = String::from_str( &env, "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF", @@ -43,6 +44,7 @@ fn test_set_protocol_fee_recipient_accepts_valid_address() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let recipient = Address::generate(&env); let result = client.try_set_protocol_fee_recipient(&admin, &recipient); @@ -61,6 +63,7 @@ fn test_set_protocol_fee_recipient_idempotent() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let recipient = Address::generate(&env); client.set_protocol_fee_recipient(&admin, &recipient); @@ -83,6 +86,7 @@ fn test_set_protocol_fee_recipient_emits_event_on_update() { let (client, _) = register_creator_keys(&env); let admin = Address::generate(&env); + client.set_protocol_admin(&admin, &admin); let old_recipient = Address::generate(&env); let new_recipient = Address::generate(&env); diff --git a/creator-keys/tests/zero_creator_fee_regression.rs b/creator-keys/tests/zero_creator_fee_regression.rs index 7ae764c2..794b8c97 100644 --- a/creator-keys/tests/zero_creator_fee_regression.rs +++ b/creator-keys/tests/zero_creator_fee_regression.rs @@ -23,6 +23,7 @@ fn test_zero_creator_bps_full_payment_to_creator_after_protocol_fee() { // contract allows (PROTOCOL_BPS_MAX = 5000). creator_bps=0 is not valid because // creator_bps + protocol_bps must equal 10000 and protocol_bps cannot exceed 5000. let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &5000u32, &5000u32); // Verify fee config is set correctly @@ -70,6 +71,7 @@ fn test_zero_creator_bps_with_partial_protocol_fee() { // Set up: 0% creator fee, 20% protocol fee (0 bps creator, 2000 bps protocol) // This means creator gets 80% and protocol gets 20% let admin = soroban_sdk::Address::generate(&env); + client.set_protocol_admin(&admin, &admin); client.set_fee_config(&admin, &8000u32, &2000u32); // Verify fee config