@layerzerolabs/protocol-stellar-v2 0.2.48 → 0.2.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.turbo/turbo-build.log +236 -239
  2. package/.turbo/turbo-lint.log +97 -304
  3. package/.turbo/turbo-test.log +1986 -1766
  4. package/contracts/common-macros/src/rbac.rs +1 -1
  5. package/contracts/common-macros/src/tests/rbac.rs +123 -20
  6. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__rbac__snapshot_authorizer_role.snap +21 -0
  7. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__rbac__snapshot_preserve_function_signature.snap +6 -2
  8. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +1 -22
  9. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +1 -3
  10. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +1 -4
  11. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +1 -5
  12. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +0 -1
  13. package/contracts/macro-integration-tests/tests/ui/rbac/pass/basic.rs +9 -0
  14. package/contracts/oapps/counter/integration_tests/utils.rs +1 -3
  15. package/contracts/oapps/counter/src/tests/mod.rs +1 -17
  16. package/contracts/oapps/counter/src/tests/test_counter.rs +0 -2
  17. package/contracts/oapps/oapp/src/oapp_core.rs +5 -8
  18. package/contracts/oapps/oapp/src/oapp_options_type3.rs +4 -4
  19. package/contracts/oapps/oapp/src/tests/mod.rs +0 -21
  20. package/contracts/oapps/oapp/src/tests/oapp_core.rs +0 -1
  21. package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +0 -1
  22. package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +0 -1
  23. package/contracts/oapps/oapp/src/tests/oapp_sender.rs +0 -1
  24. package/contracts/oapps/oft/integration-tests/setup.rs +1 -17
  25. package/contracts/oapps/oft/integration-tests/utils.rs +5 -18
  26. package/contracts/oapps/oft/src/extensions/oft_fee.rs +8 -8
  27. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +3 -3
  28. package/contracts/oapps/oft-core/integration-tests/setup.rs +1 -22
  29. package/contracts/oapps/oft-core/src/oft_core.rs +5 -5
  30. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +3 -3
  31. package/contracts/oapps/oft-core/src/tests/test_utils.rs +1 -28
  32. package/contracts/utils/src/rbac.rs +13 -3
  33. package/contracts/utils/src/tests/rbac.rs +1 -1
  34. package/package.json +4 -4
  35. package/sdk/.turbo/turbo-test.log +278 -290
  36. package/sdk/dist/generated/counter.d.ts +6 -6
  37. package/sdk/dist/generated/counter.js +6 -6
  38. package/sdk/dist/generated/oft.d.ts +11 -11
  39. package/sdk/dist/generated/oft.js +10 -10
  40. package/sdk/dist/generated/sac_manager.d.ts +3 -3
  41. package/sdk/dist/generated/sac_manager.js +3 -3
  42. package/sdk/package.json +1 -1
  43. package/sdk/test/counter-sml.test.ts +0 -18
  44. package/sdk/test/counter-uln.test.ts +0 -18
  45. package/sdk/test/oft-sml.test.ts +0 -20
