@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.20

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 (125) hide show
  1. package/.turbo/turbo-build.log +245 -222
  2. package/.turbo/turbo-lint.log +77 -70
  3. package/.turbo/turbo-test.log +1385 -1221
  4. package/Cargo.lock +13 -3
  5. package/Cargo.toml +2 -0
  6. package/contracts/ERROR_SPEC.md +8 -1
  7. package/contracts/common-macros/src/contract_ttl.rs +18 -7
  8. package/contracts/common-macros/src/lib.rs +4 -4
  9. package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
  10. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
  11. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +7 -12
  12. package/contracts/common-macros/src/upgradeable.rs +15 -21
  13. package/contracts/message-libs/uln-302/src/events.rs +4 -0
  14. package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
  15. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +38 -64
  16. package/contracts/oapps/counter/Cargo.toml +1 -0
  17. package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
  18. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +113 -65
  19. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +111 -82
  20. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +293 -65
  21. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +331 -56
  22. package/contracts/oapps/oft/src/extensions/oft_fee.rs +18 -2
  23. package/contracts/oapps/oft/src/extensions/pausable.rs +19 -4
  24. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +52 -28
  25. package/contracts/oapps/oft/src/oft.rs +29 -41
  26. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +3 -25
  27. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -2
  28. package/contracts/oapps/oft-core/src/oft_core.rs +247 -207
  29. package/contracts/oapps/oft-core/src/tests/test_utils.rs +4 -4
  30. package/contracts/upgrader/src/lib.rs +30 -57
  31. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  32. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  33. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  34. package/contracts/utils/src/buffer_reader.rs +1 -0
  35. package/contracts/utils/src/errors.rs +3 -1
  36. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  37. package/contracts/utils/src/ttl_configurable.rs +3 -3
  38. package/contracts/utils/src/upgradeable.rs +48 -23
  39. package/contracts/workers/dvn/Cargo.toml +1 -0
  40. package/contracts/workers/dvn/src/auth.rs +12 -42
  41. package/contracts/workers/dvn/src/dvn.rs +16 -31
  42. package/contracts/workers/dvn/src/errors.rs +0 -1
  43. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  44. package/contracts/workers/dvn/src/lib.rs +4 -3
  45. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  46. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  47. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  48. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  49. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  50. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  51. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -5
  52. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +2 -3
  53. package/contracts/workers/executor/Cargo.toml +1 -0
  54. package/contracts/workers/executor/src/executor.rs +15 -26
  55. package/contracts/workers/executor-fee-lib/Cargo.toml +2 -1
  56. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +63 -5
  57. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  58. package/contracts/workers/executor-fee-lib/src/lib.rs +3 -0
  59. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  60. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  61. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  62. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  63. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  64. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  65. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  66. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  67. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  68. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  69. package/contracts/workers/price-feed/Cargo.toml +2 -1
  70. package/contracts/workers/price-feed/src/events.rs +1 -1
  71. package/contracts/workers/price-feed/src/lib.rs +3 -0
  72. package/contracts/workers/price-feed/src/price_feed.rs +6 -12
  73. package/contracts/workers/price-feed/src/storage.rs +1 -1
  74. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  75. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  76. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  77. package/contracts/workers/price-feed/src/types.rs +1 -1
  78. package/contracts/workers/worker/src/errors.rs +0 -3
  79. package/contracts/workers/worker/src/lib.rs +0 -2
  80. package/contracts/workers/worker/src/storage.rs +32 -29
  81. package/contracts/workers/worker/src/tests/setup.rs +1 -7
  82. package/contracts/workers/worker/src/tests/worker.rs +50 -42
  83. package/contracts/workers/worker/src/worker.rs +49 -58
  84. package/package.json +3 -3
  85. package/sdk/.turbo/turbo-test.log +220 -218
  86. package/sdk/dist/generated/bml.d.ts +12 -4
  87. package/sdk/dist/generated/bml.js +8 -6
  88. package/sdk/dist/generated/counter.d.ts +12 -4
  89. package/sdk/dist/generated/counter.js +8 -6
  90. package/sdk/dist/generated/dvn.d.ts +404 -365
  91. package/sdk/dist/generated/dvn.js +55 -53
  92. package/sdk/dist/generated/dvn_fee_lib.d.ts +224 -268
  93. package/sdk/dist/generated/dvn_fee_lib.js +22 -53
  94. package/sdk/dist/generated/endpoint.d.ts +12 -4
  95. package/sdk/dist/generated/endpoint.js +8 -6
  96. package/sdk/dist/generated/executor.d.ts +370 -326
  97. package/sdk/dist/generated/executor.js +47 -44
  98. package/sdk/dist/generated/executor_fee_lib.d.ts +258 -302
  99. package/sdk/dist/generated/executor_fee_lib.js +21 -52
  100. package/sdk/dist/generated/executor_helper.d.ts +26 -190
  101. package/sdk/dist/generated/executor_helper.js +22 -27
  102. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  103. package/sdk/dist/generated/layerzero_view.js +294 -0
  104. package/sdk/dist/generated/oft.d.ts +49 -40
  105. package/sdk/dist/generated/oft.js +25 -23
  106. package/sdk/dist/generated/price_feed.d.ts +225 -269
  107. package/sdk/dist/generated/price_feed.js +22 -53
  108. package/sdk/dist/generated/sml.d.ts +12 -4
  109. package/sdk/dist/generated/sml.js +8 -6
  110. package/sdk/dist/generated/treasury.d.ts +12 -4
  111. package/sdk/dist/generated/treasury.js +8 -6
  112. package/sdk/dist/generated/uln302.d.ts +12 -4
  113. package/sdk/dist/generated/uln302.js +10 -8
  114. package/sdk/dist/generated/upgrader.d.ts +189 -18
  115. package/sdk/dist/generated/upgrader.js +84 -4
  116. package/sdk/dist/index.d.ts +1 -0
  117. package/sdk/dist/index.js +2 -0
  118. package/sdk/package.json +1 -1
  119. package/sdk/src/index.ts +3 -0
  120. package/sdk/test/oft-sml.test.ts +4 -4
  121. package/sdk/test/upgrader.test.ts +2 -3
  122. package/tools/ts-bindings-gen/src/main.rs +2 -1
  123. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  124. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  125. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -8,10 +8,7 @@ use crate::{
8
8
  };
