Skip to content

Commit 51186ed

Browse files
authored
Merge pull request #654 from baedboibidex-cmyk/test/admin-revert-config-leaves-protocol-config-unchanged
Add integration test for admin function reverts leaving protocol config values unchanged
2 parents 86d6168 + 04d9907 commit 51186ed

44 files changed

Lines changed: 181 additions & 58 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

creator-keys/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,6 +2444,7 @@ impl CreatorKeysContract {
24442444
protocol_bps: u32,
24452445
) -> Result<(), ContractError> {
24462446
admin.require_auth();
2447+
assert_is_admin(&env, &admin)?;
24472448
fee::assert_valid_fee_bps(creator_bps, protocol_bps)?;
24482449

24492450
let config = fee::FeeConfig {
@@ -2668,6 +2669,7 @@ impl CreatorKeysContract {
26682669
recipient: Address,
26692670
) -> Result<(), ContractError> {
26702671
admin.require_auth();
2672+
assert_is_admin(&env, &admin)?;
26712673
validate_non_zero_address(&env, &recipient)?;
26722674

26732675
let old_recipient: Option<Address> = env
@@ -4527,6 +4529,7 @@ mod tests {
45274529
let client = super::CreatorKeysContractClient::new(&env, &contract_id);
45284530
let admin = Address::generate(&env);
45294531

4532+
client.set_protocol_admin(&admin, &admin);
45304533
client.set_fee_config(&admin, &9000, &1000);
45314534

45324535
let bps = env.as_contract(&contract_id, || super::read_protocol_fee_bps(&env));

creator-keys/src/test_issues.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ mod issue_tests {
114114
let client = CreatorKeysContractClient::new(&env, &contract_id);
115115

116116
let admin = Address::generate(&env);
117+
client.set_protocol_admin(&admin, &admin);
117118
client.set_key_price(&admin, &KEY_PRICE);
118119
client.set_fee_config(&admin, &10_000, &0);
119120

@@ -788,6 +789,7 @@ mod issue_tests {
788789

789790
let protocol_bps = 250u32; // 2.5%
790791
let creator_bps = 500u32; // 5.0%
792+
client.set_protocol_admin(&admin, &admin);
791793
client.set_fee_config(&admin, &creator_bps, &protocol_bps);
792794

793795
let creator = register_creator(&env, &client, None);

creator-keys/tests/admin_unauthorized.rs

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//! Integration tests for admin-only functions reverting when called by a non-admin.
2-
//!
2+
//
33
//! Every function gated by `assert_is_admin` must reject a non-admin caller with
44
//! `ContractError::Unauthorized` and must not mutate any contract state.
55
@@ -11,18 +11,10 @@ use soroban_sdk::{testutils::Address as _, Address, Env};
1111

1212
// ── helpers ───────────────────────────────────────────────────────────────────
1313

14-
/// Register a known admin into contract storage and return it.
15-
fn setup_admin(env: &Env, client: &CreatorKeysContractClient<'_>) -> Address {
16-
let admin = Address::generate(env);
17-
client.set_protocol_admin(&admin, &admin);
18-
admin
19-
}
20-
2114
/// Full setup: contract + pricing + fees + admin. Returns (client, admin).
2215
fn full_setup(env: &Env) -> (CreatorKeysContractClient<'_>, Address) {
2316
let (client, _) = register_creator_keys(env);
24-
set_pricing_and_fees(env, &client, 100i128, 9000, 1000);
25-
let admin = setup_admin(env, &client);
17+
let admin = set_pricing_and_fees(env, &client, 100i128, 9000, 1000);
2618
(client, admin)
2719
}
2820

@@ -131,6 +123,72 @@ fn test_update_protocol_fee_recipient_no_state_change_on_non_admin_call() {
131123
);
132124
}
133125

126+
// ── set_fee_config ──────────────────────────────────────────────────────
127+
128+
#[test]
129+
fn test_set_fee_config_reverts_for_non_admin() {
130+
let env = test_env_with_auths();
131+
let (client, _admin) = full_setup(&env);
132+
133+
let non_admin = Address::generate(&env);
134+
let result = client.try_set_fee_config(&non_admin, &8000u32, &2000u32);
135+
assert_eq!(result, Err(Ok(ContractError::Unauthorized)));
136+
}
137+
138+
#[test]
139+
fn test_set_fee_config_no_state_change_on_non_admin_call() {
140+
let env = test_env_with_auths();
141+
let (client, _admin) = full_setup(&env);
142+
143+
let protocol_bps_before = client.get_protocol_fee_bps();
144+
145+
let non_admin = Address::generate(&env);
146+
let result = client.try_set_fee_config(&non_admin, &8000u32, &2000u32);
147+
assert_eq!(result, Err(Ok(ContractError::Unauthorized)));
148+
149+
let protocol_bps_after = client.get_protocol_fee_bps();
150+
assert_eq!(
151+
protocol_bps_before, protocol_bps_after,
152+
"protocol fee bps must not change when non-admin set_fee_config call is rejected"
153+
);
154+
}
155+
156+
// ── set_protocol_fee_recipient ──────────────────────────────────────────
157+
158+
#[test]
159+
fn test_set_protocol_fee_recipient_reverts_for_non_admin() {
160+
let env = test_env_with_auths();
161+
let (client, admin) = full_setup(&env);
162+
163+
let original_recipient = Address::generate(&env);
164+
client.set_protocol_fee_recipient(&admin, &original_recipient);
165+
166+
let non_admin = Address::generate(&env);
167+
let new_recipient = Address::generate(&env);
168+
let result = client.try_set_protocol_fee_recipient(&non_admin, &new_recipient);
169+
assert_eq!(result, Err(Ok(ContractError::Unauthorized)));
170+
}
171+
172+
#[test]
173+
fn test_set_protocol_fee_recipient_no_state_change_on_non_admin_call() {
174+
let env = test_env_with_auths();
175+
let (client, admin) = full_setup(&env);
176+
177+
let original_recipient = Address::generate(&env);
178+
client.set_protocol_fee_recipient(&admin, &original_recipient);
179+
180+
let non_admin = Address::generate(&env);
181+
let new_recipient = Address::generate(&env);
182+
let _ = client.try_set_protocol_fee_recipient(&non_admin, &new_recipient);
183+
184+
let stored = client.get_protocol_fee_recipient();
185+
assert_eq!(
186+
stored,
187+
Some(original_recipient),
188+
"fee recipient must not change when non-admin set_protocol_fee_recipient call is rejected"
189+
);
190+
}
191+
134192
// ── withdraw_treasury ─────────────────────────────────────────────────────────
135193

136194
#[test]

creator-keys/tests/batch_claim_dividend.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ fn test_batch_claim_exceeds_limit_reverts() {
138138
fn test_batch_claim_while_paused_fails() {
139139
let env = test_env_with_auths();
140140
let (client, _) = register_creator_keys(&env);
141-
set_pricing_and_fees(
141+
let admin = set_pricing_and_fees(
142142
&env,
143143
&client,
144144
100,
@@ -153,8 +153,6 @@ fn test_batch_claim_while_paused_fails() {
153153
let distributor = Address::generate(&env);
154154
distribute_test_dividend(&client, &creator, &distributor, 10_000);
155155

156-
let admin = Address::generate(&env);
157-
client.set_protocol_admin(&admin, &admin);
158156
client.pause(&admin);
159157

160158
let creators = Vec::from_array(&env, [creator.clone()]);

creator-keys/tests/buy_fee_split_treasury_and_creator.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ fn test_buy_splits_fees_correctly_between_treasury_and_creator() {
2626

2727
// Configure pricing and fee split: 500 bps (5%) protocol fee, 200 bps (2%) creator fee
2828
client.set_key_price(&admin, &gross_cost);
29+
client.set_protocol_admin(&admin, &admin);
2930
client.set_fee_config(&admin, &CREATOR_BPS, &PROTOCOL_BPS);
3031

3132
let protocol_recipient = soroban_sdk::Address::generate(&env);
@@ -106,6 +107,7 @@ fn test_buy_fee_split_accumulates_across_multiple_buys() {
106107
let gross_cost: i128 = 5 * STROOPS_PER_DISPLAY_UNIT; // 5 XLM = 50,000,000 stroops
107108

108109
client.set_key_price(&admin, &gross_cost);
110+
client.set_protocol_admin(&admin, &admin);
109111
client.set_fee_config(&admin, &CREATOR_BPS, &PROTOCOL_BPS);
110112

111113
let creator = register_test_creator(&env, &client, "bob");
@@ -145,6 +147,7 @@ fn test_buy_fee_split_no_stroop_rounding_error_at_odd_gross_cost() {
145147
let gross_cost: i128 = 1_234_567; // Odd stroop amount to verify integer arithmetic precision
146148

147149
client.set_key_price(&admin, &gross_cost);
150+
client.set_protocol_admin(&admin, &admin);
148151
client.set_fee_config(&admin, &CREATOR_BPS, &PROTOCOL_BPS);
149152

150153
let creator = register_test_creator(&env, &client, "carol");

creator-keys/tests/buy_quote_monotonicity.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ fn test_buy_quote_updates_after_fee_config_mutation() {
367367
let price = 1_000_i128;
368368

369369
// Set initial fee config: 90% creator, 10% protocol
370-
set_pricing_and_fees(&env, &client, price, 9000, 1000);
370+
let admin = set_pricing_and_fees(&env, &client, price, 9000, 1000);
371371
let creator = register_test_creator(&env, &client, "alice");
372372

373373
// Get quote with initial fee config
@@ -380,7 +380,6 @@ fn test_buy_quote_updates_after_fee_config_mutation() {
380380
assert_eq!(q_before.total_amount, price + 900 + 100);
381381

382382
// Update fee config: 50% creator, 50% protocol
383-
let admin = Address::generate(&env);
384383
client.set_fee_config(&admin, &5000u32, &5000u32);
385384

386385
// Get quote after fee config update

creator-keys/tests/buy_quote_stability.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod contract_test_env;
55
use contract_test_env::{
66
register_creator_keys, register_test_creator, set_pricing_and_fees, test_env_with_auths,
77
};
8-
use soroban_sdk::Vec;
8+
use soroban_sdk::{testutils::Address as _, Address, Vec};
99

1010
#[test]
1111
fn test_buy_quote_is_stable_across_multiple_calls() {
@@ -51,6 +51,9 @@ fn test_buy_quote_stability_with_different_fee_configs() {
5151
let (client, _) = register_creator_keys(&env);
5252
let creator = register_test_creator(&env, &client, "alice");
5353

54+
let admin = Address::generate(&env);
55+
client.set_protocol_admin(&admin, &admin);
56+
5457
// Test cases for different fee configurations
5558
let configs = [
5659
(1000, 9500, 500), // 5% protocol fee
@@ -59,7 +62,8 @@ fn test_buy_quote_stability_with_different_fee_configs() {
5962
];
6063

6164
for (price, c_bps, p_bps) in configs {
62-
set_pricing_and_fees(&env, &client, price, c_bps, p_bps);
65+
client.set_key_price(&admin, &price);
66+
client.set_fee_config(&admin, &c_bps, &p_bps);
6367

6468
let supply_before = client.get_creator_supply(&creator);
6569

creator-keys/tests/buy_quote_zero_supply.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ fn test_buy_quote_zero_supply_various_prices() {
4444
let env = test_env_with_auths();
4545
let (client, _) = register_creator_keys(&env);
4646

47+
let admin = set_pricing_and_fees(&env, &client, 1000, 9000, 1000);
48+
4749
let test_prices = [1, 10, 100, 500, 1000, 10000];
4850

4951
for (i, price) in test_prices.iter().enumerate() {
50-
set_pricing_and_fees(&env, &client, *price, 9000, 1000);
52+
client.set_key_price(&admin, price);
5153
let creator = register_test_creator(&env, &client, &format!("creator{}", i));
5254

5355
let quote = client.get_buy_quote(&creator);

creator-keys/tests/claim_dividend.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ fn test_double_claim_fails_with_no_claimable() {
103103
fn test_claim_dividend_while_paused_fails() {
104104
let env = test_env_with_auths();
105105
let (client, _) = register_creator_keys(&env);
106-
set_pricing_and_fees(
106+
let admin = set_pricing_and_fees(
107107
&env,
108108
&client,
109109
100,
@@ -117,8 +117,6 @@ fn test_claim_dividend_while_paused_fails() {
117117
let distributor = Address::generate(&env);
118118
distribute_test_dividend(&client, &creator, &distributor, 10_000);
119119

120-
let admin = Address::generate(&env);
121-
client.set_protocol_admin(&admin, &admin);
122120
client.pause(&admin);
123121

124122
let result = client.try_claim_dividend(&creator, &buyer);

creator-keys/tests/claimable_dividend_view.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ fn test_get_claimable_dividend_accumulates_across_distributions() {
125125
fn test_get_claimable_dividend_works_while_paused() {
126126
let env = test_env_with_auths();
127127
let (client, _) = register_creator_keys(&env);
128-
set_pricing_and_fees(
128+
let admin = set_pricing_and_fees(
129129
&env,
130130
&client,
131131
100,
@@ -139,8 +139,6 @@ fn test_get_claimable_dividend_works_while_paused() {
139139
let distributor = Address::generate(&env);
140140
distribute_test_dividend(&client, &creator, &distributor, 10_000);
141141

142-
let admin = Address::generate(&env);
143-
client.set_protocol_admin(&admin, &admin);
144142
client.pause(&admin);
145143

146144
// Read-only view must work even when protocol is paused.

0 commit comments

Comments
 (0)