@@ -28,7 +28,7 @@ pub fn generate_role_check(args: TokenStream, input: TokenStream, require_auth:
28
28
  // Insert the role check at the beginning of the function body
29
29
  input_fn.block.stmts.insert(
30
30
  0,
31
- parse_quote!(utils::rbac::ensure_role(#env_ref, &soroban_sdk::Symbol::new(#env_ref, #role), #param_ref);),
31
+ parse_quote!(utils::rbac::ensure_role::<Self>(#env_ref, &soroban_sdk::Symbol::new(#env_ref, #role), #param_ref);),
32
32
  );
33
33
  if require_auth {
34
34
  input_fn.block.stmts.insert(1, parse_quote!(#param.require_auth();));
@@ -91,7 +91,7 @@ fn test_role_check_inserts_expected_statements_table_driven() {
91
91
  args: quote! { caller, "minter" },
92
92
  input: quote! { pub fn mint(env: &Env, caller: Address, amount: i128) {} },
93
93
  require_auth: false,
94
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
94
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
95
95
  expected_auth_stmt: None,
96
96
  expected_stmt_count: 1,
97
97
  },
@@ -100,7 +100,7 @@ fn test_role_check_inserts_expected_statements_table_driven() {
100
100
  args: quote! { caller, "minter" },
101
101
  input: quote! { pub fn mint(env: Env, caller: Address, amount: i128) {} },
102
102
  require_auth: true,
103
- expected_ensure_stmt: "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
103
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
104
104
  expected_auth_stmt: Some("caller.require_auth();"),
105
105
  expected_stmt_count: 2,
106
106
  },
@@ -109,7 +109,7 @@ fn test_role_check_inserts_expected_statements_table_driven() {
109
109
  args: quote! { caller, "minter" },
110
110
  input: quote! { pub fn mint(env: &Env, caller: Address, amount: i128) {} },
111
111
  require_auth: true,
112
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
112
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
113
113
  expected_auth_stmt: Some("caller.require_auth();"),
114
114
  expected_stmt_count: 2,
115
115
  },
@@ -118,7 +118,7 @@ fn test_role_check_inserts_expected_statements_table_driven() {
118
118
  args: quote! { account, "admin" },
119
119
  input: quote! { pub fn admin_action(env: Env, account: &Address) {} },
120
120
  require_auth: false,
121
- expected_ensure_stmt: "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,\"admin\"),account);",
121
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,\"admin\"),account);",
122
122
  expected_auth_stmt: None,
123
123
  expected_stmt_count: 1,
124
124
  },
@@ -151,26 +151,26 @@ fn test_has_role_role_arg_variants_generate_expected_symbol_new_table_driven() {
151
151
  name: "role string literal passed to Symbol::new (Env ref)",
152
152
  args: quote! { caller, "minter" },
153
153
  input: quote! { pub fn mint(env: &Env, caller: Address) {} },
154
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
154
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
155
155
  },
156
156
  Case {
157
157
  name: "role const expr passed to Symbol::new (Env ref)",
158
158
  args: quote! { caller, MINTER_ROLE },
159
159
  input: quote! { pub fn mint(env: &Env, caller: Address) {} },
160
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,MINTER_ROLE),&caller);",
160
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,MINTER_ROLE),&caller);",
161
161
  },
162
162
  Case {
163
163
  name: "role const expr passed to Symbol::new (Env owned)",
164
164
  args: quote! { caller, MINTER_ROLE },
165
165
  input: quote! { pub fn mint(env: Env, caller: Address) {} },
166
- expected_ensure_stmt: "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,MINTER_ROLE),&caller);",
166
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,MINTER_ROLE),&caller);",
167
167
  },
168
168
  Case {
169
169
  name: "role path expr passed to Symbol::new",
170
170
  args: quote! { caller, roles::MINTER_ROLE },
171
171
  input: quote! { pub fn mint(env: &Env, caller: Address) {} },
172
172
  expected_ensure_stmt:
173
- "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,roles::MINTER_ROLE),&caller);",
173
+ "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,roles::MINTER_ROLE),&caller);",
174
174
  },
175
175
  ];
176
176
 
@@ -316,32 +316,32 @@ fn test_has_role_env_variants_generate_correct_env_ref_in_ensure_role() {
316
316
  Case {
317
317
  name: "owned Env",
318
318
  input: quote! { pub fn mint(env: Env, caller: Address) {} },
319
- expected_ensure_stmt: "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
319
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
320
320
  },
321
321
  Case {
322
322
  name: "ref Env",
323
323
  input: quote! { pub fn mint(env: &Env, caller: Address) {} },
324
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
324
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
325
325
  },
326
326
  Case {
327
327
  name: "mut ref Env",
328
328
  input: quote! { pub fn mint(env: &mut Env, caller: Address) {} },
329
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
329
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
330
330
  },
331
331
  Case {
332
332
  name: "qualified owned Env",
333
333
  input: quote! { pub fn mint(env: soroban_sdk::Env, caller: Address) {} },
334
- expected_ensure_stmt: "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
334
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
335
335
  },
336
336
  Case {
337
337
  name: "qualified ref Env",
338
338
  input: quote! { pub fn mint(env: &soroban_sdk::Env, caller: Address) {} },
339
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
339
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
340
340
  },
341
341
  Case {
342
342
  name: "leading :: qualified owned Env",
343
343
  input: quote! { pub fn mint(env: ::soroban_sdk::Env, caller: Address) {} },
344
- expected_ensure_stmt: "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
344
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
345
345
  },
346
346
  ];
347
347
 
@@ -364,27 +364,27 @@ fn test_has_role_address_variants_generate_correct_param_reference() {
364
364
  Case {
365
365
  name: "Address by value -> &caller",
366
366
  input: quote! { pub fn mint(env: &Env, caller: Address) {} },
367
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
367
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
368
368
  },
369
369
  Case {
370
370
  name: "&Address -> caller",
371
371
  input: quote! { pub fn mint(env: &Env, caller: &Address) {} },
372
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),caller);",
372
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),caller);",
373
373
  },
