Skip to content

Commit cc9ad96

Browse files
authored
Merge pull request #74 from khaadish/fix/creatorAddressdInitialization
fix(sweep-controller): store creator address during initialization
2 parents 31eaf14 + 133c0d1 commit cc9ad96

3 files changed

Lines changed: 74 additions & 70 deletions

File tree

contracts/reserve_contract/src/storage.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ pub enum DataKey {
3333
/// * `amount` – Base reserve in stroops. Must already be validated as
3434
/// positive by the caller.
3535
pub fn set_base_reserve(env: &Env, amount: i128) {
36-
env.storage()
37-
.instance()
38-
.set(&DataKey::BaseReserve, &amount);
36+
env.storage().instance().set(&DataKey::BaseReserve, &amount);
3937
}
4038

4139
/// Read the base reserve amount from contract storage.

contracts/sweep_controller/src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ impl SweepController {
2828
/// Returns Error::AuthorizationFailed if called more than once
2929
pub fn initialize(
3030
env: Env,
31+
creator: Address,
3132
authorized_signer: BytesN<32>,
3233
authorized_destination: Option<Address>,
3334
) -> Result<(), Error> {
@@ -36,11 +37,9 @@ impl SweepController {
3637
return Err(Error::AuthorizationFailed);
3738
}
3839

39-
// Store the creator address
40-
// In Soroban SDK 22.0.0, we need to pass creator as a parameter
41-
// For now, we'll use the contract address as a placeholder
42-
// TODO: Update to accept creator as parameter if needed
43-
let creator = env.current_contract_address();
40+
// Require the creator to authorize this initialization
41+
creator.require_auth();
42+
4443
storage::set_creator(&env, &creator);
4544

4645
// Store the authorized signer public key

contracts/sweep_controller/tests/integration.rs

Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
#![cfg(test)]
22

3-
use ephemeral_account::{AccountStatus, EphemeralAccountContract, EphemeralAccountContractClient};
3+
use ephemeral_account::{EphemeralAccountContract, EphemeralAccountContractClient};
44
use soroban_sdk::{testutils::Address as _, Address, BytesN, Env};
5-
use sweep_controller::Error;
65
use sweep_controller::{SweepController, SweepControllerClient};
76

87
/// Helper function to generate a valid Ed25519 keypair for testing
98
/// In a real scenario, these would be generated by the off-chain system
10-
fn generate_test_keypair() -> (BytesN<32>, BytesN<64>) {
11-
// For testing purposes, we use predefined test vectors
12-
// Public key (32 bytes) - this is what gets stored in the contract
9+
fn generate_test_keypair(env: &Env) -> (BytesN<32>, BytesN<64>) {
1310
let public_key = BytesN::from_array(
14-
&Env::default(),
11+
env,
1512
&[
1613
0x30, 0xd4, 0x18, 0x9f, 0x87, 0x6e, 0xda, 0x97, 0x42, 0xa2, 0x55, 0x14, 0x87, 0x43,
1714
0xd9, 0x24, 0x9d, 0xf4, 0x12, 0x02, 0x7b, 0x0d, 0xb5, 0x47, 0x69, 0xe9, 0x18, 0xd3,
1815
0x6f, 0x25, 0x9d, 0x3c,
1916
],
2017
);
21-
22-
// For testing, we'll generate test signatures using environment's crypto functions
23-
let dummy_signature = BytesN::from_array(&Env::default(), &[0u8; 64]);
24-
18+
let dummy_signature = BytesN::from_array(env, &[0u8; 64]);
2519
(public_key, dummy_signature)
2620
}
2721

@@ -31,13 +25,14 @@ fn test_initialize_sweep_controller() {
3125
let env = Env::default();
3226
env.mock_all_auths();
3327

34-
let controller_id = env.register_contract(None, SweepController);
28+
let creator = Address::generate(&env);
29+
let controller_id = env.register(SweepController, ());
3530
let controller_client = SweepControllerClient::new(&env, &controller_id);
3631

37-
let (authorized_signer, _) = generate_test_keypair();
32+
let (authorized_signer, _) = generate_test_keypair(&env);
3833

3934
// Initialize controller with authorized signer (flexible mode - no destination)
40-
controller_client.initialize(&authorized_signer, &None);
35+
controller_client.initialize(&creator, &authorized_signer, &None);
4136
}
4237

4338
/// Test that re-initialization is prevented
@@ -46,17 +41,18 @@ fn test_initialize_prevents_double_init() {
4641
let env = Env::default();
4742
env.mock_all_auths();
4843

49-
let controller_id = env.register_contract(None, SweepController);
44+
let creator = Address::generate(&env);
45+
let controller_id = env.register(SweepController, ());
5046
let controller_client = SweepControllerClient::new(&env, &controller_id);
5147

52-
let (authorized_signer, _) = generate_test_keypair();
48+
let (authorized_signer, _) = generate_test_keypair(&env);
5349

5450
// First initialization should succeed
55-
controller_client.initialize(&authorized_signer, &None);
51+
controller_client.initialize(&creator, &authorized_signer, &None);
5652

5753
// Second initialization should fail
5854
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
59-
controller_client.initialize(&authorized_signer, &None);
55+
controller_client.initialize(&creator, &authorized_signer, &None);
6056
}));
6157
assert!(result.is_err());
6258
}
@@ -67,15 +63,16 @@ fn test_execute_sweep_with_valid_signature() {
6763
let env = Env::default();
6864
env.mock_all_auths();
6965

66+
let creator = Address::generate(&env);
7067
// Deploy and initialize controller
71-
let controller_id = env.register_contract(None, SweepController);
68+
let controller_id = env.register(SweepController, ());
7269
let controller_client = SweepControllerClient::new(&env, &controller_id);
7370

74-
let (authorized_signer, _) = generate_test_keypair();
75-
controller_client.initialize(&authorized_signer, &None);
71+
let (authorized_signer, _) = generate_test_keypair(&env);
72+
controller_client.initialize(&creator, &authorized_signer, &None);
7673

7774
// Deploy ephemeral account
78-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
75+
let ephemeral_id = env.register(EphemeralAccountContract, ());
7976
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
8077

8178
// Setup
@@ -109,15 +106,16 @@ fn test_execute_sweep_with_valid_signature() {
109106
fn test_execute_sweep_with_invalid_signature() {
110107
let env = Env::default();
111108

109+
let creator = Address::generate(&env);
112110
// Deploy and initialize controller
113-
let controller_id = env.register_contract(None, SweepController);
111+
let controller_id = env.register(SweepController, ());
114112
let controller_client = SweepControllerClient::new(&env, &controller_id);
115113

116-
let (authorized_signer, _) = generate_test_keypair();
117-
controller_client.initialize(&authorized_signer, &None);
114+
let (authorized_signer, _) = generate_test_keypair(&env);
115+
controller_client.initialize(&creator, &authorized_signer, &None);
118116

119117
// Deploy ephemeral account
120-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
118+
let ephemeral_id = env.register(EphemeralAccountContract, ());
121119
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
122120

123121
// Setup
@@ -155,10 +153,10 @@ fn test_sweep_without_payment() {
155153
let env = Env::default();
156154
env.mock_all_auths();
157155

158-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
156+
let ephemeral_id = env.register(EphemeralAccountContract, ());
159157
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
160158

161-
let controller_id = env.register_contract(None, SweepController);
159+
let controller_id = env.register(SweepController, ());
162160
let controller_client = SweepControllerClient::new(&env, &controller_id);
163161

164162
let creator = Address::generate(&env);
@@ -180,12 +178,13 @@ fn test_nonce_increment_prevents_replay() {
180178
let env = Env::default();
181179
env.mock_all_auths();
182180

181+
let creator = Address::generate(&env);
183182
// Deploy and initialize controller
184-
let controller_id = env.register_contract(None, SweepController);
183+
let controller_id = env.register(SweepController, ());
185184
let controller_client = SweepControllerClient::new(&env, &controller_id);
186185

187-
let (authorized_signer, _) = generate_test_keypair();
188-
controller_client.initialize(&authorized_signer, &None);
186+
let (authorized_signer, _) = generate_test_keypair(&env);
187+
controller_client.initialize(&creator, &authorized_signer, &None);
189188

190189
// The nonce system is in place and will be incremented after each successful
191190
// authorization, making the same signature invalid for the next sweep operation
@@ -198,10 +197,10 @@ fn test_can_sweep() {
198197
let env = Env::default();
199198
env.mock_all_auths();
200199

201-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
200+
let ephemeral_id = env.register(EphemeralAccountContract, ());
202201
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
203202

204-
let controller_id = env.register_contract(None, SweepController);
203+
let controller_id = env.register(SweepController, ());
205204
let controller_client = SweepControllerClient::new(&env, &controller_id);
206205

207206
let creator = Address::generate(&env);
@@ -231,12 +230,13 @@ fn test_wrong_signer_rejected() {
231230
let env = Env::default();
232231
env.mock_all_auths();
233232

233+
let creator = Address::generate(&env);
234234
// Deploy and initialize controller with authorized signer
235-
let controller_id = env.register_contract(None, SweepController);
235+
let controller_id = env.register(SweepController, ());
236236
let controller_client = SweepControllerClient::new(&env, &controller_id);
237237

238-
let (authorized_signer, _) = generate_test_keypair();
239-
controller_client.initialize(&authorized_signer, &None);
238+
let (authorized_signer, _) = generate_test_keypair(&env);
239+
controller_client.initialize(&creator, &authorized_signer, &None);
240240

241241
// Generate a different public key (wrong signer)
242242
let wrong_signer = BytesN::from_array(
@@ -249,7 +249,7 @@ fn test_wrong_signer_rejected() {
249249
);
250250

251251
// Deploy ephemeral account
252-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
252+
let ephemeral_id = env.register(EphemeralAccountContract, ());
253253
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
254254

255255
// Setup
@@ -280,11 +280,11 @@ fn test_unauthorized_signer_not_set() {
280280
env.mock_all_auths();
281281

282282
// Deploy controller without initialization
283-
let controller_id = env.register_contract(None, SweepController);
283+
let controller_id = env.register(SweepController, ());
284284
let controller_client = SweepControllerClient::new(&env, &controller_id);
285285

286286
// Deploy ephemeral account
287-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
287+
let ephemeral_id = env.register(EphemeralAccountContract, ());
288288
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
289289

290290
// Setup
@@ -314,14 +314,15 @@ fn test_initialize_with_authorized_destination() {
314314
let env = Env::default();
315315
env.mock_all_auths();
316316

317-
let controller_id = env.register_contract(None, SweepController);
317+
let controller_id = env.register(SweepController, ());
318318
let controller_client = SweepControllerClient::new(&env, &controller_id);
319319

320-
let (authorized_signer, _) = generate_test_keypair();
320+
let creator = Address::generate(&env);
321+
let (authorized_signer, _) = generate_test_keypair(&env);
321322
let authorized_dest = Address::generate(&env);
322323

323324
// Initialize controller with authorized destination
324-
controller_client.initialize(&authorized_signer, &Some(authorized_dest.clone()));
325+
controller_client.initialize(&creator, &authorized_signer, &Some(authorized_dest.clone()));
325326
}
326327

327328
/// Test initialization without authorized destination (flexible mode)
@@ -330,13 +331,14 @@ fn test_initialize_without_authorized_destination() {
330331
let env = Env::default();
331332
env.mock_all_auths();
332333

333-
let controller_id = env.register_contract(None, SweepController);
334+
let creator = Address::generate(&env);
335+
let controller_id = env.register(SweepController, ());
334336
let controller_client = SweepControllerClient::new(&env, &controller_id);
335337

336-
let (authorized_signer, _) = generate_test_keypair();
338+
let (authorized_signer, _) = generate_test_keypair(&env);
337339

338340
// Initialize controller without authorized destination (flexible mode)
339-
controller_client.initialize(&authorized_signer, &None);
341+
controller_client.initialize(&creator, &authorized_signer, &None);
340342
}
341343

342344
/// Test sweep to authorized destination (success)
@@ -346,15 +348,16 @@ fn test_sweep_to_authorized_destination() {
346348
env.mock_all_auths();
347349

348350
// Deploy and initialize controller
349-
let controller_id = env.register_contract(None, SweepController);
351+
let controller_id = env.register(SweepController, ());
350352
let controller_client = SweepControllerClient::new(&env, &controller_id);
351353

352-
let (authorized_signer, _) = generate_test_keypair();
354+
let creator = Address::generate(&env);
355+
let (authorized_signer, _) = generate_test_keypair(&env);
353356
let authorized_dest = Address::generate(&env);
354-
controller_client.initialize(&authorized_signer, &Some(authorized_dest.clone()));
357+
controller_client.initialize(&creator, &authorized_signer, &Some(authorized_dest.clone()));
355358

356359
// Deploy ephemeral account
357-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
360+
let ephemeral_id = env.register(EphemeralAccountContract, ());
358361
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
359362

360363
// Setup
@@ -385,16 +388,17 @@ fn test_sweep_to_unauthorized_destination() {
385388
env.mock_all_auths();
386389

387390
// Deploy and initialize controller
388-
let controller_id = env.register_contract(None, SweepController);
391+
let controller_id = env.register(SweepController, ());
389392
let controller_client = SweepControllerClient::new(&env, &controller_id);
390393

391-
let (authorized_signer, _) = generate_test_keypair();
394+
let creator = Address::generate(&env);
395+
let (authorized_signer, _) = generate_test_keypair(&env);
392396
let authorized_dest = Address::generate(&env);
393397
let unauthorized_dest = Address::generate(&env);
394-
controller_client.initialize(&authorized_signer, &Some(authorized_dest.clone()));
398+
controller_client.initialize(&creator, &authorized_signer, &Some(authorized_dest.clone()));
395399

396400
// Deploy ephemeral account
397-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
401+
let ephemeral_id = env.register(EphemeralAccountContract, ());
398402
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
399403

400404
// Setup
@@ -425,15 +429,16 @@ fn test_update_authorized_destination_by_creator() {
425429
let env = Env::default();
426430
env.mock_all_auths();
427431

428-
let controller_id = env.register_contract(None, SweepController);
432+
let controller_id = env.register(SweepController, ());
429433
let controller_client = SweepControllerClient::new(&env, &controller_id);
430434

431-
let (authorized_signer, _) = generate_test_keypair();
435+
let creator = Address::generate(&env);
436+
let (authorized_signer, _) = generate_test_keypair(&env);
432437
let initial_dest = Address::generate(&env);
433438
let new_dest = Address::generate(&env);
434439

435440
// Initialize with authorized destination
436-
controller_client.initialize(&authorized_signer, &Some(initial_dest.clone()));
441+
controller_client.initialize(&creator, &authorized_signer, &Some(initial_dest.clone()));
437442

438443
// Update destination as creator (with mocked auth) - should succeed
439444
controller_client.update_authorized_destination(&new_dest);
@@ -446,16 +451,17 @@ fn test_update_authorized_destination_by_non_creator() {
446451
let env = Env::default();
447452
// Don't mock auths - we want to test that non-creator fails
448453

449-
let controller_id = env.register_contract(None, SweepController);
454+
let controller_id = env.register(SweepController, ());
450455
let controller_client = SweepControllerClient::new(&env, &controller_id);
451456

452-
let (authorized_signer, _) = generate_test_keypair();
457+
let creator = Address::generate(&env);
458+
let (authorized_signer, _) = generate_test_keypair(&env);
453459
let initial_dest = Address::generate(&env);
454460
let new_dest = Address::generate(&env);
455461

456462
// Initialize with authorized destination
457463
// The invoker of initialize becomes the creator
458-
controller_client.initialize(&authorized_signer, &Some(initial_dest.clone()));
464+
controller_client.initialize(&creator, &authorized_signer, &Some(initial_dest.clone()));
459465

460466
// Try to update destination - should fail because current invoker != creator
461467
// (In tests, the invoker is typically the contract itself or test framework)
@@ -473,22 +479,23 @@ fn test_update_destination_before_sweep() {
473479
let env = Env::default();
474480
env.mock_all_auths();
475481

476-
let controller_id = env.register_contract(None, SweepController);
482+
let controller_id = env.register(SweepController, ());
477483
let controller_client = SweepControllerClient::new(&env, &controller_id);
478484

479-
let (authorized_signer, _) = generate_test_keypair();
485+
let creator = Address::generate(&env);
486+
let (authorized_signer, _) = generate_test_keypair(&env);
480487
let initial_dest = Address::generate(&env);
481488
let new_dest = Address::generate(&env);
482489

483490
// Initialize with authorized destination
484-
controller_client.initialize(&authorized_signer, &Some(initial_dest.clone()));
491+
controller_client.initialize(&creator, &authorized_signer, &Some(initial_dest.clone()));
485492

486493
// Update destination before any sweep - should succeed
487494
controller_client.update_authorized_destination(&new_dest);
488495

489496
// Verify the destination was updated by trying to sweep to new destination
490497
// (The actual sweep may fail due to signature, but destination validation should pass)
491-
let ephemeral_id = env.register_contract(None, EphemeralAccountContract);
498+
let ephemeral_id = env.register(EphemeralAccountContract, ());
492499
let ephemeral_client = EphemeralAccountContractClient::new(&env, &ephemeral_id);
493500

494501
let creator = Address::generate(&env);

0 commit comments

Comments
 (0)