@layerzerolabs/protocol-stellar-v2 0.2.20 → 0.2.22

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 (198) hide show
  1. package/.turbo/turbo-build.log +783 -802
  2. package/.turbo/turbo-lint.log +320 -157
  3. package/.turbo/turbo-test.log +1414 -1457
  4. package/Cargo.lock +109 -108
  5. package/Cargo.toml +32 -18
  6. package/contracts/common-macros/Cargo.toml +7 -7
  7. package/contracts/common-macros/src/auth.rs +18 -37
  8. package/contracts/common-macros/src/contract_ttl.rs +2 -2
  9. package/contracts/common-macros/src/lib.rs +27 -10
  10. package/contracts/common-macros/src/lz_contract.rs +38 -7
  11. package/contracts/common-macros/src/storage.rs +251 -292
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -9
  16. package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
  17. package/contracts/common-macros/src/ttl_configurable.rs +2 -10
  18. package/contracts/common-macros/src/ttl_extendable.rs +2 -10
  19. package/contracts/common-macros/src/upgradeable.rs +56 -15
  20. package/contracts/common-macros/src/utils.rs +0 -9
  21. package/contracts/endpoint-v2/src/lib.rs +3 -2
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
  28. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
  29. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
  30. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
  31. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
  32. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
  33. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
  34. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
  35. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
  36. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
  37. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
  38. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
  39. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
  40. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
  41. package/contracts/layerzero-views/Cargo.toml +0 -1
  42. package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
  43. package/contracts/macro-integration-tests/Cargo.toml +5 -15
  44. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
  45. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
  46. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
  47. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
  48. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
  49. package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
  50. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
  51. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
  52. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
  53. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
  54. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
  55. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
  56. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
  57. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
  58. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
  59. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
  60. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
  61. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
  62. package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
  63. package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
  64. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
  65. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
  66. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
  67. package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
  68. package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
  69. package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
  70. package/contracts/message-libs/treasury/Cargo.toml +0 -2
  71. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
  72. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
  73. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
  74. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
  75. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
  76. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
  77. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +7 -27
  78. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  79. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
  80. package/contracts/oapps/counter/Cargo.toml +4 -6
  81. package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
  82. package/contracts/oapps/oapp/src/errors.rs +1 -1
  83. package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
  84. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
  85. package/contracts/oapps/oapp/src/lib.rs +1 -0
  86. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
  87. package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
  88. package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
  89. package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
  90. package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
  91. package/contracts/oapps/oapp/src/tests/{test_oapp_core.rs → oapp_core.rs} +4 -4
  92. package/contracts/oapps/oapp/src/tests/{test_oapp_options_type3.rs → oapp_options_type3.rs} +3 -4
  93. package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
  94. package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
  95. package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
  96. package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
  97. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
  98. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
  99. package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
  100. package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
  101. package/contracts/oapps/oft/src/extensions/oft_fee.rs +136 -74
  102. package/contracts/oapps/oft/src/extensions/pausable.rs +44 -10
  103. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +170 -130
  104. package/contracts/oapps/oft/src/oft.rs +19 -12
  105. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  106. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -1
  107. package/contracts/oapps/oft-core/Cargo.toml +1 -4
  108. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -2
  109. package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
  110. package/contracts/oapps/oft-core/src/errors.rs +3 -2
  111. package/contracts/oapps/oft-core/src/events.rs +6 -0
  112. package/contracts/oapps/oft-core/src/lib.rs +1 -1
  113. package/contracts/oapps/oft-core/src/oft_core.rs +115 -60
  114. package/contracts/oapps/oft-core/src/storage.rs +7 -3
  115. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
  116. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
  117. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
  118. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
  119. package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
  120. package/contracts/oapps/oft-core/src/tests/test_utils.rs +59 -14
  121. package/contracts/utils/Cargo.toml +0 -1
  122. package/contracts/utils/src/errors.rs +1 -1
  123. package/contracts/utils/src/multisig.rs +17 -8
  124. package/contracts/utils/src/ownable.rs +6 -6
  125. package/contracts/utils/src/testing_utils.rs +124 -54
  126. package/contracts/utils/src/tests/multisig.rs +12 -12
  127. package/contracts/utils/src/tests/ownable.rs +6 -6
  128. package/contracts/utils/src/tests/testing_utils.rs +50 -167
  129. package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
  130. package/contracts/utils/src/tests/upgradeable.rs +1 -1
  131. package/contracts/utils/src/ttl_configurable.rs +10 -4
  132. package/contracts/utils/src/upgradeable.rs +5 -5
  133. package/contracts/workers/dvn/Cargo.toml +5 -6
  134. package/contracts/workers/dvn/src/dvn.rs +2 -12
  135. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  136. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +37 -19
  137. package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
  138. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +15 -13
  139. package/contracts/workers/executor/Cargo.toml +3 -0
  140. package/contracts/workers/executor/src/executor.rs +2 -12
  141. package/contracts/workers/executor/src/lib.rs +2 -2
  142. package/contracts/workers/executor/src/tests/auth.rs +394 -0
  143. package/contracts/workers/executor/src/tests/executor.rs +410 -0
  144. package/contracts/workers/executor/src/tests/mod.rs +3 -0
  145. package/contracts/workers/executor/src/tests/setup.rs +250 -0
  146. package/contracts/workers/executor-fee-lib/Cargo.toml +5 -0
  147. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +1 -12
  148. package/contracts/workers/executor-fee-lib/src/lib.rs +8 -2
  149. package/contracts/workers/executor-helper/Cargo.toml +0 -1
  150. package/contracts/workers/price-feed/Cargo.toml +5 -0
  151. package/contracts/workers/price-feed/src/lib.rs +9 -4
  152. package/contracts/workers/price-feed/src/price_feed.rs +1 -11
  153. package/contracts/workers/worker/src/errors.rs +1 -1
  154. package/contracts/workers/worker/src/tests/setup.rs +1 -1
  155. package/contracts/workers/worker/src/tests/worker.rs +55 -41
  156. package/contracts/workers/worker/src/worker.rs +34 -25
  157. package/docs/error-spec.md +55 -0
  158. package/docs/layerzero-v2-on-stellar.md +447 -0
  159. package/docs/oapp-guide.md +212 -0
  160. package/docs/oft-guide.md +314 -0
  161. package/package.json +3 -3
  162. package/sdk/.turbo/turbo-test.log +260 -257
  163. package/sdk/dist/generated/bml.d.ts +3 -3
  164. package/sdk/dist/generated/bml.js +4 -4
  165. package/sdk/dist/generated/counter.d.ts +295 -295
  166. package/sdk/dist/generated/counter.js +43 -43
  167. package/sdk/dist/generated/dvn.d.ts +91 -91
  168. package/sdk/dist/generated/dvn.js +24 -24
  169. package/sdk/dist/generated/dvn_fee_lib.d.ts +92 -92
  170. package/sdk/dist/generated/dvn_fee_lib.js +25 -25
  171. package/sdk/dist/generated/endpoint.d.ts +99 -99
  172. package/sdk/dist/generated/endpoint.js +16 -16
  173. package/sdk/dist/generated/executor.d.ts +91 -91
  174. package/sdk/dist/generated/executor.js +24 -24
  175. package/sdk/dist/generated/executor_fee_lib.d.ts +92 -92
  176. package/sdk/dist/generated/executor_fee_lib.js +25 -25
  177. package/sdk/dist/generated/executor_helper.d.ts +3 -3
  178. package/sdk/dist/generated/executor_helper.js +4 -4
  179. package/sdk/dist/generated/layerzero_view.d.ts +186 -186
  180. package/sdk/dist/generated/layerzero_view.js +35 -35
  181. package/sdk/dist/generated/oft.d.ts +366 -352
  182. package/sdk/dist/generated/oft.js +74 -79
  183. package/sdk/dist/generated/price_feed.d.ts +198 -198
  184. package/sdk/dist/generated/price_feed.js +39 -39
  185. package/sdk/dist/generated/sml.d.ts +99 -99
  186. package/sdk/dist/generated/sml.js +16 -16
  187. package/sdk/dist/generated/treasury.d.ts +99 -99
  188. package/sdk/dist/generated/treasury.js +16 -16
  189. package/sdk/dist/generated/uln302.d.ts +99 -99
  190. package/sdk/dist/generated/uln302.js +16 -16
  191. package/sdk/dist/generated/upgrader.d.ts +3 -3
  192. package/sdk/dist/generated/upgrader.js +3 -3
  193. package/sdk/package.json +1 -1
  194. package/sdk/test/suites/localnet.ts +84 -20
  195. package/contracts/ERROR_SPEC.md +0 -51
  196. package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
  197. /package/contracts/oapps/oapp/src/tests/{test_oapp_receiver.rs → oapp_receiver.rs} +0 -0
  198. /package/contracts/oapps/oapp/src/tests/{test_oapp_sender.rs → oapp_sender.rs} +0 -0
