From ca8926447840bd4e00bb758647408850efb4005f Mon Sep 17 00:00:00 2001 From: gospeltout Date: Sat, 29 Aug 2026 22:59:21 +0100 Subject: [PATCH] fix: close unauthenticated admin claim in set_admin --- context/progress-tracker.md | 10 + contracts/creditline-contract/src/tests.rs | 2 +- contracts/deployed-testnet.json | 2 +- contracts/reputation-contract/README.md | 3 +- contracts/reputation-contract/src/errors.rs | 1 + contracts/reputation-contract/src/lib.rs | 53 +++--- contracts/reputation-contract/src/storage.rs | 5 + contracts/reputation-contract/src/tests.rs | 189 ++++++++++++++----- scripts/deploy-testnet.sh | 5 +- 9 files changed, 191 insertions(+), 79 deletions(-) diff --git a/context/progress-tracker.md b/context/progress-tracker.md index efbe7ca..1fa9d41 100644 --- a/context/progress-tracker.md +++ b/context/progress-tracker.md @@ -16,6 +16,16 @@ Update this file after every completed contract change, fix, or architectural de ## Completed +### Security: Close Unauthenticated Admin-Claim Branch in Reputation `set_admin()` +- **Problem:** `set_admin()` in `contracts/reputation-contract/src/lib.rs` contained an unauthenticated fallback branch when no admin was stored, allowing anyone to claim admin of the reputation contract without authorization. +- **Fix (`reputation-contract`):** + - Added explicit, one-time `initialize(env, admin) -> Result<(), ReputationError>` function that requires `admin.require_auth()` and checks `storage::has_admin(&env)` (rejects re-initialization with `AlreadyInitialized = 11`). + - Updated `set_admin(env, new_admin) -> Result<(), ReputationError>` to fetch `old_admin = storage::get_admin(&env)?` (panics/returns `NotInitialized` when uninitialized) and enforce `old_admin.require_auth()` + `access::require_admin(&env, &old_admin)`. + - Added `has_admin(env)` in `storage.rs`. + - Added `AlreadyInitialized` error variant in `errors.rs`. + - Added new unit tests covering: unauthenticated first-time `set_admin` rejection (`NotInitialized`), single authorized `initialize`, double initialization rejection (`AlreadyInitialized`), unauthenticated `initialize` rejection, and end-to-end updater flow preservation. + - Updated test setup in `reputation-contract/src/tests.rs` and `creditline-contract/src/tests.rs` (`RealIntegrationCtx`), deployment script (`scripts/deploy-testnet.sh`), deployment metadata (`contracts/deployed-testnet.json`), and contract documentation (`contracts/reputation-contract/README.md`). + ### `approve_loan` Pending Loan Funding & Re-Validation Fix - **Problem:** `approve_loan()` previously activated pending loans without validating vendor status, checking reputation score, or checking available pool liquidity, and without calling `fund_loan()` on the liquidity pool to lock contribution funds or transferring funds to the vendor. - **Fix (`creditline-contract`):** diff --git a/contracts/creditline-contract/src/tests.rs b/contracts/creditline-contract/src/tests.rs index b5edbe7..c60d276 100644 --- a/contracts/creditline-contract/src/tests.rs +++ b/contracts/creditline-contract/src/tests.rs @@ -2557,7 +2557,7 @@ impl RealIntegrationCtx { let creditline: CreditLineContractClient<'static> = unsafe { core::mem::transmute(creditline) }; - reputation.set_admin(&admin); + reputation.initialize(&admin); reputation.set_updater(&admin, &admin, &true); reputation.set_updater(&admin, &creditline_id, &true); diff --git a/contracts/deployed-testnet.json b/contracts/deployed-testnet.json index bb87a3a..d59a325 100644 --- a/contracts/deployed-testnet.json +++ b/contracts/deployed-testnet.json @@ -20,7 +20,7 @@ "id": "CC3BO57ZRJGA63QJBIBSOMI25Z3X2I5CYTARYRAUXUAILX6L3OWBL5SB", "initialized": true, "initializedAt": "2026-05-11", - "initMethod": "set_admin(new_admin)", + "initMethod": "initialize(admin)", "wasmHash": "548ad3c1e0bca85a7adccb883879ed02e6bf93970d8af06ac8506d487a115da4" }, "vendorRegistry": { diff --git a/contracts/reputation-contract/README.md b/contracts/reputation-contract/README.md index 4faf020..8b93b48 100644 --- a/contracts/reputation-contract/README.md +++ b/contracts/reputation-contract/README.md @@ -28,7 +28,8 @@ The Reputation Contract provides a decentralized way to track and update user re - `set_score(updater: Address, user: Address, new_score: u32)` - Set a user's score to a specific value (requires updater auth) ### Admin Operations -- `set_admin(new_admin: Address)` - Set the admin address (requires current admin auth or initialization) +- `initialize(admin: Address)` - Initialize the contract with an admin (requires admin auth, can only be called once) +- `set_admin(new_admin: Address)` - Transfer admin to a new address (requires current admin auth) - `get_admin() -> Address` - Get the current admin address ### Updater Operations diff --git a/contracts/reputation-contract/src/errors.rs b/contracts/reputation-contract/src/errors.rs index 09376fd..3ab33d7 100644 --- a/contracts/reputation-contract/src/errors.rs +++ b/contracts/reputation-contract/src/errors.rs @@ -15,4 +15,5 @@ pub enum ReputationError { UpgradeNotProposed = 8, UpgradeTimelockNotMet = 9, UpgradeHashMismatch = 10, + AlreadyInitialized = 11, } diff --git a/contracts/reputation-contract/src/lib.rs b/contracts/reputation-contract/src/lib.rs index 3b557be..f6eb2f3 100644 --- a/contracts/reputation-contract/src/lib.rs +++ b/contracts/reputation-contract/src/lib.rs @@ -184,28 +184,39 @@ impl ReputationContract { .unwrap_or_else(|err| soroban_sdk::panic_with_error!(&env, err)) } - /// Set the admin address for this contract - /// Requires authorization from current admin (or allows initial setup) - pub fn set_admin(env: Env, new_admin: Address) { - let old_admin_opt: Option
= env.storage().instance().get(&storage::ADMIN_KEY); - - if let Some(old_admin) = old_admin_opt { - // Admin exists, require current admin authorization - old_admin.require_auth(); - access::require_admin(&env, &old_admin); - - Self::enter_non_reentrant(&env); - - storage::set_admin(&env, &new_admin); - events::emit_admin_changed(&env, &old_admin, &new_admin); - - Self::exit_non_reentrant(&env); - } else { - // No admin exists, allow setting (initialization) - storage::set_admin(&env, &new_admin); - let dummy = new_admin.clone(); - events::emit_admin_changed(&env, &dummy, &new_admin); + /// Initialize the contract with an admin. Can only be called once. + /// Requires authorization from admin. + pub fn initialize(env: Env, admin: Address) -> Result<(), ReputationError> { + admin.require_auth(); + + if storage::has_admin(&env) { + return Err(ReputationError::AlreadyInitialized); } + + Self::enter_non_reentrant(&env); + + storage::set_admin(&env, &admin); + events::emit_admin_changed(&env, &admin, &admin); + + Self::exit_non_reentrant(&env); + Ok(()) + } + + /// Set the admin address for this contract + /// Requires authorization from current admin + pub fn set_admin(env: Env, new_admin: Address) -> Result<(), ReputationError> { + let old_admin = storage::get_admin(&env)?; + + old_admin.require_auth(); + access::require_admin(&env, &old_admin); + + Self::enter_non_reentrant(&env); + + storage::set_admin(&env, &new_admin); + events::emit_admin_changed(&env, &old_admin, &new_admin); + + Self::exit_non_reentrant(&env); + Ok(()) } pub fn set_parameters_contract(env: Env, address: Address) { diff --git a/contracts/reputation-contract/src/storage.rs b/contracts/reputation-contract/src/storage.rs index b153df2..3461f5b 100644 --- a/contracts/reputation-contract/src/storage.rs +++ b/contracts/reputation-contract/src/storage.rs @@ -17,6 +17,11 @@ pub fn get_admin(env: &Env) -> Result { .ok_or(ReputationError::NotInitialized) } +/// Check if an admin is set in storage +pub fn has_admin(env: &Env) -> bool { + env.storage().instance().has(&ADMIN_KEY) +} + /// Set the admin address in storage pub fn set_admin(env: &Env, admin: &Address) { env.storage().instance().set(&ADMIN_KEY, admin); diff --git a/contracts/reputation-contract/src/tests.rs b/contracts/reputation-contract/src/tests.rs index 9c83019..53a0e9e 100644 --- a/contracts/reputation-contract/src/tests.rs +++ b/contracts/reputation-contract/src/tests.rs @@ -17,7 +17,7 @@ fn it_sets_admin() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let retrieved_admin = client.get_admin(); assert_eq!(retrieved_admin, admin); @@ -46,7 +46,7 @@ fn it_gets_admin() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let retrieved = client.get_admin(); assert_eq!(retrieved, admin); @@ -62,7 +62,7 @@ fn it_sets_updater() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -80,7 +80,7 @@ fn it_checks_updater() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); let non_updater = Address::generate(&env); @@ -101,7 +101,7 @@ fn it_gets_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -124,7 +124,7 @@ fn it_increases_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -147,7 +147,7 @@ fn it_decreases_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -170,7 +170,7 @@ fn it_sets_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -193,7 +193,7 @@ fn it_adds_boost() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -215,7 +215,7 @@ fn it_removes_boost() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -239,7 +239,7 @@ fn it_prevents_unauthorized_updates() { let admin = Address::generate(&env); env.mock_all_auths(); - client.set_admin(&admin); + client.initialize(&admin); let user = Address::generate(&env); let unauthorized = Address::generate(&env); @@ -258,7 +258,7 @@ fn it_enforces_score_bounds() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -299,7 +299,7 @@ fn it_allows_admin_upgrade_and_bumps_version() { let contract_id = env.register(ReputationContract, ()); let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); assert_eq!(client.get_version(), 1u32); let wasm_hash = env.deployer().upload_contract_wasm(soroban_sdk::Bytes::from_slice( @@ -331,7 +331,7 @@ fn test_reputation_upgrade_without_propose_fails() { let contract_id = env.register(ReputationContract, ()); let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let wasm_hash = soroban_sdk::BytesN::from_array(&env, &[1u8; 32]); client.upgrade(&wasm_hash); @@ -346,7 +346,7 @@ fn test_reputation_upgrade_before_timelock_elapses_fails() { let contract_id = env.register(ReputationContract, ()); let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let wasm_hash = soroban_sdk::BytesN::from_array(&env, &[1u8; 32]); client.propose_upgrade(&wasm_hash); @@ -362,7 +362,7 @@ fn test_reputation_upgrade_with_wrong_hash_fails() { let contract_id = env.register(ReputationContract, ()); let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let wasm_hash1 = soroban_sdk::BytesN::from_array(&env, &[1u8; 32]); let wasm_hash2 = soroban_sdk::BytesN::from_array(&env, &[2u8; 32]); @@ -382,7 +382,7 @@ fn it_revokes_updater_access_after_removal() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -408,7 +408,7 @@ fn it_emits_event_on_updater_removal() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -428,7 +428,7 @@ fn it_handles_removing_non_existent_updater() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let never_added = Address::generate(&env); @@ -447,7 +447,7 @@ fn it_prevents_overflow_on_increase() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -468,7 +468,7 @@ fn it_prevents_overflow_at_max() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -488,7 +488,7 @@ fn it_allows_increase_up_to_max() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -510,7 +510,7 @@ fn it_prevents_underflow_on_decrease() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -531,7 +531,7 @@ fn it_prevents_underflow_at_min() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -551,7 +551,7 @@ fn it_allows_decrease_down_to_min() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -573,7 +573,7 @@ fn it_removing_one_updater_does_not_affect_others() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater1 = Address::generate(&env); let updater2 = Address::generate(&env); @@ -604,7 +604,7 @@ fn it_emits_score_changed_event_on_increase() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -650,7 +650,7 @@ fn it_emits_score_changed_event_on_decrease() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -701,7 +701,7 @@ fn it_emits_score_changed_event_on_set() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -749,7 +749,7 @@ fn it_emits_updater_changed_event_on_grant() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); @@ -788,7 +788,7 @@ fn it_emits_updater_changed_event_on_revoke() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -828,7 +828,7 @@ fn it_emits_admin_changed_event() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let new_admin = Address::generate(&env); @@ -868,7 +868,7 @@ fn it_emits_admin_changed_event_on_initial_setup() { let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let events: Vec<(Address, Vec, Val)> = env.events().all(); @@ -892,6 +892,91 @@ fn it_emits_admin_changed_event_on_initial_setup() { assert!(found_event, "ADMINCHGD event not found"); } +// ============================================================================ +// Initialization Security Tests +// ============================================================================ + +#[test] +fn test_unauthenticated_first_time_set_admin_fails() { + let env = Env::default(); + let contract_id = env.register(ReputationContract, ()); + let client = ReputationContractClient::new(&env, &contract_id); + + let new_admin = Address::generate(&env); + assert_eq!( + client.try_set_admin(&new_admin), + Err(Ok(ReputationError::NotInitialized)) + ); +} + +#[test] +fn test_initialize_works_once_with_auth() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = env.register(ReputationContract, ()); + let client = ReputationContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + assert_eq!(client.initialize(&admin), ()); + assert_eq!(client.get_admin(), admin); +} + +#[test] +fn test_second_initialize_fails() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = env.register(ReputationContract, ()); + let client = ReputationContractClient::new(&env, &contract_id); + + let admin1 = Address::generate(&env); + client.initialize(&admin1); + + let admin2 = Address::generate(&env); + assert_eq!( + client.try_initialize(&admin2), + Err(Ok(ReputationError::AlreadyInitialized)) + ); +} + +#[test] +fn test_initialize_requires_auth() { + let env = Env::default(); + let contract_id = env.register(ReputationContract, ()); + let client = ReputationContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + let res = client.try_initialize(&admin); + assert!(res.is_err()); +} + +#[test] +fn test_updater_flows_end_to_end_after_initialization() { + let env = Env::default(); + env.mock_all_auths(); + + let contract_id = env.register(ReputationContract, ()); + let client = ReputationContractClient::new(&env, &contract_id); + + let admin = Address::generate(&env); + client.initialize(&admin); + + let updater = Address::generate(&env); + client.set_updater(&admin, &updater, &true); + assert!(client.is_updater(&updater)); + + let user = Address::generate(&env); + client.set_score(&updater, &user, &50); + assert_eq!(client.get_score(&user), 50); + + client.increase_score(&updater, &user, &20); + assert_eq!(client.get_score(&user), 70); + + client.decrease_score(&updater, &user, &10); + assert_eq!(client.get_score(&user), 60); +} + // ============================================================================ // Admin Succession Tests (Feature #14) // ============================================================================ @@ -909,7 +994,7 @@ fn it_supports_admin_succession() { let admin2 = Address::generate(&env); let admin3 = Address::generate(&env); - client.set_admin(&admin1); + client.initialize(&admin1); assert_eq!(client.get_admin(), admin1); client.set_admin(&admin2); @@ -933,7 +1018,7 @@ fn it_allows_admin_to_set_same_admin() { let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); assert_eq!(client.get_admin(), admin); client.set_admin(&admin); @@ -956,7 +1041,7 @@ fn it_preserves_user_scores_during_admin_changes() { let admin1 = Address::generate(&env); let admin2 = Address::generate(&env); - client.set_admin(&admin1); + client.initialize(&admin1); let updater = Address::generate(&env); client.set_updater(&admin1, &updater, &true); @@ -993,7 +1078,7 @@ fn it_preserves_updater_permissions_during_admin_changes() { let admin1 = Address::generate(&env); let admin2 = Address::generate(&env); - client.set_admin(&admin1); + client.initialize(&admin1); let updater1 = Address::generate(&env); let updater2 = Address::generate(&env); @@ -1031,7 +1116,7 @@ fn it_revokes_old_admin_permissions_completely() { let admin2 = Address::generate(&env); env.mock_all_auths(); - client.set_admin(&admin1); + client.initialize(&admin1); client.set_admin(&admin2); assert_eq!(client.get_admin(), admin2); @@ -1054,7 +1139,7 @@ fn it_grants_new_admin_full_permissions() { let admin1 = Address::generate(&env); let admin2 = Address::generate(&env); - client.set_admin(&admin1); + client.initialize(&admin1); client.set_admin(&admin2); let updater = Address::generate(&env); @@ -1083,7 +1168,7 @@ fn it_allows_zero_increase_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1107,7 +1192,7 @@ fn it_allows_zero_decrease_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1135,7 +1220,7 @@ fn test_reentrancy_guard_rejects_reentrant_increase_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1163,7 +1248,7 @@ fn test_reentrancy_guard_rejects_reentrant_decrease_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1190,7 +1275,7 @@ fn test_reentrancy_guard_rejects_reentrant_set_score() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1216,7 +1301,7 @@ fn test_reentrancy_guard_rejects_reentrant_add_boost() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1243,7 +1328,7 @@ fn test_reentrancy_guard_rejects_reentrant_remove_boost() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1270,7 +1355,7 @@ fn test_reentrancy_guard_rejects_reentrant_set_updater() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); @@ -1293,7 +1378,7 @@ fn test_reentrancy_guard_rejects_reentrant_set_admin() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let new_admin = Address::generate(&env); @@ -1316,7 +1401,7 @@ fn test_reentrancy_guard_allows_normal_operations() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1358,7 +1443,7 @@ fn test_reentrancy_guard_is_released_after_call() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1383,7 +1468,7 @@ fn it_allows_setting_score_to_current_value() { let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let updater = Address::generate(&env); client.set_updater(&admin, &updater, &true); @@ -1431,7 +1516,7 @@ fn test_reputation_upgrade_delay_parameterized_via_parameters_contract() { let contract_id = env.register(ReputationContract, ()); let client = ReputationContractClient::new(&env, &contract_id); let admin = Address::generate(&env); - client.set_admin(&admin); + client.initialize(&admin); let params_id = env.register(MockParametersContract, ()); client.set_parameters_contract(¶ms_id); diff --git a/scripts/deploy-testnet.sh b/scripts/deploy-testnet.sh index da82dce..0c64dc1 100755 --- a/scripts/deploy-testnet.sh +++ b/scripts/deploy-testnet.sh @@ -106,9 +106,8 @@ stellar contract invoke --id $PARAMETERS_ID --source $SOURCE --network $NETWORK -- initialize_defaults --admin $SOURCE 2>&1 | tail -1 echo "Initializing reputation..." -# reputation has no `initialize` — first set_admin call (no prior admin) seeds it. stellar contract invoke --id $REPUTATION_ID --source $SOURCE --network $NETWORK \ - -- set_admin --new_admin $ADMIN_PUBKEY 2>&1 | tail -1 + -- initialize --admin $ADMIN_PUBKEY 2>&1 | tail -1 echo "Initializing vendor_registry..." stellar contract invoke --id $VENDOR_REGISTRY_ID --source $SOURCE --network $NETWORK \ @@ -180,7 +179,7 @@ cat > contracts/deployed-testnet.json << JSONEOF "id": "$REPUTATION_ID", "initialized": true, "initializedAt": "$TODAY", - "initMethod": "set_admin(new_admin)" + "initMethod": "initialize(admin)" }, "vendorRegistry": { "id": "$VENDOR_REGISTRY_ID",