@layerzerolabs/protocol-stellar-v2 0.2.18 → 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 (213) hide show
  1. package/.turbo/turbo-build.log +303 -253
  2. package/.turbo/turbo-lint.log +66 -65
  3. package/.turbo/turbo-test.log +1312 -1282
  4. package/Cargo.lock +21 -8
  5. package/Cargo.toml +2 -0
  6. package/contracts/ERROR_SPEC.md +9 -2
  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 +23 -7
  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/oapp_receiver.rs +1 -1
  19. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +113 -65
  20. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +111 -82
  21. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +293 -65
  22. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +331 -56
  23. package/contracts/oapps/oft/Cargo.toml +10 -7
  24. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
  25. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
  26. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
  27. package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
  28. package/contracts/oapps/oft/integration-tests/setup.rs +28 -127
  29. package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
  30. package/contracts/oapps/oft/src/extensions/oft_fee.rs +23 -8
  31. package/contracts/oapps/oft/src/extensions/pausable.rs +19 -4
  32. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +52 -28
  33. package/contracts/oapps/oft/src/lib.rs +10 -14
  34. package/contracts/oapps/oft/src/oft.rs +143 -193
  35. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -11
  36. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +12 -14
  37. package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
  38. package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
  39. package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
  40. package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +126 -29
  41. package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
  42. package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
  43. package/contracts/oapps/oft-core/src/lib.rs +18 -0
  44. package/contracts/oapps/oft-core/src/oft_core.rs +479 -0
  45. package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
  46. package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
  47. package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -4
  48. package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
  49. package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +46 -27
  50. package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
  51. package/contracts/upgrader/src/lib.rs +30 -57
  52. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  53. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  54. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  55. package/contracts/utils/src/buffer_reader.rs +1 -0
  56. package/contracts/utils/src/errors.rs +8 -2
  57. package/contracts/utils/src/ownable.rs +125 -3
  58. package/contracts/utils/src/tests/option_ext.rs +1 -1
  59. package/contracts/utils/src/tests/ownable.rs +445 -7
  60. package/contracts/utils/src/tests/ttl_configurable.rs +2 -2
  61. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  62. package/contracts/utils/src/ttl_configurable.rs +3 -3
  63. package/contracts/utils/src/upgradeable.rs +48 -23
  64. package/contracts/workers/dvn/Cargo.toml +1 -0
  65. package/contracts/workers/dvn/src/auth.rs +12 -42
  66. package/contracts/workers/dvn/src/dvn.rs +16 -31
  67. package/contracts/workers/dvn/src/errors.rs +0 -1
  68. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  69. package/contracts/workers/dvn/src/lib.rs +4 -3
  70. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  71. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  72. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  73. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  74. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  75. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  76. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -5
  77. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +2 -3
  78. package/contracts/workers/executor/Cargo.toml +1 -0
  79. package/contracts/workers/executor/src/executor.rs +15 -26
  80. package/contracts/workers/executor-fee-lib/Cargo.toml +2 -1
  81. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +63 -5
  82. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  83. package/contracts/workers/executor-fee-lib/src/lib.rs +3 -0
  84. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  85. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  86. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  87. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  88. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  89. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  90. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  91. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  92. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  93. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  94. package/contracts/workers/price-feed/Cargo.toml +2 -1
  95. package/contracts/workers/price-feed/src/events.rs +1 -1
  96. package/contracts/workers/price-feed/src/lib.rs +3 -0
  97. package/contracts/workers/price-feed/src/price_feed.rs +6 -12
  98. package/contracts/workers/price-feed/src/storage.rs +1 -1
  99. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  100. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  101. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  102. package/contracts/workers/price-feed/src/types.rs +1 -1
  103. package/contracts/workers/worker/src/errors.rs +0 -3
  104. package/contracts/workers/worker/src/lib.rs +0 -2
  105. package/contracts/workers/worker/src/storage.rs +32 -29
  106. package/contracts/workers/worker/src/tests/setup.rs +1 -7
  107. package/contracts/workers/worker/src/tests/worker.rs +50 -42
  108. package/contracts/workers/worker/src/worker.rs +49 -58
  109. package/package.json +4 -5
  110. package/sdk/.turbo/turbo-test.log +229 -217
  111. package/sdk/dist/generated/bml.d.ts +39 -1
  112. package/sdk/dist/generated/bml.js +33 -8
  113. package/sdk/dist/generated/counter.d.ts +131 -3
  114. package/sdk/dist/generated/counter.js +41 -10
  115. package/sdk/dist/generated/dvn.d.ts +431 -362
  116. package/sdk/dist/generated/dvn.js +80 -55
  117. package/sdk/dist/generated/dvn_fee_lib.d.ts +327 -251
  118. package/sdk/dist/generated/dvn_fee_lib.js +55 -57
  119. package/sdk/dist/generated/endpoint.d.ts +131 -3
  120. package/sdk/dist/generated/endpoint.js +41 -10
  121. package/sdk/dist/generated/executor.d.ts +503 -339
  122. package/sdk/dist/generated/executor.js +80 -48
  123. package/sdk/dist/generated/executor_fee_lib.d.ts +395 -319
  124. package/sdk/dist/generated/executor_fee_lib.js +54 -56
  125. package/sdk/dist/generated/executor_helper.d.ts +53 -187
  126. package/sdk/dist/generated/executor_helper.js +47 -29
  127. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  128. package/sdk/dist/generated/layerzero_view.js +294 -0
  129. package/sdk/dist/generated/oft.d.ts +1851 -0
  130. package/sdk/dist/generated/oft.js +347 -0
  131. package/sdk/dist/generated/price_feed.d.ts +329 -253
  132. package/sdk/dist/generated/price_feed.js +55 -57
  133. package/sdk/dist/generated/sml.d.ts +131 -3
  134. package/sdk/dist/generated/sml.js +41 -10
  135. package/sdk/dist/generated/treasury.d.ts +131 -3
  136. package/sdk/dist/generated/treasury.js +41 -10
  137. package/sdk/dist/generated/uln302.d.ts +131 -3
  138. package/sdk/dist/generated/uln302.js +43 -12
  139. package/sdk/dist/generated/upgrader.d.ts +201 -15
  140. package/sdk/dist/generated/upgrader.js +99 -1
  141. package/sdk/dist/index.d.ts +2 -2
  142. package/sdk/dist/index.js +3 -3
  143. package/sdk/package.json +3 -2
  144. package/sdk/src/index.ts +3 -3
  145. package/sdk/test/oft-sml.test.ts +20 -20
  146. package/sdk/test/upgrader.test.ts +2 -3
  147. package/sdk/turbo.json +8 -0
  148. package/tools/ts-bindings-gen/Cargo.toml +2 -0
  149. package/tools/ts-bindings-gen/src/main.rs +53 -5
  150. package/turbo.json +0 -2
  151. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
  152. package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
  153. package/contracts/oapps/oft/src/oft_impl.rs +0 -201
  154. package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
  155. package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -917
  156. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -751
  157. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -434
  158. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1080
  159. package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
  160. package/contracts/oapps/oft-std/src/lib.rs +0 -16
  161. package/contracts/oapps/oft-std/src/oft.rs +0 -174
  162. package/sdk/dist/generated/oft_std.d.ts +0 -1722
  163. package/sdk/dist/generated/oft_std.js +0 -316
  164. package/sdk/dist/wasm/blocked-message-lib.d.ts +0 -1
  165. package/sdk/dist/wasm/blocked-message-lib.js +0 -2
  166. package/sdk/dist/wasm/counter.d.ts +0 -1
  167. package/sdk/dist/wasm/counter.js +0 -2
  168. package/sdk/dist/wasm/dvn-fee-lib.d.ts +0 -1
  169. package/sdk/dist/wasm/dvn-fee-lib.js +0 -2
  170. package/sdk/dist/wasm/dvn.d.ts +0 -1
  171. package/sdk/dist/wasm/dvn.js +0 -2
  172. package/sdk/dist/wasm/endpoint-v2.d.ts +0 -1
  173. package/sdk/dist/wasm/endpoint-v2.js +0 -2
  174. package/sdk/dist/wasm/executor-fee-lib.d.ts +0 -1
  175. package/sdk/dist/wasm/executor-fee-lib.js +0 -2
  176. package/sdk/dist/wasm/executor-helper.d.ts +0 -1
  177. package/sdk/dist/wasm/executor-helper.js +0 -2
  178. package/sdk/dist/wasm/executor.d.ts +0 -1
  179. package/sdk/dist/wasm/executor.js +0 -2
  180. package/sdk/dist/wasm/layerzero-views.d.ts +0 -1
  181. package/sdk/dist/wasm/layerzero-views.js +0 -2
  182. package/sdk/dist/wasm/oft-std.d.ts +0 -1
  183. package/sdk/dist/wasm/oft-std.js +0 -2
  184. package/sdk/dist/wasm/price-feed.d.ts +0 -1
  185. package/sdk/dist/wasm/price-feed.js +0 -2
  186. package/sdk/dist/wasm/simple-message-lib.d.ts +0 -1
  187. package/sdk/dist/wasm/simple-message-lib.js +0 -2
  188. package/sdk/dist/wasm/treasury.d.ts +0 -1
  189. package/sdk/dist/wasm/treasury.js +0 -2
  190. package/sdk/dist/wasm/uln302.d.ts +0 -1
  191. package/sdk/dist/wasm/uln302.js +0 -2
  192. package/sdk/dist/wasm/upgrader.d.ts +0 -1
  193. package/sdk/dist/wasm/upgrader.js +0 -2
  194. package/sdk/dist/wasm.d.ts +0 -15
  195. package/sdk/dist/wasm.js +0 -15
  196. /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
  197. /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
  198. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
  199. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
  200. /package/contracts/oapps/{oft → oft-core}/src/errors.rs +0 -0
  201. /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
  202. /package/contracts/oapps/{oft → oft-core}/src/storage.rs +0 -0
  203. /package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +0 -0
  204. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
  205. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
  206. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
  207. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
  208. /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
  209. /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
  210. /package/contracts/oapps/{oft → oft-core}/src/types.rs +0 -0
  211. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  212. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  213. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -1,8 +1,8 @@