9
9
  use common_macros::contract_trait;
10
10
  use soroban_sdk::{assert_with_error, panic_with_error, Address, Bytes, Env, Vec};
11
- use utils::{
12
- auth::{enforce_auth, require_auth, Auth},
13
- option_ext::OptionExt,
14
- };
11
+ use utils::auth::{self, Auth};
15
12
 
16
13
  /// Worker interface providing common functionality for LayerZero workers.
17
14
  ///
@@ -32,7 +29,7 @@ pub trait Worker: Auth {
32
29
  /// # Arguments
33
30
  /// * `paused` - `true` to pause, `false` to unpause
34
31
  fn set_paused(env: &Env, paused: bool) {
35
- let authorizer = enforce_auth::<Self>(env);
32
+ let authorizer = auth::enforce_auth::<Self>(env);
36
33
  assert_with_error!(env, Self::paused(env) != paused, WorkerError::PauseStatusUnchanged);
37
34
 
38
35
  WorkerStorage::set_paused(env, &paused);
@@ -43,6 +40,19 @@ pub trait Worker: Auth {
43
40
  }
44
41
  }
45
42
 
43
+ /// Sets admin status for an address.
44
+ ///
45
+ /// Admins can configure worker settings like fee multipliers, deposit addresses,
46
+ /// and supported option types.
47
+ ///
48
+ /// # Arguments
49
+ /// * `admin` - The address to set admin status for
50
+ /// * `active` - `true` to add admin, `false` to remove
51
+ fn set_admin(env: &Env, admin: &Address, active: bool) {
52
+ auth::require_auth::<Self>(env);
53
+ set_admin_no_auth::<Self>(env, admin, active);
54
+ }
55
+
46
56
  /// Sets whether a message library is supported by this worker.
47
57
  ///
48
58
  /// Message libraries (e.g., ULN302) call workers to assign jobs. Only supported
@@ -52,7 +62,7 @@ pub trait Worker: Auth {
52
62
  /// * `message_lib` - The message library contract address
53
63
  /// * `supported` - `true` to add support, `false` to remove support
54
64
  fn set_supported_message_lib(env: &Env, message_lib: &Address, supported: bool) {
55
- require_auth::<Self>(env);
65
+ auth::require_auth::<Self>(env);
56
66
  set_message_lib_no_auth::<Self>(env, message_lib, supported);
57
67
  }
58
68
 
@@ -66,7 +76,7 @@ pub trait Worker: Auth {
66
76
  /// * `oapp` - The OApp contract address
67
77
  /// * `allowed` - `true` to add to allowlist, `false` to remove
68
78
  fn set_allowlist(env: &Env, oapp: &Address, allowed: bool) {
69
- require_auth::<Self>(env);
79
+ auth::require_auth::<Self>(env);
70
80
 
71
81
  let is_on_list = Self::is_on_allowlist(env, oapp);
72
82
  if allowed {
@@ -96,7 +106,7 @@ pub trait Worker: Auth {
96
106
  /// * `oapp` - The OApp contract address
97
107
  /// * `denied` - `true` to add to denylist, `false` to remove
98
108
  fn set_denylist(env: &Env, oapp: &Address, denied: bool) {
99
- require_auth::<Self>(env);
109
+ auth::require_auth::<Self>(env);
100
110
  let is_on_list = Self::is_on_denylist(env, oapp);
101
111
 
102
112
  if denied {
@@ -146,11 +156,11 @@ pub trait Worker: Auth {
146
156
  /// # Arguments
147
157
  /// * `admin` - Admin address (must provide authorization)
148
158
  /// * `eid` - Destination endpoint ID (chain identifier)
149
- /// * `option_types` - Encoded supported option types
150
- fn set_supported_option_types(env: &Env, admin: &Address, eid: u32, option_types: Bytes) {
159
+ /// * `option_types` - Supported option types. Each byte represents an option type.
160
+ fn set_supported_option_types(env: &Env, admin: &Address, eid: u32, option_types: &Bytes) {
151
161
  require_admin_auth::<Self>(env, admin);
152
- WorkerStorage::set_supported_option_types(env, eid, &option_types);
153
- SetSupportedOptionTypes { dst_eid: eid, option_types }.publish(env);
162
+ WorkerStorage::set_supported_option_types(env, eid, option_types);
163
+ SetSupportedOptionTypes { dst_eid: eid, option_types: option_types.clone() }.publish(env);
154
164
  }
155
165
 
156
166
  /// Sets the worker fee library contract address.
@@ -184,6 +194,11 @@ pub trait Worker: Auth {
184
194
  // View Functions
185
195
  // ========================================================================
186
196
 
197
+ /// Returns whether the worker is paused.
198
+ fn paused(env: &Env) -> bool {
199
+ WorkerStorage::paused(env)
200
+ }
201
+
187
202
  /// Returns whether an address is an admin.
188
203
  ///
189
204
  /// # Arguments
@@ -194,12 +209,7 @@ pub trait Worker: Auth {
194
209
 
195
210
  /// Returns all admin addresses.
196
211
  fn admins(env: &Env) -> Vec<Address> {
197
- WorkerStorage::admins(env).unwrap_or(Vec::new(env))
198
- }
199
-
200
- /// Returns whether the worker is paused.
201
- fn paused(env: &Env) -> bool {
202
- WorkerStorage::paused(env)
212
+ WorkerStorage::admins(env)
203
213
  }
204
214
 
205
215
  /// Returns whether a message library is supported.
@@ -215,7 +225,7 @@ pub trait Worker: Auth {
215
225
  /// # Returns
216
226
  /// Vector of supported message library contract addresses.
217
227
  fn message_libs(env: &Env) -> Vec<Address> {
218
- WorkerStorage::message_libs(env).unwrap_or(Vec::new(env))
228
+ WorkerStorage::message_libs(env)
219
229
  }
220
230
 
221
231
  /// Returns whether an OApp is on the allowlist.
@@ -226,6 +236,11 @@ pub trait Worker: Auth {
226
236
  WorkerStorage::has_allowlist(env, oapp)
227
237
  }
228
238
 
239
+ /// Returns the number of addresses on the allowlist.
240
+ fn allowlist_size(env: &Env) -> u32 {
241
+ WorkerStorage::allowlist_size(env)
242
+ }
243
+
229
244
  /// Returns whether an OApp is on the denylist.
230
245
  ///
231
246
  /// # Arguments
@@ -242,29 +257,19 @@ pub trait Worker: Auth {
242
257
  /// 3. Otherwise → denied
243
258
  ///
244
259
  /// # Arguments
245
- /// * `sender` - OApp contract address to check
246
- fn has_acl(env: &Env, sender: &Address) -> bool {
247
- !Self::is_on_denylist(env, sender) && (Self::allowlist_size(env) == 0 || Self::is_on_allowlist(env, sender))
248
- }
249
-
250
- /// Returns the number of addresses on the allowlist.
251
- fn allowlist_size(env: &Env) -> u32 {
252
- WorkerStorage::allowlist_size(env)
260
+ /// * `oapp` - OApp contract address to check
261
+ fn has_acl(env: &Env, oapp: &Address) -> bool {
262
+ !Self::is_on_denylist(env, oapp) && (Self::allowlist_size(env) == 0 || Self::is_on_allowlist(env, oapp))
253
263
  }
254
264
 
255
265
  /// Returns the default fee multiplier in basis points.
256
266
  fn default_multiplier_bps(env: &Env) -> u32 {
257
- WorkerStorage::default_multiplier_bps(env).unwrap_or(0)
267
+ WorkerStorage::default_multiplier_bps(env)
258
268
  }
259
269
 
260
270
  /// Returns the deposit address where fees are collected.
261
- fn deposit_address(env: &Env) -> Address {
262
- WorkerStorage::deposit_address(env).unwrap_or_panic(env, WorkerError::DepositAddressNotSet)
263
- }
264
-
265
- /// Returns the price feed contract address.
266
- fn price_feed(env: &Env) -> Address {
267
- WorkerStorage::price_feed(env).unwrap_or_panic(env, WorkerError::PriceFeedNotSet)
271
+ fn deposit_address(env: &Env) -> Option<Address> {
272
+ WorkerStorage::deposit_address(env)
268
273
  }
269
274
 
270
275
  /// Returns supported option types for a destination endpoint.
@@ -276,8 +281,13 @@ pub trait Worker: Auth {
276
281
  }
277
282
 
278
283
  /// Returns the worker fee library contract address.
279
- fn worker_fee_lib(env: &Env) -> Address {
280
- WorkerStorage::worker_fee_lib(env).unwrap_or_panic(env, WorkerError::WorkerFeeLibNotSet)
284
+ fn worker_fee_lib(env: &Env) -> Option<Address> {
285
+ WorkerStorage::worker_fee_lib(env)
286
+ }
287
+
288
+ /// Returns the price feed contract address.
289
+ fn price_feed(env: &Env) -> Option<Address> {
290
+ WorkerStorage::price_feed(env)
281
291
  }
282
292
  }
283
293
 
@@ -305,16 +315,8 @@ pub fn init_worker<T: Worker>(
305
315
  worker_fee_lib: &Address,
306
316
  deposit_address: &Address,
307
317
  ) {
308
- assert_with_error!(env, T::admins(env).is_empty(), WorkerError::ReInitialize);
309
- assert_with_error!(env, !admins.is_empty(), WorkerError::NoAdminsProvided);
310
-
311
- for admin in admins {
312
- set_admin_no_auth::<T>(env, &admin, true);
313
- }
314
-
315
- for lib in message_libs {
316
- set_message_lib_no_auth::<T>(env, &lib, true);
317
- }
318
+ admins.iter().for_each(|admin| set_admin_no_auth::<T>(env, &admin, true));
319
+ message_libs.iter().for_each(|lib| set_message_lib_no_auth::<T>(env, &lib, true));
318
320
 
319
321
  set_price_feed_no_auth(env, price_feed);
320
322
  set_default_multiplier_bps_no_auth(env, default_multiplier_bps);
@@ -373,16 +375,6 @@ pub fn assert_supported_message_lib<T: Worker>(env: &Env, message_lib: &Address)
373
375
  // Admin Setter Functions with authentication
374
376
  // ============================================================================================
375
377
 
376
- /// Sets admin status for an address by authorizer (owner/multisig).
377
- ///
378
- /// # Arguments
379
- /// * `admin` - The address to set admin status for
380
- /// * `active` - `true` to add admin, `false` to remove
381
- pub fn set_admin_by_owner<T: Worker>(env: &Env, admin: &Address, active: bool) {
382
- require_auth::<T>(env);
383
- set_admin_no_auth::<T>(env, admin, active);
384
- }
385
-
386
378
  /// Sets admin status for an address by admin.
387
379
  ///
388
380
  /// # Arguments
@@ -414,7 +406,6 @@ fn set_admin_no_auth<T: Worker>(env: &Env, admin: &Address, active: bool) {
414
406
  admins.push_back(admin.clone());
415
407
  } else {
416
408
  // Remove admin - ensure present
417
- assert_with_error!(env, admins.len() > 1, WorkerError::AttemptingToRemoveOnlyAdmin);
418
409
  let Some(index) = admins.first_index_of(admin) else {
419
410
  panic_with_error!(env, WorkerError::AdminNotFound);
420
411
  };
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@layerzerolabs/protocol-stellar-v2",
3
- "version": "0.2.19",
3
+ "version": "0.2.20",
4
4
  "private": false,
5
5
  "devDependencies": {
6
6
  "@types/node": "^22.18.6",
7
7
  "tsx": "^4.19.3",
8
8
  "typescript": "^5.8.2",
9
- "@layerzerolabs/common-node-utils": "0.2.19",
10
- "@layerzerolabs/vm-tooling-stellar": "0.2.19"
9
+ "@layerzerolabs/common-node-utils": "0.2.20",
10
+ "@layerzerolabs/vm-tooling-stellar": "0.2.20"
11
11
  },
12
12
  "publishConfig": {
13
13
  "access": "restricted",