@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.
- package/.turbo/turbo-build.log +236 -239
- package/.turbo/turbo-lint.log +97 -304
- package/.turbo/turbo-test.log +1986 -1766
- package/contracts/common-macros/src/rbac.rs +1 -1
- package/contracts/common-macros/src/tests/rbac.rs +123 -20
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__rbac__snapshot_authorizer_role.snap +21 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__rbac__snapshot_preserve_function_signature.snap +6 -2
- package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +1 -22
- package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +1 -3
- package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +1 -4
- package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +1 -5
- package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +0 -1
- package/contracts/macro-integration-tests/tests/ui/rbac/pass/basic.rs +9 -0
- package/contracts/oapps/counter/integration_tests/utils.rs +1 -3
- package/contracts/oapps/counter/src/tests/mod.rs +1 -17
- package/contracts/oapps/counter/src/tests/test_counter.rs +0 -2
- package/contracts/oapps/oapp/src/oapp_core.rs +5 -8
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +4 -4
- package/contracts/oapps/oapp/src/tests/mod.rs +0 -21
- package/contracts/oapps/oapp/src/tests/oapp_core.rs +0 -1
- package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +0 -1
- package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +0 -1
- package/contracts/oapps/oapp/src/tests/oapp_sender.rs +0 -1
- package/contracts/oapps/oft/integration-tests/setup.rs +1 -17
- package/contracts/oapps/oft/integration-tests/utils.rs +5 -18
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +8 -8
- package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +3 -3
- package/contracts/oapps/oft-core/integration-tests/setup.rs +1 -22
- package/contracts/oapps/oft-core/src/oft_core.rs +5 -5
- package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +3 -3
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +1 -28
- package/contracts/utils/src/rbac.rs +13 -3
- package/contracts/utils/src/tests/rbac.rs +1 -1
- package/package.json +4 -4
- package/sdk/.turbo/turbo-test.log +278 -290
- package/sdk/dist/generated/counter.d.ts +6 -6
- package/sdk/dist/generated/counter.js +6 -6
- package/sdk/dist/generated/oft.d.ts +11 -11
- package/sdk/dist/generated/oft.js +10 -10
- package/sdk/dist/generated/sac_manager.d.ts +3 -3
- package/sdk/dist/generated/sac_manager.js +3 -3
- package/sdk/package.json +1 -1
- package/sdk/test/counter-sml.test.ts +0 -18
- package/sdk/test/counter-uln.test.ts +0 -18
- 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
|
|
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
|
|
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::{
|
|
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::{
|
|
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::{
|
|
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::
|
|
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,
|
|
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
|
|
77
|
-
#[only_role(operator,
|
|
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
|
|
93
|
-
#[only_role(operator,
|
|
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
|
|
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
|
|
57
|
-
#[only_role(operator,
|
|
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,
|