@layerzerolabs/protocol-stellar-v2 0.2.8 → 0.2.10

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 (239) hide show
  1. package/.turbo/turbo-build.log +443 -302
  2. package/.turbo/turbo-lint.log +118 -96
  3. package/.turbo/turbo-test.log +853 -731
  4. package/Cargo.lock +120 -37
  5. package/Cargo.toml +8 -5
  6. package/contracts/common-macros/src/contract_impl.rs +44 -0
  7. package/contracts/common-macros/src/lib.rs +86 -40
  8. package/contracts/common-macros/src/ownable.rs +24 -32
  9. package/contracts/common-macros/src/storage.rs +95 -120
  10. package/contracts/common-macros/src/tests/contract_impl.rs +289 -0
  11. package/contracts/common-macros/src/tests/mod.rs +9 -0
  12. package/contracts/common-macros/src/tests/ownable.rs +151 -0
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +85 -0
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +30 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap +9 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +1072 -0
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +45 -0
  18. package/contracts/common-macros/src/tests/storage.rs +485 -0
  19. package/contracts/common-macros/src/tests/test_helpers.rs +93 -0
  20. package/contracts/common-macros/src/tests/ttl_configurable.rs +34 -0
  21. package/contracts/common-macros/src/ttl_configurable.rs +31 -14
  22. package/contracts/common-macros/src/utils.rs +27 -0
  23. package/contracts/endpoint-v2/ARCHITECTURE.md +4 -4
  24. package/contracts/endpoint-v2/src/endpoint_v2.rs +18 -15
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +2 -3
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +5 -3
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +2 -2
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  29. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +4 -4
  30. package/contracts/endpoint-v2/src/lib.rs +6 -5
  31. package/contracts/endpoint-v2/src/message_lib_manager.rs +14 -6
  32. package/contracts/endpoint-v2/src/messaging_channel.rs +6 -2
  33. package/contracts/endpoint-v2/src/messaging_composer.rs +6 -2
  34. package/contracts/endpoint-v2/src/storage.rs +10 -7
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +16 -16
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +46 -46
  37. package/contracts/endpoint-v2/src/tests/mock.rs +2 -2
  38. package/contracts/endpoint-v2/src/util.rs +8 -2
  39. package/contracts/message-libs/block-message-lib/Cargo.toml +1 -0
  40. package/contracts/message-libs/block-message-lib/src/lib.rs +5 -5
  41. package/contracts/message-libs/message-lib-common/src/errors.rs +8 -8
  42. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +0 -1
  43. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +3 -3
  44. package/contracts/message-libs/message-lib-common/src/lib.rs +0 -2
  45. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +4 -6
  46. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +2 -2
  47. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +11 -11
  48. package/contracts/message-libs/message-lib-common/src/worker_options.rs +10 -16
  49. package/contracts/message-libs/simple-message-lib/src/errors.rs +0 -4
  50. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +49 -34
  51. package/contracts/message-libs/simple-message-lib/src/storage.rs +3 -7
  52. package/contracts/message-libs/simple-message-lib/src/test.rs +3 -3
  53. package/contracts/message-libs/treasury/src/storage.rs +1 -2
  54. package/contracts/message-libs/treasury/src/tests/setup.rs +3 -2
  55. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +0 -13
  56. package/contracts/message-libs/treasury/src/treasury.rs +18 -21
  57. package/contracts/message-libs/uln-302/Cargo.toml +1 -0
  58. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +4 -4
  59. package/contracts/message-libs/uln-302/src/interfaces/{receive.rs → receive_uln.rs} +3 -3
  60. package/contracts/message-libs/uln-302/src/interfaces/{send.rs → send_uln.rs} +8 -80
  61. package/contracts/message-libs/uln-302/src/lib.rs +5 -4
  62. package/contracts/message-libs/uln-302/src/{receive.rs → receive_uln.rs} +20 -12
  63. package/contracts/message-libs/uln-302/src/{send.rs → send_uln.rs} +19 -13
  64. package/contracts/message-libs/uln-302/src/storage.rs +1 -2
  65. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +3 -2
  66. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +30 -30
  67. package/contracts/message-libs/uln-302/src/tests/setup.rs +12 -11
  68. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +1 -1
  69. package/contracts/message-libs/uln-302/src/{config_validation.rs → types.rs} +79 -11
  70. package/contracts/message-libs/uln-302/src/uln302.rs +15 -10
  71. package/contracts/oapp-macros/Cargo.toml +2 -8
  72. package/contracts/oapp-macros/src/lib.rs +57 -311
  73. package/contracts/oapp-macros/src/oapp_core.rs +23 -32
  74. package/contracts/oapp-macros/src/oapp_full.rs +8 -2
  75. package/contracts/oapp-macros/src/oapp_options_type3.rs +21 -36
  76. package/contracts/oapp-macros/src/oapp_receiver.rs +38 -57
  77. package/contracts/oapp-macros/src/oapp_sender.rs +12 -14
  78. package/contracts/oapp-macros/src/util.rs +14 -10
  79. package/contracts/oapps/counter/Cargo.toml +2 -1
  80. package/contracts/oapps/counter/integration_tests/utils.rs +4 -4
  81. package/contracts/oapps/counter/src/codec.rs +8 -9
  82. package/contracts/oapps/counter/src/counter.rs +156 -147
  83. package/contracts/oapps/counter/src/storage.rs +1 -2
  84. package/contracts/oapps/counter/src/tests/test_codec.rs +5 -5
  85. package/contracts/oapps/counter/src/tests/test_counter.rs +11 -13
  86. package/contracts/oapps/oapp/Cargo.toml +1 -0
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/lib.rs +3 -0
  89. package/contracts/oapps/oapp/src/macro_tests/mod.rs +1 -0
  90. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +312 -0
  91. package/contracts/oapps/oapp/src/oapp_core.rs +52 -53
  92. package/contracts/oapps/oapp/src/oapp_options_type3.rs +18 -28
  93. package/contracts/oapps/oapp/src/oapp_receiver.rs +82 -31
  94. package/contracts/oapps/oapp/src/oapp_sender.rs +55 -13
  95. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +16 -3
  96. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +33 -8
  97. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +6 -9
  98. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +28 -15
  99. package/contracts/oapps/oft/Cargo.toml +27 -0
  100. package/contracts/oapps/oft/integration-tests/mod.rs +3 -0
  101. package/contracts/oapps/oft/integration-tests/setup.rs +320 -0
  102. package/contracts/oapps/oft/integration-tests/test_with_sml.rs +155 -0
  103. package/contracts/oapps/oft/integration-tests/utils.rs +201 -0
  104. package/contracts/oapps/oft/src/codec/mod.rs +2 -0
  105. package/contracts/oapps/oft/src/codec/oft_compose_msg_codec.rs +55 -0
  106. package/contracts/oapps/oft/src/codec/oft_msg_codec.rs +62 -0
  107. package/contracts/oapps/oft/src/constants.rs +5 -0
  108. package/contracts/oapps/oft/src/errors.rs +8 -0
  109. package/contracts/oapps/oft/src/events.rs +19 -0
  110. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +23 -0
  111. package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
  112. package/contracts/oapps/oft/src/lib.rs +22 -0
  113. package/contracts/oapps/oft/src/macro_tests/mod.rs +2 -0
  114. package/contracts/oapps/oft/src/macro_tests/test_all_default.rs +41 -0
  115. package/contracts/oapps/oft/src/macro_tests/test_override.rs +83 -0
  116. package/contracts/oapps/oft/src/oft.rs +320 -0
  117. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +50 -0
  118. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +50 -0
  119. package/contracts/oapps/oft/src/oft_types/mod.rs +10 -0
  120. package/contracts/oapps/oft/src/storage.rs +11 -0
  121. package/contracts/oapps/oft/src/tests/mod.rs +13 -0
  122. package/contracts/oapps/oft/src/tests/test_decimals.rs +89 -0
  123. package/contracts/oapps/oft/src/tests/test_lz_receive.rs +282 -0
  124. package/contracts/oapps/oft/src/tests/test_oft_compose_msg_codec.rs +68 -0
  125. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +136 -0
  126. package/contracts/oapps/oft/src/tests/test_oft_version.rs +13 -0
  127. package/contracts/oapps/oft/src/tests/test_quote_oft.rs +159 -0
  128. package/contracts/oapps/oft/src/tests/test_quote_send.rs +195 -0
  129. package/contracts/oapps/oft/src/tests/test_resolve_address.rs +37 -0
  130. package/contracts/oapps/oft/src/tests/test_send.rs +915 -0
  131. package/contracts/oapps/oft/src/tests/test_token.rs +47 -0
  132. package/contracts/oapps/oft/src/tests/test_utils.rs +789 -0
  133. package/contracts/oapps/oft/src/types.rs +38 -0
  134. package/contracts/oapps/oft/src/utils.rs +67 -0
  135. package/contracts/oapps/oft-mint-burn/Cargo.toml +26 -0
  136. package/contracts/oapps/oft-mint-burn/src/lib.rs +3 -0
  137. package/contracts/oapps/oft-mint-burn/src/oft.rs +28 -0
  138. package/contracts/oapps/oft-mint-burn/src/tests/mod.rs +1 -0
  139. package/contracts/utils/src/buffer_reader.rs +8 -9
  140. package/contracts/utils/src/buffer_writer.rs +11 -5
  141. package/contracts/utils/src/errors.rs +5 -5
  142. package/contracts/utils/src/ownable.rs +14 -6
  143. package/contracts/utils/src/testing_utils.rs +11 -1
  144. package/contracts/utils/src/tests/buffer_reader.rs +491 -730
  145. package/contracts/utils/src/tests/buffer_writer.rs +336 -148
  146. package/contracts/utils/src/tests/bytes_ext.rs +125 -40
  147. package/contracts/utils/src/tests/mod.rs +3 -0
  148. package/contracts/utils/src/tests/ownable.rs +379 -27
  149. package/contracts/utils/src/tests/test_helper.rs +47 -0
  150. package/contracts/utils/src/tests/testing_utils.rs +555 -0
  151. package/contracts/utils/src/tests/ttl.rs +421 -0
  152. package/contracts/utils/src/ttl.rs +29 -89
  153. package/contracts/workers/dvn/Cargo.toml +31 -0
  154. package/contracts/workers/dvn/src/auth.rs +66 -0
  155. package/contracts/workers/dvn/src/dvn.rs +143 -0
  156. package/contracts/workers/dvn/src/errors.rs +21 -0
  157. package/contracts/workers/dvn/src/events.rs +19 -0
  158. package/contracts/workers/dvn/src/interfaces/dvn.rs +12 -0
  159. package/contracts/workers/dvn/src/interfaces/mod.rs +5 -0
  160. package/contracts/workers/dvn/src/interfaces/multisig.rs +15 -0
  161. package/contracts/workers/dvn/src/lib.rs +24 -0
  162. package/contracts/workers/dvn/src/multisig.rs +127 -0
  163. package/contracts/workers/dvn/src/storage.rs +35 -0
  164. package/contracts/workers/dvn/src/tests/auth.rs +237 -0
  165. package/contracts/workers/dvn/src/tests/dvn.rs +349 -0
  166. package/contracts/workers/dvn/src/tests/key_pair.rs +66 -0
  167. package/contracts/workers/dvn/src/tests/mod.rs +5 -0
  168. package/contracts/workers/dvn/src/tests/multisig/mod.rs +3 -0
  169. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +133 -0
  170. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +108 -0
  171. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +109 -0
  172. package/contracts/workers/dvn/src/tests/setup.rs +109 -0
  173. package/contracts/workers/dvn/src/types.rs +26 -0
  174. package/contracts/workers/dvn-fee-lib/Cargo.toml +24 -0
  175. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +113 -0
  176. package/contracts/workers/dvn-fee-lib/src/errors.rs +8 -0
  177. package/contracts/workers/dvn-fee-lib/src/lib.rs +17 -0
  178. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +282 -0
  179. package/contracts/workers/dvn-fee-lib/src/tests/mod.rs +1 -0
  180. package/contracts/workers/executor/Cargo.toml +10 -7
  181. package/contracts/workers/executor/src/errors.rs +8 -0
  182. package/contracts/workers/executor/src/events.rs +4 -7
  183. package/contracts/workers/executor/src/interfaces/executor.rs +72 -22
  184. package/contracts/workers/executor/src/interfaces/mod.rs +0 -2
  185. package/contracts/workers/executor/src/lib.rs +16 -7
  186. package/contracts/workers/executor/src/lz_executor.rs +308 -0
  187. package/contracts/workers/executor/src/storage.rs +24 -16
  188. package/contracts/workers/executor-fee-lib/Cargo.toml +22 -0
  189. package/contracts/workers/executor-fee-lib/src/errors.rs +15 -0
  190. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +215 -0
  191. package/contracts/workers/executor-fee-lib/src/executor_option.rs +203 -0
  192. package/contracts/workers/executor-fee-lib/src/lib.rs +7 -0
  193. package/contracts/workers/executor-helper/Cargo.toml +29 -0
  194. package/contracts/workers/executor-helper/src/executor_helper.rs +161 -0
  195. package/contracts/workers/executor-helper/src/lib.rs +11 -0
  196. package/contracts/workers/{worker-common → worker}/Cargo.toml +1 -4
  197. package/contracts/workers/worker/src/errors.rs +24 -0
  198. package/contracts/workers/worker/src/events.rs +62 -0
  199. package/contracts/workers/worker/src/interfaces/dvn_fee_lib.rs +75 -0
  200. package/contracts/workers/worker/src/interfaces/executor_fee_lib.rs +84 -0
  201. package/contracts/workers/{worker-common → worker}/src/interfaces/mod.rs +2 -2
  202. package/contracts/workers/worker/src/interfaces/price_feed.rs +85 -0
  203. package/contracts/workers/worker/src/lib.rs +14 -0
  204. package/contracts/workers/worker/src/storage.rs +63 -0
  205. package/contracts/workers/worker/src/worker.rs +459 -0
  206. package/package.json +3 -3
  207. package/sdk/dist/generated/bml.d.ts +88 -17
  208. package/sdk/dist/generated/bml.js +62 -16
  209. package/sdk/dist/generated/counter.d.ts +281 -102
  210. package/sdk/dist/generated/counter.js +93 -41
  211. package/sdk/dist/generated/endpoint.d.ts +128 -105
  212. package/sdk/dist/generated/endpoint.js +47 -45
  213. package/sdk/dist/generated/sml.d.ts +212 -69
  214. package/sdk/dist/generated/sml.js +103 -53
  215. package/sdk/dist/generated/uln302.d.ts +270 -173
  216. package/sdk/dist/generated/uln302.js +112 -64
  217. package/sdk/package.json +11 -11
  218. package/sdk/test/index.test.ts +147 -42
  219. package/sdk/test/suites/constants.ts +7 -3
  220. package/sdk/test/suites/deploy.ts +65 -42
  221. package/sdk/test/suites/localnet.ts +2 -2
  222. package/sdk/test/suites/scan.ts +28 -25
  223. package/sdk/test/utils.ts +199 -0
  224. package/sdk/tsconfig.json +93 -95
  225. package/tools/ts-bindings-gen/src/main.rs +2 -0
  226. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +0 -310
  227. package/contracts/common-macros/src/tests.rs +0 -287
  228. package/contracts/oapp-macros/tests/test_macros.rs +0 -522
  229. package/contracts/workers/executor/src/executor.rs +0 -347
  230. package/contracts/workers/executor/src/interfaces/types.rs +0 -51
  231. package/contracts/workers/worker-common/src/constants.rs +0 -17
  232. package/contracts/workers/worker-common/src/errors.rs +0 -6
  233. package/contracts/workers/worker-common/src/events.rs +0 -34
  234. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +0 -35
  235. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +0 -40
  236. package/contracts/workers/worker-common/src/interfaces/worker.rs +0 -60
  237. package/contracts/workers/worker-common/src/lib.rs +0 -19
  238. package/contracts/workers/worker-common/src/storage.rs +0 -32
  239. package/contracts/workers/worker-common/src/worker_common.rs +0 -166