374
374
  Case {
375
375
  name: "&mut Address -> caller",
376
376
  input: quote! { pub fn mint(env: &Env, caller: &mut Address) {} },
377
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),caller);",
377
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),caller);",
378
378
  },
379
379
  Case {
380
380
  name: "qualified Address by value",
381
381
  input: quote! { pub fn mint(env: &Env, caller: soroban_sdk::Address) {} },
382
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
382
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),&caller);",
383
383
  },
384
384
  Case {
385
385
  name: "qualified &Address",
386
386
  input: quote! { pub fn mint(env: &Env, caller: &soroban_sdk::Address) {} },
387
- expected_ensure_stmt: "utils::rbac::ensure_role(env,&soroban_sdk::Symbol::new(env,\"minter\"),caller);",
387
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,\"minter\"),caller);",
388
388
  },
389
389
  ];
390
390
 
@@ -407,7 +407,7 @@ fn test_only_role_inserts_expected_statements_and_preserves_original_body() {
407
407
  args,
408
408
  input,
409
409
  true,
410
- "utils::rbac::ensure_role(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
410
+ "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,\"minter\"),&caller);",
411
411
  Some("caller.require_auth();"),
412
412
  Some(4),
413
413
  "only_role inserts ensure_role + require_auth",
@@ -418,3 +418,106 @@ fn test_only_role_inserts_expected_statements_and_preserves_original_body() {
418
418
  let third_stmt_str = quote::quote!(#third_stmt).to_string().replace(" ", "");
419
419
  assert!(third_stmt_str.starts_with("letx=1u32;"), "expected original 'let x = 1u32;' to be preserved");
420
420
  }
421
+
422
+ // ============================================
423
+ // AUTHORIZER: snapshot test
424
+ // ============================================
425
+
426
+ #[test]
427
+ fn snapshot_authorizer_role() {
428
+ let args = quote! { operator, AUTHORIZER };
429
+ let input = quote! {
430
+ pub fn admin_action(env: Env, operator: Address) {
431
+ // admin logic
432
+ }
433
+ };
434
+
435
+ let has_role_result = crate::rbac::generate_role_check(args.clone(), input.clone(), false);
436
+ let has_role_formatted =
437
+ prettyplease::unparse(&syn::parse2::<syn::File>(has_role_result).expect("failed to parse generated code"));
438
+
439
+ let only_role_result = crate::rbac::generate_role_check(args, input, true);
440
+ let only_role_formatted =
441
+ prettyplease::unparse(&syn::parse2::<syn::File>(only_role_result).expect("failed to parse generated code"));
442
+
443
+ let combined = format!(
444
+ "// === has_role(operator, AUTHORIZER) ===\n\n{}\n\n// === only_role(operator, AUTHORIZER) ===\n\n{}",
445
+ has_role_formatted, only_role_formatted
446
+ );
447
+
448
+ insta::assert_snapshot!(combined);
449
+ }
450
+
451
+ // ============================================
452
+ // AUTHORIZER: table-driven assertion tests
453
+ // ============================================
454
+
455
+ #[test]
456
+ fn test_authorizer_role_generates_auth_check_instead_of_ensure_role() {
457
+ struct Case {
458
+ name: &'static str,
459
+ args: TokenStream,
460
+ input: TokenStream,
461
+ require_auth: bool,
462
+ expected_ensure_stmt: &'static str,
463
+ expected_auth_stmt: Option<&'static str>,
464
+ expected_stmt_count: usize,
465
+ }
466
+
467
+ let cases = vec![
468
+ Case {
469
+ name: "has_role with AUTHORIZER: Env ref + Address value",
470
+ args: quote! { operator, AUTHORIZER },
471
+ input: quote! { pub fn admin_action(env: &Env, operator: Address) {} },
472
+ require_auth: false,
473
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,AUTHORIZER),&operator);",
474
+ expected_auth_stmt: None,
475
+ expected_stmt_count: 1,
476
+ },
477
+ Case {
478
+ name: "only_role with AUTHORIZER: Env owned + Address value",
479
+ args: quote! { operator, AUTHORIZER },
480
+ input: quote! { pub fn admin_action(env: Env, operator: Address) {} },
481
+ require_auth: true,
482
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(&env,&soroban_sdk::Symbol::new(&env,AUTHORIZER),&operator);",
483
+ expected_auth_stmt: Some("operator.require_auth();"),
484
+ expected_stmt_count: 2,
485
+ },
486
+ Case {
487
+ name: "only_role with AUTHORIZER: Env ref + &Address",
488
+ args: quote! { operator, AUTHORIZER },
489
+ input: quote! { pub fn admin_action(env: &Env, operator: &Address) {} },
490
+ require_auth: true,
491
+ expected_ensure_stmt: "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,AUTHORIZER),operator);",
492
+ expected_auth_stmt: Some("operator.require_auth();"),
493
+ expected_stmt_count: 2,
494
+ },
495
+ ];
496
+
497
+ for c in cases {
498
+ assert_role_check_exact_stmts(
499
+ c.args,
500
+ c.input,
501
+ c.require_auth,
502
+ c.expected_ensure_stmt,
503
+ c.expected_auth_stmt,
504
+ Some(c.expected_stmt_count),
505
+ c.name,
506
+ );
507
+ }
508
+ }
509
+
510
+ #[test]
511
+ fn test_non_authorizer_role_still_uses_ensure_role() {
512
+ let args = quote! { caller, MINTER_ROLE };
513
+ let input = quote! { pub fn mint(env: &Env, caller: Address) {} };
514
+ assert_role_check_exact_stmts(
515
+ args,
516
+ input,
517
+ false,
518
+ "utils::rbac::ensure_role::<Self>(env,&soroban_sdk::Symbol::new(env,MINTER_ROLE),&caller);",
519
+ None,
520
+ Some(1),
521
+ "non-AUTHORIZER const still goes through ensure_role",
522
+ );
523
+ }
@@ -0,0 +1,21 @@
1
+ ---
2
+ source: contracts/common-macros/src/tests/rbac.rs
3
+ expression: combined
4
+ ---
5
+ // === has_role(operator, AUTHORIZER) ===
6
+
7
+ pub fn admin_action(env: Env, operator: Address) {
8
+ utils::rbac::ensure_role::<
9
+ Self,
10
+ >(&env, &soroban_sdk::Symbol::new(&env, AUTHORIZER), &operator);
11
+ }
12
+
13
+
14
+ // === only_role(operator, AUTHORIZER) ===
15
+
16
+ pub fn admin_action(env: Env, operator: Address) {
17
+ utils::rbac::ensure_role::<
18
+ Self,
19
+ >(&env, &soroban_sdk::Symbol::new(&env, AUTHORIZER), &operator);
20
+ operator.require_auth();
21
+ }
@@ -5,13 +5,17 @@ expression: combined
5
5
  // === has_role ===
