Skip to content

Commit 3a4832b

Browse files
authored
Merge branch 'main' into fix/102-single-inbound-payment
2 parents ddb9799 + 07cae76 commit 3a4832b

4 files changed

Lines changed: 76 additions & 9 deletions

File tree

contracts/ephemeral_account/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ impl EphemeralAccountContract {
3636
creator: Address,
3737
expiry_ledger: u32,
3838
recovery_address: Address,
39+
authorized_controller: Address,
40+
relayer: Address,
3941
authorized_signer: BytesN<32>,
4042
min_amount: i128,
4143
) -> Result<(), Error> {
@@ -62,6 +64,8 @@ impl EphemeralAccountContract {
6264
storage::set_expiry_ledger(&env, expiry_ledger);
6365
storage::set_recovery_address(&env, &recovery_address);
6466
storage::set_status(&env, AccountStatus::Active);
67+
storage::set_authorized_controller(&env, &authorized_controller);
68+
storage::set_relayer(&env, &relayer);
6569
storage::set_authorized_signer(&env, &authorized_signer);
6670
storage::set_min_payment_amount(&env, min_amount);
6771
storage::init_reserve_tracking(&env, BASE_RESERVE_STROOPS);

contracts/ephemeral_account/src/storage.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ pub enum DataKey {
2020
/// Ed25519 public key (32 bytes) that must sign sweep authorizations.
2121
AuthorizedSigner,
2222
ContractVersion,
23+
/// Relayer address authorized to call record_payment().
24+
Relayer,
2325
MinPaymentAmount,
2426
}
2527

@@ -247,3 +249,12 @@ pub fn set_authorized_signer(env: &Env, signer: &BytesN<32>) {
247249
pub fn get_authorized_signer(env: &Env) -> Option<BytesN<32>> {
248250
env.storage().instance().get(&DataKey::AuthorizedSigner)
249251
}
252+
253+
// Relayer — the only address authorized to call record_payment()
254+
pub fn set_relayer(env: &Env, relayer: &Address) {
255+
env.storage().instance().set(&DataKey::Relayer, relayer);
256+
}
257+
258+
pub fn get_relayer(env: &Env) -> Option<Address> {
259+
env.storage().instance().get(&DataKey::Relayer)
260+
}

contracts/ephemeral_account/src/test.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ mod test {
2424
let client = EphemeralAccountContractClient::new(&env, &contract_id);
2525
let creator = Address::generate(&env);
2626
let recovery = Address::generate(&env);
27+
let controller = Address::generate(&env);
28+
let relayer = Address::generate(&env);
29+
let expiry_ledger = env.ledger().sequence() + 1000;
30+
31+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
2732
let signer = test_signer_pubkey(&env);
2833
let expiry_ledger = env.ledger().sequence() + 1000;
2934

@@ -43,6 +48,11 @@ mod test {
4348
let client = EphemeralAccountContractClient::new(&env, &contract_id);
4449
let creator = Address::generate(&env);
4550
let recovery = Address::generate(&env);
51+
let controller = Address::generate(&env);
52+
let relayer = Address::generate(&env);
53+
let expiry_ledger = env.ledger().sequence() + 1000;
54+
55+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
4656
let signer = test_signer_pubkey(&env);
4757
let expiry_ledger = env.ledger().sequence() + 1000;
4858
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &1i128);
@@ -56,6 +66,12 @@ mod test {
5666
let client = EphemeralAccountContractClient::new(&env, &contract_id);
5767
let creator = Address::generate(&env);
5868
let recovery = Address::generate(&env);
69+
let controller = Address::generate(&env);
70+
let relayer = Address::generate(&env);
71+
let asset = Address::generate(&env);
72+
let expiry_ledger = env.ledger().sequence() + 1000;
73+
74+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
5975
let signer = test_signer_pubkey(&env);
6076
let asset = Address::generate(&env);
6177
let expiry_ledger = env.ledger().sequence() + 1000;
@@ -75,6 +91,8 @@ mod test {
7591
let client = EphemeralAccountContractClient::new(&env, &contract_id);
7692
let creator = Address::generate(&env);
7793
let recovery = Address::generate(&env);
94+
let controller = Address::generate(&env);
95+
let relayer = Address::generate(&env);
7896
let signer = test_signer_pubkey(&env);
7997
let asset1 = Address::generate(&env);
8098
let asset2 = Address::generate(&env);
@@ -93,11 +111,14 @@ mod test {
93111
let client = EphemeralAccountContractClient::new(&env, &contract_id);
94112
let creator = Address::generate(&env);
95113
let recovery = Address::generate(&env);
114+
let controller = Address::generate(&env);
115+
let relayer = Address::generate(&env);
96116
let signer = test_signer_pubkey(&env);
97117
let asset = Address::generate(&env);
98118
let destination = Address::generate(&env);
99119
let expiry_ledger = env.ledger().sequence() + 1000;
100120

121+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
101122
client.initialize(&creator, &expiry_ledger, &recovery, &signer, &1i128);
102123
client.record_payment(&100, &asset);
103124
let auth_sig = BytesN::from_array(&env, &[0u8; 64]);
@@ -122,6 +143,12 @@ mod test {
122143
let client = EphemeralAccountContractClient::new(&env, &contract_id);
123144
let creator = Address::generate(&env);
124145
let recovery = Address::generate(&env);
146+
let controller = Address::generate(&env);
147+
let relayer = Address::generate(&env);
148+
let destination = Address::generate(&env);
149+
let expiry_ledger = env.ledger().sequence() + 1000;
150+
151+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
125152
let signer = test_signer_pubkey(&env);
126153
let destination = Address::generate(&env);
127154
let expiry_ledger = env.ledger().sequence() + 1000;
@@ -151,6 +178,8 @@ mod test {
151178
let client = EphemeralAccountContractClient::new(&env, &contract_id);
152179
let creator = Address::generate(&env);
153180
let recovery = Address::generate(&env);
181+
let controller = Address::generate(&env);
182+
let relayer = Address::generate(&env);
154183
let signer = test_signer_pubkey(&env);
155184
let destination = Address::generate(&env);
156185
let asset = Address::generate(&env);
@@ -179,11 +208,14 @@ mod test {
179208
let client = EphemeralAccountContractClient::new(&env, &contract_id);
180209
let creator = Address::generate(&env);
181210
let recovery = Address::generate(&env);
211+
let controller = Address::generate(&env);
212+
let relayer = Address::generate(&env);
182213
let signer = test_signer_pubkey(&env);
183214
let destination = Address::generate(&env);
184215
let asset = Address::generate(&env);
185216
let expiry_ledger = env.ledger().sequence() + 1000;
186217

218+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
187219
client.initialize(&creator, &expiry_ledger, &recovery, &signer, &1i128);
188220
client.record_payment(&100, &asset);
189221
let initial_available = 250_000_000i128;
@@ -231,10 +263,13 @@ mod test {
231263

232264
let creator = Address::generate(&env);
233265
let recovery = Address::generate(&env);
266+
let controller = Address::generate(&env);
267+
let relayer = Address::generate(&env);
234268
let signer = test_signer_pubkey(&env);
235269
let asset1 = Address::generate(&env);
236270
let expiry_ledger = env.ledger().sequence() + 1;
237271

272+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
238273
client.initialize(&creator, &expiry_ledger, &recovery, &signer, &1i128);
239274

240275
// Single payment with MAX amount — no overflow possible with one payment
@@ -257,6 +292,8 @@ mod test {
257292
let client = EphemeralAccountContractClient::new(&env, &contract_id);
258293
let creator = Address::generate(&env);
259294
let recovery = Address::generate(&env);
295+
let controller = Address::generate(&env);
296+
let relayer = Address::generate(&env);
260297
let signer = test_signer_pubkey(&env);
261298
let destination = Address::generate(&env);
262299
let asset = Address::generate(&env);
@@ -286,6 +323,12 @@ mod test {
286323
let client = EphemeralAccountContractClient::new(&env, &contract_id);
287324
let creator = Address::generate(&env);
288325
let recovery = Address::generate(&env);
326+
let controller = Address::generate(&env);
327+
let relayer = Address::generate(&env);
328+
let asset = Address::generate(&env);
329+
let expiry_ledger = env.ledger().sequence() + 10;
330+
331+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
289332
let signer = test_signer_pubkey(&env);
290333
let asset = Address::generate(&env);
291334
let expiry_ledger = env.ledger().sequence() + 10;
@@ -312,6 +355,11 @@ mod test {
312355
let client = EphemeralAccountContractClient::new(&env, &contract_id);
313356
let creator = Address::generate(&env);
314357
let recovery = Address::generate(&env);
358+
let controller = Address::generate(&env);
359+
let relayer = Address::generate(&env);
360+
let expiry_ledger = env.ledger().sequence() + 1000;
361+
362+
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &relayer);
315363
let signer = test_signer_pubkey(&env);
316364
let expiry_ledger = env.ledger().sequence() + 1000;
317365
client.initialize(&creator, &expiry_ledger, &recovery, &controller, &1i128);
@@ -370,6 +418,8 @@ mod test {
370418
let client = EphemeralAccountContractClient::new(&env, &contract_id);
371419
let creator = Address::generate(&env);
372420
let recovery = Address::generate(&env);
421+
let controller = Address::generate(&env);
422+
let relayer = Address::generate(&env);
373423
let signer = test_signer_pubkey(&env);
374424
let asset = Address::generate(&env);
375425
let destination = Address::generate(&env);
@@ -394,6 +444,8 @@ mod test {
394444

395445
let creator = Address::generate(&env);
396446
let recovery = Address::generate(&env);
447+
let controller = Address::generate(&env);
448+
let relayer = Address::generate(&env);
397449
let signer = test_signer_pubkey(&env);
398450

399451
// Advance ledger so we can clearly pass a past expiry

contracts/sweep_controller/tests/integration.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ fn test_execute_sweep_with_valid_signature() {
8383
let expiry = env.ledger().sequence() + 1000;
8484

8585
// Initialize ephemeral account, authorizing this SweepController to call sweep()
86-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
86+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
8787

8888
// Record payment
8989
ephemeral_client.record_payment(&100, &asset);
@@ -128,7 +128,7 @@ fn test_execute_sweep_with_invalid_signature() {
128128
let expiry = env.ledger().sequence() + 1000;
129129

130130
// Initialize ephemeral account, authorizing this SweepController to call sweep()
131-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
131+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
132132

133133
// Record payment
134134
ephemeral_client.record_payment(&100, &asset);
@@ -167,7 +167,7 @@ fn test_sweep_without_payment() {
167167
let expiry = env.ledger().sequence() + 1000;
168168

169169
// Initialize but don't record payment
170-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
170+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
171171

172172
// Should panic - no payment received
173173
let auth_sig = BytesN::from_array(&env, &[0u8; 64]);
@@ -211,7 +211,7 @@ fn test_can_sweep() {
211211
let expiry = env.ledger().sequence() + 1000;
212212

213213
// Initialize, authorizing this SweepController to call sweep()
214-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
214+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
215215

216216
// Should return false without payment
217217
assert!(!controller_client.can_sweep(&ephemeral_id));
@@ -259,7 +259,7 @@ fn test_wrong_signer_rejected() {
259259
let expiry = env.ledger().sequence() + 1000;
260260

261261
// Initialize ephemeral account, authorizing this SweepController to call sweep()
262-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
262+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
263263

264264
// Record payment
265265
ephemeral_client.record_payment(&100, &asset);
@@ -296,7 +296,7 @@ fn test_unauthorized_signer_not_set() {
296296
let expiry = env.ledger().sequence() + 1000;
297297

298298
// Initialize ephemeral account, authorizing this (uninitialized) SweepController to call sweep()
299-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
299+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
300300

301301
// Record payment
302302
ephemeral_client.record_payment(&100, &asset);
@@ -373,7 +373,7 @@ fn test_sweep_to_authorized_destination() {
373373
let expiry = env.ledger().sequence() + 1000;
374374

375375
// Initialize ephemeral account, authorizing this SweepController to call sweep()
376-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
376+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
377377

378378
// Record payment
379379
ephemeral_client.record_payment(&100, &asset);
@@ -419,7 +419,7 @@ fn test_sweep_to_unauthorized_destination() {
419419
let expiry = env.ledger().sequence() + 1000;
420420

421421
// Initialize ephemeral account, authorizing this SweepController to call sweep()
422-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
422+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
423423

424424
// Record payment
425425
ephemeral_client.record_payment(&100, &asset);
@@ -514,7 +514,7 @@ fn test_update_destination_before_sweep() {
514514
let asset = Address::generate(&env);
515515
let expiry = env.ledger().sequence() + 1000;
516516

517-
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id);
517+
ephemeral_client.initialize(&creator, &expiry, &recovery, &controller_id, &Address::generate(&env));
518518
ephemeral_client.record_payment(&100, &asset);
519519

520520
let auth_sig = BytesN::from_array(&env, &[1u8; 64]);

0 commit comments

Comments
 (0)