@@ -0,0 +1,151 @@
1
+ use proc_macro2::TokenStream;
2
+ use quote::quote;
3
+
4
+ use crate::tests::test_helpers::{assert_panics_contains, non_struct_item_inputs};
5
+ // ============================================
6
+ // Snapshot Test: Ownable Code Generation
7
+ // ============================================
8
+
9
+ #[test]
10
+ fn snapshot_generated_ownable_code() {
11
+ let input = quote! {
12
+ pub struct MyContract;
13
+ };
14
+ let result = crate::ownable::generate_ownable_impl(input);
15
+ let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
16
+
17
+ insta::assert_snapshot!(formatted);
18
+ }
19
+
20
+ #[test]
21
+ fn snapshot_only_owner_preserves_function_signature() {
22
+ let input = quote! {
23
+ pub(crate) async fn admin_action<T: Clone>(env: &Env, value: T) -> Result<T, Error> {
24
+ Ok(value.clone())
25
+ }
26
+ };
27
+ let result = crate::ownable::prepend_only_owner_check(input);
28
+ let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
29
+
30
+ insta::assert_snapshot!(formatted);
31
+ }
32
+
33
+ // ============================================
34
+ // prepend_only_owner_check Tests
35
+ // ============================================
36
+
37
+ /// Helper function to verify that the owner check is correctly inserted at the beginning of a function.
38
+ fn assert_owner_check_inserted(input: TokenStream, test_name: &str) {
39
+ let result_tokens = crate::ownable::prepend_only_owner_check(input);
40
+ let output_fn: syn::ItemFn =
41
+ syn::parse2(result_tokens).unwrap_or_else(|e| panic!("{}: failed to parse output function: {}", test_name, e));
42
+
43
+ assert!(!output_fn.block.stmts.is_empty(), "{}: function body should contain at least one statement", test_name);
44
+
45
+ let first_stmt = &output_fn.block.stmts[0];
46
+ let expected_stmt = "utils::ownable::require_owner_auth::<Self>(my_custom_env);";
47
+ let actual_stmt = quote::quote!(#first_stmt).to_string().replace(" ", "");
48
+
49
+ assert_eq!(
50
+ actual_stmt, expected_stmt,
51
+ "{}: expected owner check statement '{}', but got '{}'",
52
+ test_name, expected_stmt, actual_stmt
53
+ );
54
+ }
55
+
56
+ #[test]
57
+ fn test_only_owner_inserts_correct_code_at_the_beginning() {
58
+ let test_cases = vec![
59
+ ("Env by value", quote! { pub fn f(my_custom_env: Env) {} }),
60
+ ("Env not first param", quote! { pub fn f(x: u32, my_custom_env: &Env) {} }),
61
+ ("Qualified path (soroban_sdk::Env)", quote! { pub fn f(my_custom_env: soroban_sdk::Env) {} }),
62
+ ("Nested reference (&&Env)", quote! { pub fn f(my_custom_env: &&Env) {} }),
63
+ ];
64
+
65
+ for (description, input) in test_cases {
66
+ assert_owner_check_inserted(input, description);
67
+ }
68
+ }
69
+
70
+ #[test]
71
+ fn test_only_owner_requires_env_param() {
72
+ // ============================================
73
+ // Error Cases: Missing/Invalid Env Argument Patterns
74
+ // ============================================
75
+ let cases = vec![
76
+ ("no Env param", quote! { pub fn admin_action(value: u32) {} }),
77
+ // Tuple pattern destructuring is not supported - must use simple identifier
78
+ ("tuple pattern", quote! { pub fn admin_action((env, _other): (&Env, u32)) {} }),
79
+ // Wildcard pattern (_) is not supported - must use named identifier
80
+ ("wildcard pattern", quote! { pub fn admin_action(_: &Env) {} }),
81
+ // Struct destructuring pattern is not supported
82
+ ("struct pattern", quote! { pub fn admin_action(Env { .. }: Env) {} }),
83
+ ];
84
+
85
+ for (case, input) in cases {
86
+ assert_panics_contains(case, "function must have an Env argument", || {
87
+ crate::ownable::prepend_only_owner_check(input.clone());
88
+ });
89
+ }
90
+ }
91
+
92
+ // ============================================
93
+ // Error Cases: ownable macro non-struct input
94
+ // ============================================
95
+
96
+ #[test]
97
+ fn test_ownable_rejects_non_struct_inputs() {
98
+ for (case, input) in non_struct_item_inputs() {
99
+ assert_panics_contains(case, "failed to parse struct", || {
100
+ crate::ownable::generate_ownable_impl(input.clone());
101
+ });
102
+ }
103
+ }
104
+
105
+ // ============================================
106
+ // is_env_type Unit Tests
107
+ // ============================================
108
+
109
+ #[test]
110
+ fn test_is_env_type_recognizes_env_types() {
111
+ let env_types = [
112
+ "Env",
113
+ "&Env",
114
+ "&&Env",
115
+ "&mut Env",
116
+ "soroban_sdk::Env",
117
+ "&soroban_sdk::Env",
118
+ "some::deeply::nested::module::Env",
119
+ ];
120
+
121
+ for ty_str in env_types {
122
+ let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
123
+ assert!(crate::utils::is_env_type(&ty), "{ty_str} should be recognized as an Env type");
124
+ }
125
+ }
126
+
127
+ #[test]
128
+ fn test_is_env_type_rejects_non_env_types() {
129
+ let non_env_types = ["u32", "bool", "String", "Address", "&u32", "soroban_sdk::Address"];
130
+
131
+ for ty_str in non_env_types {
132
+ let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
133
+ assert!(!crate::utils::is_env_type(&ty), "{ty_str} should NOT be recognized as an Env type");
134
+ }
135
+ }
136
+
137
+ #[test]
138
+ fn test_is_env_type_rejects_other_type_variants() {
139
+ let other_variants = [
140
+ ("(Env, u32)", "tuple"),
141
+ ("[Env; 1]", "array"),
142
+ ("[Env]", "slice"),
143
+ ("Option<Env>", "generic"),
144
+ ("!", "never"),
145
+ ];
146
+
147
+ for (ty_str, label) in other_variants {
148
+ let ty = syn::parse_str::<syn::Type>(ty_str).expect("failed to parse type");
149
+ assert!(!crate::utils::is_env_type(&ty), "{label} type {ty_str} should NOT be recognized as an Env type");
150
+ }
151
+ }
@@ -0,0 +1,85 @@
1
+ ---
2
+ source: contracts/common-macros/src/tests/contract_impl.rs
3
+ assertion_line: 98
4
+ expression: combined
5
+ ---
6
+ // === Inherent Impl (no attr) ===
7
+
8
+ #[soroban_sdk::contractimpl]
9
+ impl MyContract {
10
+ /// Public method with Env - should have TTL extension
11
+ pub fn public_with_env(env: Env, value: u32) -> u32 {
12
+ if let Some(instance_ttl) = utils::ttl::TtlConfigStorage::instance(env) {
13
+ env.storage()
14
+ .instance()
15
+ .extend_ttl(instance_ttl.threshold, instance_ttl.extend_to);
16
+ }
17
+ value * 2
18
+ }
19
+ /// Public method with qualified Env path - should have TTL extension
20
+ pub fn with_qualified_env(env: soroban_sdk::Env) -> u32 {
21
+ if let Some(instance_ttl) = utils::ttl::TtlConfigStorage::instance(env) {
22
+ env.storage()
23
+ .instance()
24
+ .extend_ttl(instance_ttl.threshold, instance_ttl.extend_to);
25
+ }
26
+ 42
27
+ }
28
+ /// Public method with Env not as first parameter - should have TTL extension
29
+ pub fn env_second(value: u32, env: Env) -> u32 {
30
+ if let Some(instance_ttl) = utils::ttl::TtlConfigStorage::instance(env) {
31
+ env.storage()
32
+ .instance()
33
+ .extend_ttl(instance_ttl.threshold, instance_ttl.extend_to);
34
+ }
35
+ value * 2
36
+ }
37
+ /// Public method without Env - should NOT have TTL extension
38
+ pub fn public_without_env(value: u32) -> u32 {
39
+ value * 4
40
+ }
41
+ /// Private method with Env - should NOT have TTL extension (not public)
42
+ fn private_with_env(env: Env, value: u32) -> u32 {
43
+ value * 5
44
+ }
45
+ /// Pub(crate) method with Env - should NOT have TTL extension (not fully public)
46
+ pub(crate) fn pub_crate_with_env(env: Env, value: u32) -> u32 {
47
+ value * 7
48
+ }
49
+ }
50
+
51
+
52
+ // === Trait Impl (no attr) ===
53
+
54
+ #[soroban_sdk::contractimpl]
55
+ impl SomeTrait for MyContract {
56
+ /// Trait method with Env - should have TTL extension
57
+ fn trait_method_with_env(env: Env, value: u32) -> u32 {
58
+ if let Some(instance_ttl) = utils::ttl::TtlConfigStorage::instance(env) {
59
+ env.storage()
60
+ .instance()
61
+ .extend_ttl(instance_ttl.threshold, instance_ttl.extend_to);
62
+ }
63
+ value * 2
64
+ }
65
+ /// Trait method without Env - should NOT have TTL extension
66
+ fn trait_method_without_env(value: u32) -> u32 {
67
+ value * 4
68
+ }
69
+ }
70
+
71
+
72
+ // === Trait Impl (contracttrait attr) ===
73
+
74
+ #[soroban_sdk::contractimpl(contracttrait)]
75
+ impl AnotherTrait for MyContract {
76
+ /// Trait method with contracttrait attr - should have TTL extension
77
+ fn contracttrait_method(env: Env, value: u32) -> u32 {
78
+ if let Some(instance_ttl) = utils::ttl::TtlConfigStorage::instance(env) {
79
+ env.storage()
80
+ .instance()
81
+ .extend_ttl(instance_ttl.threshold, instance_ttl.extend_to);
82
+ }
83
+ value * 3
84
+ }
85
+ }
@@ -0,0 +1,30 @@
1
+ ---
2
+ source: contracts/common-macros/src/tests/ownable.rs
3
+ assertion_line: 17
4
+ expression: formatted
5
+ ---
6
+ pub struct MyContract;
7
+ use utils::ownable::Ownable as _;
8
+ use utils::ownable::OwnableInitializer as _;
9
+ /// Implement the OwnableInitializer trait for the contract.
10
+ impl utils::ownable::OwnableInitializer for MyContract {
11
+ fn init_owner(env: &soroban_sdk::Env, owner: &soroban_sdk::Address) {
12
+ <utils::ownable::DefaultOwnable as utils::ownable::OwnableInitializer>::init_owner(
13
+ env,
14
+ owner,
15
+ )
16
+ }
17
+ }
18
+ /// Implement the Ownable trait for the contract.
19
+ #[soroban_sdk::contractimpl]
20
+ impl utils::ownable::Ownable for MyContract {
21
+ fn owner(env: &soroban_sdk::Env) -> Option<soroban_sdk::Address> {
22
+ utils::ownable::DefaultOwnable::owner(env)
23
+ }
24
+ fn transfer_ownership(env: &soroban_sdk::Env, new_owner: &soroban_sdk::Address) {
25
+ utils::ownable::DefaultOwnable::transfer_ownership(env, new_owner)
26
+ }
27
+ fn renounce_ownership(env: &soroban_sdk::Env) {
28
+ utils::ownable::DefaultOwnable::renounce_ownership(env)
29
+ }
30
+ }
@@ -0,0 +1,9 @@
1
+ ---
2
+ source: contracts/common-macros/src/tests/ownable.rs
3
+ assertion_line: 28
4
+ expression: formatted
5
+ ---
6
+ pub(crate) async fn admin_action<T: Clone>(env: &Env, value: T) -> Result<T, Error> {
7
+ utils::ownable::require_owner_auth::<Self>(env);
8
+ Ok(value.clone())
9
+ }