6
6
 
7
7
  pub fn mint(env: Env, caller: Address, amount: i128) {
8
- utils::rbac::ensure_role(&env, &soroban_sdk::Symbol::new(&env, "minter"), &caller);
8
+ utils::rbac::ensure_role::<
9
+ Self,
10
+ >(&env, &soroban_sdk::Symbol::new(&env, "minter"), &caller);
9
11
  }
10
12
 
11
13
 
12
14
  // === only_role ===
13
15
 
14
16
  pub fn mint(env: Env, caller: Address, amount: i128) {
15
- utils::rbac::ensure_role(&env, &soroban_sdk::Symbol::new(&env, "minter"), &caller);
17
+ utils::rbac::ensure_role::<
18
+ Self,
19
+ >(&env, &soroban_sdk::Symbol::new(&env, "minter"), &caller);
16
20
  caller.require_auth();
17
21
  }
@@ -1,12 +1,7 @@
1
1
  use endpoint_v2::Origin;
2
- use oapp::oapp_core::OAPP_MANAGER_ROLE;
3
2
  use oapp::oapp_receiver::LzReceiveInternal;
4
3
  use oapp_macros::oapp;
5
- use soroban_sdk::{
6
- contractimpl, symbol_short,
7
- testutils::{MockAuth, MockAuthInvoke},
8
- Address, Bytes, BytesN, Env, IntoVal, Symbol,
9
- };
4
+ use soroban_sdk::{contractimpl, symbol_short, Address, Bytes, BytesN, Env};
10
5
 
11
6
  mod oapp_core;
12
7
  mod options_type3;