@@ -77,9 +77,9 @@ pub fn contracttrait_with_ttl(attr: TokenStream, input: TokenStream) -> TokenStr
77
77
 
78
78
  /// Generates a statement that initializes default TTL configs in the constructor.
79
79
  fn init_default_ttl_configs_stmt(env_param: &utils::EnvParam<'_>) -> syn::Stmt {
80
- let env_ident = env_param.ident;
80
+ let env_ref = env_param.as_ref_tokens();
81
81
  syn::parse_quote! {
82
- utils::ttl_configurable::init_default_ttl_configs(#env_ident);
82
+ utils::ttl_configurable::init_default_ttl_configs(#env_ref);
83
83
  }
84
84
  }
85
85
 
@@ -392,21 +392,33 @@ pub fn contract_trait(attr: TokenStream, item: TokenStream) -> TokenStream {
392
392
  ///
393
393
  /// # Requirements
394
394
  /// - The contract must implement the `Auth` trait (via `#[ownable]` or `Multisig`)
395
- /// - The contract must implement `UpgradeableInternal` trait with migration logic
395
+ /// - By default, requires manual `UpgradeableInternal` implementation
396
+ /// - With `no_migration` flag, auto-generates a no-op `UpgradeableInternal` impl
397
+ ///
398
+ /// # Options
399
+ /// - `#[upgradeable]` - Requires manual `UpgradeableInternal` implementation (safety by default)
400
+ /// - `#[upgradeable(no_migration)]` - Auto-generates no-op `UpgradeableInternal` (for initial deployment)
396
401
  ///
397
402
  /// # Example
398
403
  /// ```ignore
399
- /// #[ownable] // or implement Multisig for self-owning contracts
404
+ /// // Requires manual UpgradeableInternal implementation (default)
405
+ /// #[ownable]
400
406
  /// #[upgradeable]
401
407
  /// pub struct MyContract;
402
408
  ///
403
409
  /// impl utils::upgradeable::UpgradeableInternal for MyContract {
404
- /// type MigrationData = ();
410
+ /// type MigrationData = MyMigrationParams;
405
411
  ///
406
412
  /// fn __migrate(env: &Env, migration_data: &Self::MigrationData) {
407
- /// // Migration logic here
413
+ /// // Custom migration logic here
408
414
  /// }
409
415
  /// }
416
+ ///
417
+ /// // Auto-generates no-op UpgradeableInternal (for initial deployment)
418
+ /// #[ownable]
419
+ /// #[upgradeable(no_migration)]
420
+ /// pub struct MyContract;
421
+ /// // No UpgradeableInternal impl needed!
410
422
  /// ```
411
423
  ///
412
424
  /// Generated code includes:
@@ -414,8 +426,8 @@ pub fn contract_trait(attr: TokenStream, item: TokenStream) -> TokenStream {
414
426
  /// - `migrate(env, migration_data)` - Runs migration after upgrade (auth required, XDR-decodes `Bytes` to `MigrationData`)
415
427
  /// - `contractmeta!` with `binver` set to the Cargo package version (if not 0.0.0)
416
428
  #[proc_macro_attribute]
417
- pub fn upgradeable(_attr: TokenStream, item: TokenStream) -> TokenStream {
418
- upgradeable::generate_upgradeable_impl(item.into()).into()
429
+ pub fn upgradeable(attr: TokenStream, item: TokenStream) -> TokenStream {
430
+ upgradeable::generate_upgradeable_impl(attr.into(), item.into()).into()
419
431
  }
420
432
 
421
433
  // ============================================================================
@@ -435,7 +447,8 @@ pub fn upgradeable(_attr: TokenStream, item: TokenStream) -> TokenStream {
435
447
  /// - `#[ownable]` - Single-owner access control
436
448
  ///
437
449
  /// # Options
438
- /// - `upgradeable` - Adds `#[upgradeable]` for contract upgrade support
450
+ /// - `upgradeable` - Adds `#[upgradeable]`, requires manual `UpgradeableInternal` impl
451
+ /// - `upgradeable(no_migration)` - Adds `#[upgradeable(no_migration)]`, auto-generates no-op impl
439
452
  /// - `multisig` - Uses `#[multisig]` instead of `#[ownable]`
440
453
  ///
441
454
  /// # Examples
@@ -444,12 +457,16 @@ pub fn upgradeable(_attr: TokenStream, item: TokenStream) -> TokenStream {
444
457
  /// #[lz_contract]
445
458
  /// pub struct EndpointV2;
446
459
  ///
447
- /// // Contract with upgrade support
460
+ /// // Contract with upgrade support (requires manual UpgradeableInternal)
448
461
  /// #[lz_contract(upgradeable)]
449
462
  /// pub struct DVNFeeLib;
450
463
  ///
451
- /// // Contract with multisig auth and upgrade support
452
- /// #[lz_contract(multisig, upgradeable)]
464
+ /// // Contract with upgrade support and no migration (auto no-op impl)
465
+ /// #[lz_contract(upgradeable(no_migration))]
466
+ /// pub struct DVNFeeLib;
467
+ ///
468
+ /// // Contract with multisig auth and upgrade support (no migration)
469
+ /// #[lz_contract(multisig, upgradeable(no_migration))]
453
470
  /// pub struct DVN;
454
471
  /// ```
455
472
  #[proc_macro_attribute]
@@ -6,8 +6,8 @@
6
6
  use proc_macro2::TokenStream;
7
7
  use quote::quote;
8
8
  use syn::{
9
+ parenthesized,
9
10
  parse::{Parse, ParseStream},
10
- punctuated::Punctuated,
11
11
  Error, Ident, ItemStruct, Token,
12
12
  };
13
13
 
@@ -16,6 +16,9 @@ use syn::{
16
16
  pub struct LzContractConfig {
17
17
  /// If true, adds `#[upgradeable]` for contract upgrade support.
18
18
  pub upgradeable: bool,
19
+ /// If true, generates a default no-op `UpgradeableInternal` implementation.
20
+ /// Only valid when `upgradeable` is also true.
21
+ pub no_migration: bool,
19
22
  /// If true, uses `#[multisig]` instead of `#[ownable]` for auth.
20
23
  pub multisig: bool,
21
24
  }
@@ -26,17 +29,40 @@ impl Parse for LzContractConfig {
26
29
  return Ok(Self::default());
27
30
  }
28
31
 
29
- let idents = Punctuated::<Ident, Token![,]>::parse_terminated(input)?;
30
32
  let mut config = Self::default();
31
33
 
32
- for ident in idents {
34
+ // Parse comma-separated items, handling nested parentheses for upgradeable(no_migration)
35
+ while !input.is_empty() {
36
+ let ident: Ident = input.parse()?;
37
+
33
38
  match ident.to_string().as_str() {
34
- "upgradeable" => config.upgradeable = true,
39
+ "upgradeable" => {
40
+ config.upgradeable = true;
41
+ // Check for optional (no_migration) suffix
42
+ if input.peek(syn::token::Paren) {
43
+ let content;
44
+ parenthesized!(content in input);
45
+ let inner_ident: Ident = content.parse()?;
46
+ if inner_ident == "no_migration" {
47
+ config.no_migration = true;
48
+ } else {
49
+ return Err(Error::new(inner_ident.span(), "expected `no_migration`"));
50
+ }
51
+ if !content.is_empty() {
52
+ return Err(Error::new(content.span(), "unexpected tokens in `upgradeable(...)`"));
53
+ }
54
+ }
55
+ }
35
56
  "multisig" => config.multisig = true,
36
57
  _ => {
37
58
  return Err(Error::new(ident.span(), "expected one of `upgradeable`, `multisig`"));
38
59
  }
39
60
  }
61
+
62
+ // Consume optional trailing comma
63
+ if input.peek(Token![,]) {
64
+ let _: Token![,] = input.parse()?;
65
+ }
40
66
  }
41
67
 
42
68
  Ok(config)
@@ -53,8 +79,9 @@ impl Parse for LzContractConfig {
53
79
  /// - `#[common_macros::ownable]` - Single-owner access control
54
80
  ///
55
81
  /// # Options
56
- /// - `upgradeable` - Adds `#[common_macros::upgradeable]` for contract upgrade support
57
- /// - `multisig` - Uses `#[common_macros::multisig]` instead of `#[common_macros::ownable]`
82
+ /// - `upgradeable` - Adds `#[upgradeable]`, requires manual `UpgradeableInternal` impl
83
+ /// - `upgradeable(no_migration)` - Adds `#[upgradeable(no_migration)]`, auto-generates no-op impl
84
+ /// - `multisig` - Uses `#[multisig]` instead of `#[ownable]`
58
85
  pub fn generate_lz_contract(attr: TokenStream, input: TokenStream) -> TokenStream {
59
86
  let config: LzContractConfig =
60
87
  syn::parse2(attr).unwrap_or_else(|e| panic!("failed to parse lz_contract config: {}", e));
@@ -67,7 +94,11 @@ pub fn generate_lz_contract(attr: TokenStream, input: TokenStream) -> TokenStrea
67
94
  };
68
95
 
69
96
  let upgrade = if config.upgradeable {
70
- quote! { #[common_macros::upgradeable] }
97
+ if config.no_migration {
98
+ quote! { #[common_macros::upgradeable(no_migration)] }
99
+ } else {
100
+ quote! { #[common_macros::upgradeable] }
101
+ }
71
102
  } else {
72
103
  quote! {}
73
104
  };