1
1
  use crate::dvn_fee_lib::{
2
2
  apply_premium, get_call_data_size, DvnFeeLib, BPS_BASE, EXECUTE_FIXED_BYTES, NATIVE_DECIMALS_RATE, VERIFY_BYTES,
3
3
  };
4
+ use fee_lib_interfaces::{DvnFeeParams, FeeEstimate, IDvnFeeLib};
4
5
  use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, Bytes, Env};
5
- use worker::{interfaces::FeeEstimate, DvnFeeParams, IDvnFeeLib};
6
6
 
7
7
  #[test]
8
8
  fn get_call_data_size_pads_signatures() {
@@ -108,8 +108,7 @@ fn get_fee_panics_when_options_not_empty() {
108
108
  env.mock_all_auths();
109
109
  let owner = Address::generate(&env);
110
110
  let fee_lib_addr = env.register(DvnFeeLib, (&owner,));
111
- let mut options = Bytes::new(&env);
112
- options.push_back(1u8);
111
+ let options = Bytes::from_slice(&env, &[1u8]);
113
112
 
114
113
  let params = DvnFeeParams {
115
114
  sender: Address::generate(&env),
@@ -19,6 +19,7 @@ soroban-sdk = { workspace = true }
19
19
  # workspace dependencies
20
20
  utils = { workspace = true }
21
21
  worker = { workspace = true }
22
+ fee-lib-interfaces = { workspace = true }
22
23
  common-macros = { workspace = true }
23
24
  message-lib-common = { workspace = true }
24
25
  endpoint-v2 = { workspace = true, features = ["library"] }
@@ -7,12 +7,13 @@ use crate::{
7
7
  };
8
8
  use common_macros::{contract_impl, lz_contract};
9
9
  use endpoint_v2::{FeeRecipient, LayerZeroEndpointV2Client, Origin};
10
+ use fee_lib_interfaces::{ExecutorFeeLibClient, FeeParams};
10
11
  use message_lib_common::interfaces::ILayerZeroExecutor;
11
12
  use soroban_sdk::{token::TokenClient, vec, Address, Bytes, BytesN, Env, Vec};
12
13
  use utils::{option_ext::OptionExt, upgradeable::UpgradeableInternal};
13
14
  use worker::{
14
- assert_acl, assert_not_paused, assert_supported_message_lib, init_worker, require_admin_auth, set_admin_by_owner,
15
- ExecutorFeeLibClient, FeeParams, Worker,
15
+ assert_acl, assert_not_paused, assert_supported_message_lib, errors::WorkerError, init_worker, require_admin_auth,
16
+ Worker,
16
17
  };
17
18
 
18
19
  /// LayerZero Executor contract for cross-chain message execution.
@@ -68,17 +69,6 @@ impl LzExecutor {
68
69
  require_admin_auth::<Self>(env, admin);
69
70
  TokenClient::new(env, token).transfer(&env.current_contract_address(), to, &amount);
70
71
  }
71
-
72
- /// Sets admin status for an address. Requires owner authorization.
73
- ///
74
- /// This is the multisig/quorum path for admin management.
75
- ///
76
- /// # Arguments
77
- /// * `admin` - The address to set admin status for
78
- /// * `active` - Whether the address should be an admin
79
- pub fn set_admin(env: &Env, admin: &Address, active: bool) {
80
- set_admin_by_owner::<Self>(env, admin, active);
81
- }
82
72
  }
83
73
 
84
74
  // ============================================================================
@@ -91,9 +81,7 @@ impl IExecutor for LzExecutor {
91
81
  fn set_dst_config(env: &Env, admin: &Address, params: &Vec<SetDstConfigParam>) {
92
82
  require_admin_auth::<Self>(env, admin);
93
83
 
94
- for param in params {
95
- ExecutorStorage::set_dst_config(env, param.dst_eid, &param.dst_config);
96
- }
84
+ params.iter().for_each(|param| ExecutorStorage::set_dst_config(env, param.dst_eid, &param.dst_config));
97
85
  DstConfigSet { params: params.clone() }.publish(env);
98
86
  }
99
87
 
@@ -121,9 +109,9 @@ impl IExecutor for LzExecutor {
121
109
 
122
110
  // Transfer native tokens from admin to each receiver and track success/failure
123
111
  let mut success = vec![env];
124
- for param in native_drop_params {
125
- success.push_back(token_client.try_transfer(admin, &param.receiver, &param.amount).is_ok());
126
- }
112
+ native_drop_params.iter().for_each(|param| {
113
+ success.push_back(token_client.try_transfer(admin, &param.receiver, &param.amount).is_ok())
114
+ });
127
115
 
128
116
  // Emit event with transfer results
129
117
  NativeDropApplied {
@@ -162,7 +150,8 @@ impl ILayerZeroExecutor for LzExecutor {
162
150
  // `get_fee` already asserts not_paused and acl, so we don't need to do it here again
163
151
 
164
152
  let fee = Self::get_fee(env, send_lib, sender, dst_eid, calldata_size, options);
165
- FeeRecipient { amount: fee, to: Self::deposit_address(env) }
153
+ let deposit_address = Self::deposit_address(env).unwrap_or_panic(env, WorkerError::DepositAddressNotSet);
154
+ FeeRecipient { amount: fee, to: deposit_address }
166
155
  }
167
156
 
168
157
  /// Calculates the execution fee for a cross-chain message.
@@ -178,12 +167,14 @@ impl ILayerZeroExecutor for LzExecutor {
178
167
  assert_acl::<Self>(env, sender);
179
168
 
180
169
  let dst_config = Self::dst_config(env, dst_eid).unwrap_or_panic(env, ExecutorError::EidNotSupported);
170
+ let price_feed = Self::price_feed(env).unwrap_or_panic(env, WorkerError::PriceFeedNotSet);
171
+ let worker_fee_lib = Self::worker_fee_lib(env).unwrap_or_panic(env, WorkerError::WorkerFeeLibNotSet);
181
172
  let fee_params = FeeParams {
182
173
  sender: sender.clone(),
183
174
  dst_eid,
184
175
  calldata_size,
185
176
  options: options.clone(),
186
- price_feed: Self::price_feed(env),
177
+ price_feed,
187
178
  default_multiplier_bps: Self::default_multiplier_bps(env),
188
179
  lz_receive_base_gas: dst_config.lz_receive_base_gas,
189
180
  lz_compose_base_gas: dst_config.lz_compose_base_gas,
@@ -192,7 +183,7 @@ impl ILayerZeroExecutor for LzExecutor {
192
183
  multiplier_bps: dst_config.multiplier_bps,
193
184
  };
194
185
 
195
- ExecutorFeeLibClient::new(env, &Self::worker_fee_lib(env)).get_fee(&env.current_contract_address(), &fee_params)
186
+ ExecutorFeeLibClient::new(env, &worker_fee_lib).get_fee(&env.current_contract_address(), &fee_params)
196
187
  }
197
188
  }
198
189
 
@@ -207,12 +198,10 @@ impl Worker for LzExecutor {}
207
198
  // Upgradeable Implementation
208
199
  // ============================================================================
209
200
 
201
+ /// No migration logic needed for initial upgrade capability
210
202
  impl UpgradeableInternal for LzExecutor {
211
203
  type MigrationData = ();
212
-
213
- fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
214
- // No migration logic needed for initial upgrade capability
215
- }
204
+ fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {}
216
205
  }
217
206
 
218
207
  // ============================================================================
@@ -13,10 +13,11 @@ doctest = false
13
13
  soroban-sdk = { workspace = true }
14
14
  # workspace dependencies
15
15
  utils = { workspace = true }
16
- worker = { workspace = true }
16
+ fee-lib-interfaces = { workspace = true }
17
17
  common-macros = { workspace = true }
18
18
  message-lib-common = { workspace = true }
19
19
 
20
20
  [dev-dependencies]
21
21
  soroban-sdk = { workspace = true, features = ["testutils"] }
22
+ utils = { workspace = true, features = ["testutils"] }
22
23
 
@@ -1,8 +1,8 @@
1
1
  use crate::{errors::ExecutorFeeLibError, executor_option};
2
2
  use common_macros::{contract_impl, lz_contract};
3
+ use fee_lib_interfaces::{FeeParams, IExecutorFeeLib, LayerZeroPriceFeedClient};
3
4
  use soroban_sdk::{assert_with_error, Address, Bytes, Env};
4
5
  use utils::upgradeable::UpgradeableInternal;
5
- use worker::{FeeParams, IExecutorFeeLib, LayerZeroPriceFeedClient};
6
6
 
7
7
  // ============================================================================
8
8
  // Constants
@@ -110,12 +110,10 @@ impl IExecutorFeeLib for ExecutorFeeLib {
110
110
  // Upgradeable Implementation
111
111
  // ============================================================================
112
112
 
113
+ /// No migration logic needed for initial upgrade capability
113
114
  impl UpgradeableInternal for ExecutorFeeLib {
114
115
  type MigrationData = ();
115
-
116
- fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
117
- // No migration logic needed for initial upgrade capability
118
- }
116
+ fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {}
119
117
  }
120
118
 
121
119
  // ========================================================================
@@ -245,3 +243,63 @@ fn safe_u128_to_i128(env: &Env, value: u128) -> i128 {
245
243
  assert_with_error!(env, value <= i128::MAX as u128, ExecutorFeeLibError::Overflow);
246
244
  value as i128
247
245
  }
246
+
247
+ // ============================================================================
248
+ // Test-only Functions
249
+ // ============================================================================
250
+
251
+ #[cfg(test)]
252
+ mod test {
253
+ use super::*;
254
+
255
+ impl ExecutorFeeLib {
256
+ /// Test-only wrapper for `decode_executor_options` to enable unit testing.
257
+ pub fn decode_executor_options_for_test(
258
+ env: &Env,
259
+ options: &Bytes,
260
+ dst_eid: u32,
261
+ lz_receive_base_gas: u64,
262
+ lz_compose_base_gas: u64,
263
+ native_cap: u128,
264
+ ) -> (u128, u128) {
265
+ super::decode_executor_options(env, options, dst_eid, lz_receive_base_gas, lz_compose_base_gas, native_cap)
266
+ }
267
+
268
+ /// Test-only wrapper for `get_effective_multiplier_bps`.
269
+ pub fn get_effective_multiplier_bps_for_test(_env: &Env, params: &FeeParams) -> u32 {
270
+ super::get_effective_multiplier_bps(params)
271
+ }
272
+
273
+ /// Test-only wrapper for `apply_premium_to_gas`.
274
+ pub fn apply_premium_to_gas_for_test(
275
+ env: &Env,
276
+ fee: i128,
277
+ multiplier_bps: u32,
278
+ margin_usd: u128,
279
+ native_price_usd: u128,
280
+ ) -> i128 {
281
+ super::apply_premium_to_gas(env, fee, multiplier_bps, margin_usd, native_price_usd)
282
+ }
283
+
284
+ /// Test-only wrapper for `convert_and_apply_premium_to_value`.
285
+ pub fn convert_and_apply_premium_to_value_for_test(
286
+ env: &Env,
287
+ value: u128,
288
+ ratio: u128,
289
+ denom: u128,
290
+ multiplier_bps: u32,
291
+ ) -> i128 {
292
+ super::convert_and_apply_premium_to_value(env, value, ratio, denom, multiplier_bps)
293
+ }
294
+
295
+ /// Test-only wrapper for `is_v1_eid`.
296
+ pub fn is_v1_eid_for_test(_env: &Env, eid: u32) -> bool {
297
+ super::is_v1_eid(eid)
298
+ }
299
+
300
+ /// Test-only wrapper for `safe_u128_to_i128`.
301
+ pub fn safe_u128_to_i128_for_test(env: &Env, value: u128) -> i128 {
302
+ super::safe_u128_to_i128(env, value)
303
+ }
304
+ }
305
+ }
@@ -80,7 +80,6 @@ pub fn parse_executor_options(env: &Env, options: &Bytes, is_v1_eid: bool, nativ
80
80
  agg_options.num_lz_compose += 1;
81
81
  }
82
82
  EXECUTOR_OPTION_TYPE_ORDERED_EXECUTION => {
83
- assert_with_error!(env, option_data.is_empty(), ExecutorFeeLibError::InvalidExecutorOptions);
84
83
  agg_options.ordered = true;
85
84
  }
86
85
  _ => {
@@ -201,3 +200,31 @@ fn decode_lz_compose_option(env: &Env, option: &Bytes) -> (u16, u128, u128) {
201
200
 
202
201
  (index, gas, value)
203
202
  }
203
+
204
+ // ========================================================
205
+ // Test-only wrappers for internal helper functions
206
+ // ========================================================
207
+ //
208
+ // These allow unit tests under `src/tests/...` (a sibling module of `executor_option`)
209
+ // to exercise internal helpers without changing their visibility in production builds.
210
+ #[cfg(test)]
211
+ #[allow(dead_code)]
212
+ pub(crate) mod test {
213
+ use super::*;
214
+
215
+ pub fn next_executor_option_for_test(reader: &mut BufferReader) -> (u8, Bytes) {
216
+ super::next_executor_option(reader)
217
+ }
218
+
219
+ pub fn decode_lz_receive_option_for_test(env: &Env, option: &Bytes) -> (u128, u128) {
220
+ super::decode_lz_receive_option(env, option)
221
+ }
222
+
223
+ pub fn decode_native_drop_option_for_test(env: &Env, option: &Bytes) -> (u128, BytesN<32>) {
224
+ super::decode_native_drop_option(env, option)
225
+ }
226
+
227
+ pub fn decode_lz_compose_option_for_test(env: &Env, option: &Bytes) -> (u16, u128, u128) {
228
+ super::decode_lz_compose_option(env, option)
229
+ }
230
+ }
@@ -5,3 +5,6 @@ pub mod executor_fee_lib;
5
5
  pub mod executor_option;
6
6
 
7
7
  pub use executor_fee_lib::{ExecutorFeeLib, ExecutorFeeLibClient};
8
+
9
+ #[cfg(test)]
10
+ mod tests;