@@ -49,19 +44,3 @@ impl TestOApp {
49
44
  env.storage().instance().get(&symbol_short!("lzr_c")).unwrap_or(false)
50
45
  }
51
46
  }
52
-
53
- /// Grants `OAPP_MANAGER_ROLE` to `owner` via the public `grant_role` interface.
54
- /// Call after `init()` in tests that exercise RBAC-protected entrypoints.
55
- pub fn grant_oapp_admin(env: &Env, contract: &Address, owner: &Address) {
56
- let role = Symbol::new(env, OAPP_MANAGER_ROLE);
57
- env.mock_auths(&[MockAuth {
58
- address: owner,
59
- invoke: &MockAuthInvoke {
60
- contract,
61
- fn_name: "grant_role",
62
- args: (owner, &role, owner).into_val(env),
63
- sub_invokes: &[],
64
- },
65
- }]);
66
- utils::rbac::RoleBasedAccessControlClient::new(env, contract).grant_role(owner, &role, owner);
67
- }
@@ -1,6 +1,6 @@
1
1
  // Runtime tests: OAppCore behavior generated by `#[oapp]`.
2
2
 
3
- use super::{grant_oapp_admin, TestOApp, TestOAppClient};
3
+ use super::{TestOApp, TestOAppClient};
4
4
  use oapp::oapp_core::{OAppCoreStorage, PeerSet};
5
5
  use soroban_sdk::{
6
6
  contract, contractimpl,
@@ -64,7 +64,6 @@ fn set_peer_requires_auth_and_updates_storage() {
64
64
  let owner = Address::generate(&env);
65
65
  let endpoint = Address::generate(&env);
66
66
  client.init(&owner, &endpoint);
67
- grant_oapp_admin(&env, &contract_id, &owner);
68
67
 
69
68
  let eid: u32 = 101;
70
69
  let peer = Some(BytesN::<32>::from_array(&env, &[7u8; 32]));
@@ -129,7 +128,6 @@ fn set_delegate_requires_auth_and_updates_endpoint() {
129
128
 
130
129
  let owner = Address::generate(&env);
131
130
  client.init(&owner, &endpoint_id);
132
- grant_oapp_admin(&env, &contract_id, &owner);
133
131
 
134
132
  // Unauthorized set should fail.
135
133
  let delegate = Some(Address::generate(&env));
@@ -1,6 +1,6 @@
1
1
  // Runtime tests: OAppOptionsType3 defaults generated by `#[oapp]`.
2
2
 
3
- use super::{grant_oapp_admin, TestOApp, TestOAppClient};
3
+ use super::{TestOApp, TestOAppClient};
4
4
  use oapp::oapp_options_type3::{EnforcedOptionParam, EnforcedOptionSet};
5
5
  use oapp::OAppError;
6
6
  use soroban_sdk::{
@@ -28,7 +28,6 @@ fn enforced_options_lifecycle_and_auth() {
28
28
 
29
29
  let owner = Address::generate(&env);
30
30
  client.init(&owner, &Address::generate(&env));
31
- grant_oapp_admin(&env, &contract_id, &owner);
32
31
 
33
32
  // Unset returns None (storage default).
34
33
  assert_eq!(client.enforced_options(&999, &999), None);
@@ -83,7 +82,6 @@ fn set_enforced_options_rejects_invalid_option_type() {
83
82
 
84
83
  let owner = Address::generate(&env);
85
84
  client.init(&owner, &Address::generate(&env));
86
- grant_oapp_admin(&env, &contract_id, &owner);
87
85
 
88
86
  // wrong type header (not 3)
89
87
  let mut invalid = Bytes::from_array(&env, &(4u16).to_be_bytes());
@@ -112,7 +110,6 @@ fn combine_options_behavior_and_validation() {
112
110
 
113
111
  let owner = Address::generate(&env);
114
112
  client.init(&owner, &Address::generate(&env));
115
- grant_oapp_admin(&env, &contract_id, &owner);
116
113
 
117
114
  // No enforced => returns extra (including empty).
118
115
  let extra_only = create_valid_options(&env, &[9, 10, 11]);
@@ -1,6 +1,6 @@
1
1
  // Runtime tests: OAppReceiver defaults generated by `#[oapp]`.
2
2
 
3
- use super::{grant_oapp_admin, TestOApp, TestOAppClient};
3
+ use super::{TestOApp, TestOAppClient};
4
4
  use endpoint_v2::Origin;
5
5
  use oapp::OAppError;
6
6
  use soroban_sdk::{
@@ -87,7 +87,6 @@ fn allow_initialize_path_follows_peer_configuration() {
87
87
  let owner = Address::generate(&env);
88
88
  let endpoint = Address::generate(&env);
89
89
  client.init(&owner, &endpoint);
90
- grant_oapp_admin(&env, &contract_id, &owner);
91
90
 
92
91
  let eid: u32 = REMOTE_EID_FOR_ALLOW_INIT;
93
92
  let sender = BytesN::<32>::from_array(&env, &[3u8; 32]);
@@ -141,7 +140,6 @@ fn lz_receive_clears_payload_transfers_value_and_calls_internal_handler() {
141
140
  let oapp = env.register(TestOApp, ());
142
141
  let oapp_client = TestOAppClient::new(&env, &oapp);
143
142
  oapp_client.init(&owner, &endpoint);
144
- grant_oapp_admin(&env, &oapp, &owner);
145
143
 
146
144
  // Configure peer so peer check passes.
147
145
  let peer = BytesN::<32>::from_array(&env, &[9u8; 32]);
@@ -228,7 +226,6 @@ fn lz_receive_wrong_peer_returns_only_peer() {
228
226
  let oapp = env.register(TestOApp, ());
229
227
  let oapp_client = TestOAppClient::new(&env, &oapp);
230
228
  oapp_client.init(&owner, &endpoint);
231
- grant_oapp_admin(&env, &oapp, &owner);
232
229
 
233
230
  // Set peer to some value...
234
231
  let configured_peer = BytesN::<32>::from_array(&env, &[7u8; 32]);
@@ -315,7 +312,6 @@ fn lz_receive_requires_executor_auth() {
315
312
  let oapp = env.register(TestOApp, ());
316
313
  let oapp_client = TestOAppClient::new(&env, &oapp);
317
314
  oapp_client.init(&owner, &endpoint);
318
- grant_oapp_admin(&env, &oapp, &owner);
319
315
 
320
316
  // Configure peer so we fail specifically at executor.require_auth().
321
317
  let peer = BytesN::<32>::from_array(&env, &[7u8; 32]);
@@ -211,7 +211,6 @@ fn setup() -> Setup {
211
211
  let oapp = env.register(TestOAppSender, ());
212
212
  let client = TestOAppSenderClient::new(&env, &oapp);
213
213
  client.init(&owner, &endpoint);
214
- super::grant_oapp_admin(&env, &oapp, &owner);
215
214
 
216
215
  Setup { env, owner, token_admin, native_token, zro_token, endpoint, oapp }
217
216
  }
@@ -6,12 +6,21 @@
6
6
  // - Verifies role argument can be a literal or const expression.
7
7
 
8
8
  use soroban_sdk::{contract, Address, Env};
9
+ use utils::{auth::Auth, rbac::RoleBasedAccessControl};
9
10
 
10
11
  const MINTER_ROLE: &str = "minter";
11
12
 
12
13
  #[contract]
13
14
  pub struct MyContract;
14
15
 
16
+ impl Auth for MyContract {
17
+ fn authorizer(_env: &Env) -> Option<Address> {
18
+ None
19
+ }
20
+ }
21
+
22
+ impl RoleBasedAccessControl for MyContract {}
23
+
15
24
  impl MyContract {
16
25
  // Env by reference, Address by value, role literal.
17
26
  #[common_macros::has_role(caller, "minter")]
@@ -2,7 +2,7 @@
2
2
 
3
3
  extern crate std;
4
4
 
5
- use crate::{codec::MsgType, counter::CounterClient, tests::{grant_oapp_admin, mint_to}};
5
+ use crate::{codec::MsgType, counter::CounterClient, tests::mint_to};
6
6
  use endpoint_v2::{EndpointV2Client, MessagingFee, Origin, OutboundPacket};
7
7
  use message_lib_common::packet_codec_v1;
8
8
  use soroban_sdk::{
@@ -63,8 +63,6 @@ pub fn register_library(env: &Env, owner: &Address, endpoint: &EndpointV2Client<
63
63
 
64
64
  /// Sets the peer address for a counter on a destination EID.
65
65
  pub fn set_peer(env: &Env, owner: &Address, counter: &CounterClient<'_>, dst_eid: u32, peer: &BytesN<32>) {
66
- grant_oapp_admin(env, &counter.address, owner);
67
-
68
66
  let peer_option = Some(peer.clone());
69
67
  env.mock_auths(&[MockAuth {
70
68
  address: owner,
@@ -1,8 +1,7 @@
1
- use oapp::oapp_core::OAPP_MANAGER_ROLE;
2
1
  use soroban_sdk::{
3
2
  testutils::{MockAuth, MockAuthInvoke},
4
3
  token::StellarAssetClient,
5
- Address, Env, IntoVal, Symbol,
4
+ Address, Env, IntoVal,
6
5
  };
7
6
 
8
7
  pub mod test_codec;
@@ -23,18 +22,3 @@ pub fn mint_to(env: &Env, owner: &Address, native_token: &Address, to: &Address,
23
22
  let sac = StellarAssetClient::new(env, native_token);
24
23
  sac.mint(to, &amount);
25
24
  }
26
-
27
- pub fn grant_oapp_admin(env: &Env, contract: &Address, owner: &Address) {
28
- let role = Symbol::new(env, OAPP_MANAGER_ROLE);
29
- env.mock_auths(&[MockAuth {
30
- address: owner,
31
- invoke: &MockAuthInvoke {
32
- contract,
33
- fn_name: "grant_role",
34
- args: (owner, &role, owner).into_val(env),
35
- sub_invokes: &[],
36
- },
37
- }]);
38
- utils::rbac::RoleBasedAccessControlClient::new(env, contract).grant_role(owner, &role, owner);
39
- }
40
-
@@ -88,8 +88,6 @@ fn setup<'a>() -> TestSetup<'a> {
88
88
  }
89
89
 
90
90
  fn setup_mock_peer(env: &Env, owner: &Address, counter: &CounterClient<'_>, dst_eid: u32) -> BytesN<32> {
91
- super::grant_oapp_admin(env, &counter.address, owner);
92
-
93
91
  let peer = BytesN::from_array(env, &[1u8; 32]);
94
92
  let peer_option = Some(peer.clone());
95
93
  env.mock_auths(&[MockAuth {
@@ -5,12 +5,9 @@ use soroban_sdk::{contractevent, Address, BytesN, Env};
5
5
  use utils::{
6
6
  option_ext::OptionExt,
7
7
  ownable::{Ownable, OwnableInitializer},
8
- rbac::RoleBasedAccessControl,
8
+ rbac::{RoleBasedAccessControl, AUTHORIZER},
9
9
  };
10
10
 
11
- /// Role for OApp administrative actions (set_peer, set_delegate, set_enforced_options).
12
- pub const OAPP_MANAGER_ROLE: &str = "OAPP_MANAGER_ROLE";
13
-
14
11
  // =====================================================
15
12
  // OAppCore Storage and Events
16
13
  // =====================================================
@@ -73,8 +70,8 @@ pub trait OAppCore: Ownable + RoleBasedAccessControl {
73
70
  /// # Arguments
74
71
  /// * `eid` - The endpoint ID
75
72
  /// * `peer` - The address of the peer to be associated with the corresponding endpoint, or None to remove the peer
76
- /// * `operator` - The address that must have OAPP_MANAGER_ROLE
77
- #[only_role(operator, OAPP_MANAGER_ROLE)]
73
+ /// * `operator` - The authorizer address
74
+ #[only_role(operator, AUTHORIZER)]
78
75
  fn set_peer(
79
76
  env: &soroban_sdk::Env,
80
77
  eid: u32,
@@ -89,8 +86,8 @@ pub trait OAppCore: Ownable + RoleBasedAccessControl {
89
86
  ///
90
87
  /// # Arguments
91
88
  /// * `delegate` - The address of the delegate to be set, or None to remove the delegate
92
- /// * `operator` - The address that must have OAPP_MANAGER_ROLE
93
- #[only_role(operator, OAPP_MANAGER_ROLE)]
89
+ /// * `operator` - The authorizer address
90
+ #[only_role(operator, AUTHORIZER)]
94
91
  fn set_delegate(env: &soroban_sdk::Env, delegate: &Option<soroban_sdk::Address>, operator: &soroban_sdk::Address) {
95
92
  endpoint_client::<Self>(env).set_delegate(&env.current_contract_address(), delegate);
96
93
  }
@@ -1,7 +1,7 @@
1
- use crate::{self as oapp, errors::OAppError, oapp_core::OAPP_MANAGER_ROLE};
1
+ use crate::{self as oapp, errors::OAppError};
2
2
  use common_macros::{contract_trait, only_role, storage};
3
3
  use soroban_sdk::{assert_with_error, contractevent, contracttype, panic_with_error, Bytes, Env, Vec};
4
- use utils::{buffer_reader::BufferReader, rbac::RoleBasedAccessControl};
4
+ use utils::{buffer_reader::BufferReader, rbac::{RoleBasedAccessControl, AUTHORIZER}};
5
5
 
6
6
  pub const OPTION_TYPE3: u16 = 3;
7
7
 
@@ -53,8 +53,8 @@ pub trait OAppOptionsType3: RoleBasedAccessControl {
53
53
  ///
54
54
  /// # Arguments
55
55
  /// * `options` - A vector of EnforcedOptionParam structures specifying enforced options
56
- /// * `operator` - The address that must have OAPP_MANAGER_ROLE
57
- #[only_role(operator, OAPP_MANAGER_ROLE)]
56
+ /// * `operator` - The authorizer address
57
+ #[only_role(operator, AUTHORIZER)]
58
58
  fn set_enforced_options(
59
59
  env: &soroban_sdk::Env,
60
60
  options: &soroban_sdk::Vec<oapp::oapp_options_type3::EnforcedOptionParam>,
@@ -3,24 +3,3 @@ mod oapp_options_type3;
3
3
  mod oapp_receiver;
4
4
  mod oapp_sender;
5
5
  mod test_macros;
6
-
7
- use crate::oapp_core::OAPP_MANAGER_ROLE;
8
- use soroban_sdk::{
9
- testutils::{MockAuth, MockAuthInvoke},
10
- Address, Env, IntoVal, Symbol,
11
- };
12
-
13
- /// Grants `OAPP_MANAGER_ROLE` to `owner` via the public `grant_role` interface.
14
- pub(super) fn grant_oapp_admin(env: &Env, contract: &Address, owner: &Address) {
15
- let role = Symbol::new(env, OAPP_MANAGER_ROLE);
16
- env.mock_auths(&[MockAuth {
17
- address: owner,
18
- invoke: &MockAuthInvoke {
19
- contract,
20
- fn_name: "grant_role",
21
- args: (owner, &role, owner).into_val(env),
22
- sub_invokes: &[],
23
- },
24
- }]);
25
- utils::rbac::RoleBasedAccessControlClient::new(env, contract).grant_role(owner, &role, owner);
26
- }
@@ -76,7 +76,6 @@ fn setup<'a>() -> TestSetup<'a> {
76
76
  let oapp = env.register(DummyOApp, (&owner, &endpoint));
77
77
  soroban_sdk::log!(&env, "oapp: {}", oapp);
78
78
  let oapp_client = DummyOAppClient::new(&env, &oapp);
79
- super::grant_oapp_admin(&env, &oapp, &owner);
80
79
 
81
80
  TestSetup { env, owner, endpoint, oapp_client }
82
81
  }
@@ -77,7 +77,6 @@ fn setup<'a>() -> TestSetup<'a> {
77
77
  let delegate = owner.clone();
78
78
  let oapp = env.register(DummyOAppOptionsType3, (&owner, &endpoint, &delegate));
79
79
  let oapp_client = DummyOAppOptionsType3Client::new(&env, &oapp);
80
- super::grant_oapp_admin(&env, &oapp, &owner);
81
80
 
82
81
  TestSetup { env, owner, oapp_client }
83
82
  }
@@ -96,7 +96,6 @@ fn setup<'a>() -> TestSetup<'a> {
96
96
  let endpoint = env.register(MockEndpoint, (&native_token,));
97
97
  let oapp = env.register(DummyOAppReceiver, (&owner, &endpoint));
98
98
  let oapp_client = DummyOAppReceiverClient::new(&env, &oapp);
99
- super::grant_oapp_admin(&env, &oapp, &owner);
100
99
 
101
100
  TestSetup { env, owner, endpoint, token_admin, native_token, native_token_admin_client, oapp_client }
102
101
  }
@@ -153,7 +153,6 @@ fn setup<'a>() -> TestSetup<'a> {
153
153
  // Deploy OApp
154
154
  let oapp = env.register(DummyOAppSender, (&owner, &endpoint));
155
155
  let oapp_client = DummyOAppSenderClient::new(&env, &oapp);
156
- super::grant_oapp_admin(&env, &oapp, &owner);
157
156
 
158
157
  TestSetup {
159
158
  env,