@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.21

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 (249) hide show
  1. package/.turbo/turbo-build.log +795 -791
  2. package/.turbo/turbo-lint.log +325 -155
  3. package/.turbo/turbo-test.log +1398 -1277
  4. package/Cargo.lock +122 -111
  5. package/Cargo.toml +32 -16
  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 +18 -7
  9. package/contracts/common-macros/src/lib.rs +31 -14
  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/contract_ttl.rs +1 -1
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -14
  18. package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
  19. package/contracts/common-macros/src/ttl_configurable.rs +2 -10
  20. package/contracts/common-macros/src/ttl_extendable.rs +2 -10
  21. package/contracts/common-macros/src/upgradeable.rs +61 -26
  22. package/contracts/common-macros/src/utils.rs +0 -9
  23. package/contracts/endpoint-v2/src/lib.rs +3 -2
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
  30. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
  31. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
  32. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
  33. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
  34. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
  35. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
  36. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
  37. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
  38. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
  39. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
  40. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
  41. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
  42. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
  43. package/contracts/layerzero-views/Cargo.toml +0 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
  45. package/contracts/macro-integration-tests/Cargo.toml +5 -15
  46. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
  47. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
  48. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
  49. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
  50. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
  51. package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
  52. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
  53. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
  54. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
  55. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
  56. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
  57. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
  58. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
  59. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
  60. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
  61. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
  62. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
  63. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
  64. package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
  65. package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
  66. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
  67. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
  68. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
  69. package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
  70. package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
  71. package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
  72. package/contracts/message-libs/treasury/Cargo.toml +0 -2
  73. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
  74. package/contracts/message-libs/uln-302/src/events.rs +4 -0
  75. package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
  76. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
  77. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
  78. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
  79. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
  80. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
  81. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +21 -67
  82. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  83. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
  84. package/contracts/oapps/counter/Cargo.toml +5 -6
  85. package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
  86. package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
  89. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
  90. package/contracts/oapps/oapp/src/lib.rs +1 -0
  91. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
  92. package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
  93. package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
  94. package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
  95. package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
  96. package/contracts/oapps/oapp/src/tests/oapp_core.rs +223 -0
  97. package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +240 -0
  98. package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +381 -0
  99. package/contracts/oapps/oapp/src/tests/oapp_sender.rs +569 -0
  100. package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
  101. package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
  102. package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
  103. package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
  104. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
  105. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
  106. package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
  107. package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
  108. package/contracts/oapps/oft/src/extensions/oft_fee.rs +153 -75
  109. package/contracts/oapps/oft/src/extensions/pausable.rs +61 -12
  110. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +198 -134
  111. package/contracts/oapps/oft/src/oft.rs +45 -50
  112. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  113. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +4 -26
  114. package/contracts/oapps/oft-core/Cargo.toml +1 -4
  115. package/contracts/oapps/oft-core/integration-tests/setup.rs +3 -3
  116. package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
  117. package/contracts/oapps/oft-core/src/errors.rs +3 -2
  118. package/contracts/oapps/oft-core/src/events.rs +6 -0
  119. package/contracts/oapps/oft-core/src/lib.rs +1 -1
  120. package/contracts/oapps/oft-core/src/oft_core.rs +341 -246
  121. package/contracts/oapps/oft-core/src/storage.rs +7 -3
  122. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
  123. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
  124. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
  125. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
  126. package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
  127. package/contracts/oapps/oft-core/src/tests/test_utils.rs +61 -16
  128. package/contracts/upgrader/src/lib.rs +30 -57
  129. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  130. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  131. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  132. package/contracts/utils/Cargo.toml +0 -1
  133. package/contracts/utils/src/buffer_reader.rs +1 -0
  134. package/contracts/utils/src/errors.rs +4 -2
  135. package/contracts/utils/src/multisig.rs +17 -8
  136. package/contracts/utils/src/ownable.rs +6 -6
  137. package/contracts/utils/src/testing_utils.rs +124 -54
  138. package/contracts/utils/src/tests/multisig.rs +12 -12
  139. package/contracts/utils/src/tests/ownable.rs +6 -6
  140. package/contracts/utils/src/tests/testing_utils.rs +50 -167
  141. package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
  142. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  143. package/contracts/utils/src/ttl_configurable.rs +13 -7
  144. package/contracts/utils/src/upgradeable.rs +48 -23
  145. package/contracts/workers/dvn/Cargo.toml +6 -6
  146. package/contracts/workers/dvn/src/auth.rs +12 -42
  147. package/contracts/workers/dvn/src/dvn.rs +15 -40
  148. package/contracts/workers/dvn/src/errors.rs +0 -1
  149. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  150. package/contracts/workers/dvn/src/lib.rs +4 -3
  151. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  152. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  153. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  154. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  155. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  156. package/contracts/workers/dvn-fee-lib/Cargo.toml +2 -2
  157. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +38 -22
  158. package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
  159. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +17 -16
  160. package/contracts/workers/executor/Cargo.toml +4 -0
  161. package/contracts/workers/executor/src/executor.rs +15 -36
  162. package/contracts/workers/executor/src/lib.rs +2 -2
  163. package/contracts/workers/executor/src/tests/auth.rs +394 -0
  164. package/contracts/workers/executor/src/tests/executor.rs +410 -0
  165. package/contracts/workers/executor/src/tests/mod.rs +3 -0
  166. package/contracts/workers/executor/src/tests/setup.rs +250 -0
  167. package/contracts/workers/executor-fee-lib/Cargo.toml +7 -1
  168. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +62 -15
  169. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  170. package/contracts/workers/executor-fee-lib/src/lib.rs +11 -2
  171. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  172. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  173. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  174. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  175. package/contracts/workers/executor-helper/Cargo.toml +0 -1
  176. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  177. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  178. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  179. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  180. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  181. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  182. package/contracts/workers/price-feed/Cargo.toml +7 -1
  183. package/contracts/workers/price-feed/src/events.rs +1 -1
  184. package/contracts/workers/price-feed/src/lib.rs +12 -4
  185. package/contracts/workers/price-feed/src/price_feed.rs +5 -21
  186. package/contracts/workers/price-feed/src/storage.rs +1 -1
  187. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  188. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  189. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  190. package/contracts/workers/price-feed/src/types.rs +1 -1
  191. package/contracts/workers/worker/src/errors.rs +1 -4
  192. package/contracts/workers/worker/src/lib.rs +0 -2
  193. package/contracts/workers/worker/src/storage.rs +32 -29
  194. package/contracts/workers/worker/src/tests/setup.rs +2 -8
  195. package/contracts/workers/worker/src/tests/worker.rs +96 -74
  196. package/contracts/workers/worker/src/worker.rs +75 -75
  197. package/docs/error-spec.md +55 -0
  198. package/docs/layerzero-v2-on-stellar.md +447 -0
  199. package/docs/oapp-guide.md +212 -0
  200. package/docs/oft-guide.md +314 -0
  201. package/package.json +3 -3
  202. package/sdk/.turbo/turbo-test.log +268 -263
  203. package/sdk/dist/generated/bml.d.ts +12 -4
  204. package/sdk/dist/generated/bml.js +9 -7
  205. package/sdk/dist/generated/counter.d.ts +306 -298
  206. package/sdk/dist/generated/counter.js +48 -46
  207. package/sdk/dist/generated/dvn.d.ts +450 -411
  208. package/sdk/dist/generated/dvn.js +66 -64
  209. package/sdk/dist/generated/dvn_fee_lib.d.ts +294 -338
  210. package/sdk/dist/generated/dvn_fee_lib.js +33 -64
  211. package/sdk/dist/generated/endpoint.d.ts +108 -100
  212. package/sdk/dist/generated/endpoint.js +21 -19
  213. package/sdk/dist/generated/executor.d.ts +414 -370
  214. package/sdk/dist/generated/executor.js +58 -55
  215. package/sdk/dist/generated/executor_fee_lib.d.ts +333 -377
  216. package/sdk/dist/generated/executor_fee_lib.js +34 -65
  217. package/sdk/dist/generated/executor_helper.d.ts +26 -190
  218. package/sdk/dist/generated/executor_helper.js +23 -28
  219. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  220. package/sdk/dist/generated/layerzero_view.js +294 -0
  221. package/sdk/dist/generated/oft.d.ts +408 -385
  222. package/sdk/dist/generated/oft.js +89 -92
  223. package/sdk/dist/generated/price_feed.d.ts +385 -429
  224. package/sdk/dist/generated/price_feed.js +50 -81
  225. package/sdk/dist/generated/sml.d.ts +108 -100
  226. package/sdk/dist/generated/sml.js +21 -19
  227. package/sdk/dist/generated/treasury.d.ts +108 -100
  228. package/sdk/dist/generated/treasury.js +21 -19
  229. package/sdk/dist/generated/uln302.d.ts +108 -100
  230. package/sdk/dist/generated/uln302.js +23 -21
  231. package/sdk/dist/generated/upgrader.d.ts +189 -18
  232. package/sdk/dist/generated/upgrader.js +84 -4
  233. package/sdk/dist/index.d.ts +1 -0
  234. package/sdk/dist/index.js +2 -0
  235. package/sdk/package.json +1 -1
  236. package/sdk/src/index.ts +3 -0
  237. package/sdk/test/oft-sml.test.ts +4 -4
  238. package/sdk/test/suites/localnet.ts +84 -20
  239. package/sdk/test/upgrader.test.ts +2 -3
  240. package/tools/ts-bindings-gen/src/main.rs +2 -1
  241. package/contracts/ERROR_SPEC.md +0 -44
  242. package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
  243. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -175
  244. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -212
  245. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -153
  246. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -294
  247. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  248. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  249. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -4,8 +4,8 @@ extern crate std;
4
4
 
5
5
  use crate::{dvn::LzDVN, tests::key_pair::KeyPair};
6
6
  use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, vec, Address, BytesN, Env, Vec};
7
- use utils::multisig::MultisigClient;
8
7
  use std::vec::Vec as StdVec;
8
+ use utils::multisig::MultisigClient;
9
9
 
10
10
  pub const VID: u32 = 1;
11
11
  pub const DEFAULT_MULTIPLIER_BPS: u32 = 10000;
@@ -33,9 +33,7 @@ impl<'a> TestSetup<'a> {
33
33
  let key_pairs: StdVec<KeyPair> = (0..signer_count).map(|_| KeyPair::generate()).collect();
34
34
 
35
35
  let mut signers: Vec<BytesN<20>> = vec![&env];
36
- for kp in &key_pairs {
37
- signers.push_back(kp.signer(&env));
38
- }
36
+ key_pairs.iter().for_each(|kp| signers.push_back(kp.signer(&env)));
39
37
 
40
38
  let admins: Vec<Address> = vec![&env, Address::generate(&env)];
41
39
  let supported_msglibs: Vec<Address> = vec![&env, Address::generate(&env)];
@@ -71,16 +69,14 @@ impl<'a> TestSetup<'a> {
71
69
  let key_pairs: StdVec<KeyPair> = (0..signer_count).map(|_| KeyPair::generate()).collect();
72
70
 
73
71
  let mut signers: Vec<BytesN<20>> = vec![&env];
74
- for kp in &key_pairs {
75
- signers.push_back(kp.signer(&env));
76
- }
72
+ key_pairs.iter().for_each(|kp| signers.push_back(kp.signer(&env)));
77
73
 
78
74
  let mut admins: Vec<Address> = vec![&env, Address::generate(&env)];
79
- for bytes in admin_bytes {
75
+ admin_bytes.into_iter().for_each(|bytes| {
80
76
  let bytes_n = BytesN::from_array(&env, &bytes);
81
77
  let addr = Address::from_payload(&env, AddressPayload::AccountIdPublicKeyEd25519(bytes_n));
82
78
  admins.push_back(addr);
83
- }
79
+ });
84
80
 
85
81
  let supported_msglibs: Vec<Address> = vec![&env, Address::generate(&env)];
86
82
  let price_feed: Address = Address::generate(&env);
@@ -14,11 +14,11 @@ crate-type = ["cdylib", "rlib"]
14
14
  doctest = false
15
15
 
16
16
  [dependencies]
17
+ cfg-if = { workspace = true }
17
18
  soroban-sdk = { workspace = true }
18
19
  common-macros = { workspace = true }
19
- message-lib-common = { workspace = true }
20
20
  utils = { workspace = true }
21
- worker = { workspace = true }
21
+ fee-lib-interfaces = { workspace = true }
22
22
 
23
23
  [dev-dependencies]
24
24
  soroban-sdk = { workspace = true, features = ["testutils"] }
@@ -1,34 +1,33 @@
1
1
  use crate::errors::DvnFeeLibError;
2
2
  use common_macros::{contract_impl, lz_contract};
3
+ use fee_lib_interfaces::{DvnFeeParams, IDvnFeeLib, LayerZeroPriceFeedClient};
3
4
  use soroban_sdk::{assert_with_error, Address, Env};
4
- use utils::upgradeable::UpgradeableInternal;
5
- use worker::{DvnFeeParams, IDvnFeeLib, LayerZeroPriceFeedClient};
6
5
 
7
6
  // ============================================================================
8
7
  // Constants
9
8
  // ============================================================================
10
9
 
11
10
  /// Basis points denominator (10000 = 100%).
12
- pub(crate) const BPS_BASE: i128 = 10000;
11
+ const BPS_BASE: i128 = 10000;
13
12
 
14
13
  /// Fixed bytes for execute function call.
15
- pub(crate) const EXECUTE_FIXED_BYTES: u32 = 260;
14
+ const EXECUTE_FIXED_BYTES: u32 = 260;
16
15
 
17
16
  /// Raw signature bytes length (65 bytes: 64 for signature + 1 for recovery ID).
18
- pub(crate) const SIGNATURE_RAW_BYTES: u32 = 65;
17
+ const SIGNATURE_RAW_BYTES: u32 = 65;
19
18
 
20
19
  /// Verify function bytes (padded).
21
- pub(crate) const VERIFY_BYTES: u32 = 288;
20
+ const VERIFY_BYTES: u32 = 288;
22
21
 
23
22
  /// Native token decimal rate for XLM (10^7 stroops per XLM).
24
- pub(crate) const NATIVE_DECIMALS_RATE: u128 = 10_000_000;
23
+ const NATIVE_DECIMALS_RATE: u128 = 10_000_000;
25
24
 
26
25
  /// DVN fee library contract for calculating DVN verification fees.
27
26
  ///
28
27
  /// Provides fee calculation logic based on quorum size, destination gas costs,
29
28
  /// and current gas prices from the price feed. Handles fee multipliers and
30
29
  /// floor margins.
31
- #[lz_contract(upgradeable)]
30
+ #[lz_contract(upgradeable(no_migration))]
32
31
  pub struct DvnFeeLib;
33
32
 
34
33
  #[contract_impl]
@@ -66,18 +65,6 @@ impl IDvnFeeLib for DvnFeeLib {
66
65
  }
67
66
  }
68
67
 
69
- // ============================================================================
70
- // Upgradeable Implementation
71
- // ============================================================================
72
-
73
- impl UpgradeableInternal for DvnFeeLib {
74
- type MigrationData = ();
75
-
76
- fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
77
- // No migration logic needed for initial upgrade capability
78
- }
79
- }
80
-
81
68
  // ============================================================================
82
69
  // Internal Helper Functions
83
70
  // ============================================================================
@@ -96,7 +83,7 @@ impl UpgradeableInternal for DvnFeeLib {
96
83
  ///
97
84
  /// # Returns
98
85
  /// Fee with premium applied (max of multiplier fee and margin fee).
99
- pub(crate) fn apply_premium(
86
+ fn apply_premium(
100
87
  env: &Env,
101
88
  fee: i128,
102
89
  multiplier_bps: u32,
@@ -128,7 +115,7 @@ pub(crate) fn apply_premium(
128
115
  ///
129
116
  /// # Returns
130
117
  /// Total calldata size in bytes.
131
- pub(crate) fn get_call_data_size(quorum: u32) -> u32 {
118
+ fn get_call_data_size(quorum: u32) -> u32 {
132
119
  let mut total_signature_bytes = quorum * SIGNATURE_RAW_BYTES;
133
120
  if !total_signature_bytes.is_multiple_of(32) {
134
121
  total_signature_bytes = total_signature_bytes - (total_signature_bytes % 32) + 32;
@@ -141,3 +128,32 @@ fn safe_u128_to_i128(env: &Env, value: u128) -> i128 {
141
128
  assert_with_error!(env, value <= i128::MAX as u128, DvnFeeLibError::Overflow);
142
129
  value as i128
143
130
  }
131
+
132
+ /// Test-only module exposing internal items for unit and integration tests.
133
+ #[cfg(test)]
134
+ pub(crate) mod test {
135
+ use super::*;
136
+
137
+ // Re-export constants for testing
138
+ pub const BPS_BASE: i128 = super::BPS_BASE;
139
+ pub const EXECUTE_FIXED_BYTES: u32 = super::EXECUTE_FIXED_BYTES;
140
+ pub const VERIFY_BYTES: u32 = super::VERIFY_BYTES;
141
+ pub const NATIVE_DECIMALS_RATE: u128 = super::NATIVE_DECIMALS_RATE;
142
+
143
+ /// Test-only wrapper for apply_premium to enable testing.
144
+ pub fn apply_premium_for_test(
145
+ env: &Env,
146
+ fee: i128,
147
+ multiplier_bps: u32,
148
+ default_multiplier_bps: u32,
149
+ floor_margin_usd: u128,
150
+ native_price_usd: u128,
151
+ ) -> i128 {
152
+ super::apply_premium(env, fee, multiplier_bps, default_multiplier_bps, floor_margin_usd, native_price_usd)
153
+ }
154
+
155
+ /// Test-only wrapper for get_call_data_size to enable testing.
156
+ pub fn get_call_data_size_for_test(quorum: u32) -> u32 {
157
+ super::get_call_data_size(quorum)
158
+ }
159
+ }
@@ -1,9 +1,19 @@
1
1
  #![no_std]
2
2
 
3
- pub mod dvn_fee_lib;
4
3
  pub mod errors;
5
4
 
6
- pub use dvn_fee_lib::{DvnFeeLib, DvnFeeLibClient};
5
+ cfg_if::cfg_if! {
6
+ // Include implementation when NOT in library mode, OR when testutils is enabled (for tests)
7
+ if #[cfg(any(not(feature = "library"), feature = "testutils"))] {
8
+ mod dvn_fee_lib;
9
+ // Export the contract and client for testing purposes
10
+ pub use dvn_fee_lib::{DvnFeeLib, DvnFeeLibClient};
11
+ }
12
+ }
13
+
14
+ // Re-export test helpers module for integration tests
15
+ #[cfg(test)]
16
+ use dvn_fee_lib::test;
7
17
 
8
18
  #[cfg(test)]
9
19
  extern crate std;
@@ -1,18 +1,20 @@
1
- use crate::dvn_fee_lib::{
2
- apply_premium, get_call_data_size, DvnFeeLib, BPS_BASE, EXECUTE_FIXED_BYTES, NATIVE_DECIMALS_RATE, VERIFY_BYTES,
1
+ use crate::test::{
2
+ apply_premium_for_test, get_call_data_size_for_test, BPS_BASE, EXECUTE_FIXED_BYTES, NATIVE_DECIMALS_RATE,
3
+ VERIFY_BYTES,
3
4
  };
5
+ use crate::DvnFeeLib;
6
+ use fee_lib_interfaces::{DvnFeeParams, FeeEstimate, IDvnFeeLib};
4
7
  use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, Bytes, Env};
5
- use worker::{interfaces::FeeEstimate, DvnFeeParams, IDvnFeeLib};
6
8
 
7
9
  #[test]
8
10
  fn get_call_data_size_pads_signatures() {
9
- let size = get_call_data_size(1);
11
+ let size = get_call_data_size_for_test(1);
10
12
  assert_eq!(size, EXECUTE_FIXED_BYTES + VERIFY_BYTES + 96 + 32);
11
13
 
12
- let size = get_call_data_size(2);
14
+ let size = get_call_data_size_for_test(2);
13
15
  assert_eq!(size, EXECUTE_FIXED_BYTES + VERIFY_BYTES + 160 + 32);
14
16
 
15
- let size = get_call_data_size(32);
17
+ let size = get_call_data_size_for_test(32);
16
18
  assert_eq!(size, EXECUTE_FIXED_BYTES + VERIFY_BYTES + 2080 + 32);
17
19
  }
18
20
 
@@ -22,7 +24,7 @@ fn apply_premium_multiplier_only_both_zero() {
22
24
  let fee = 1_000i128;
23
25
  let multiplier_bps = 15_000u32;
24
26
  // multiplier_bps is non-zero, so default_multiplier_bps is ignored
25
- let result = apply_premium(&env, fee, multiplier_bps, 10_000, 0, 0);
27
+ let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, 0, 0);
26
28
  assert_eq!(result, fee * multiplier_bps as i128 / BPS_BASE);
27
29
  }
28
30
 
@@ -31,7 +33,7 @@ fn apply_premium_multiplier_only_native_price_zero() {
31
33
  let env = Env::default();
32
34
  let fee = 1_000i128;
33
35
  let multiplier_bps = 15_000u32;
34
- let result = apply_premium(&env, fee, multiplier_bps, 10_000, 100, 0);
36
+ let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, 100, 0);
35
37
  assert_eq!(result, fee * multiplier_bps as i128 / BPS_BASE);
36
38
  }
37
39
 
@@ -40,7 +42,7 @@ fn apply_premium_multiplier_only_floor_margin_zero() {
40
42
  let env = Env::default();
41
43
  let fee = 1_000i128;
42
44
  let multiplier_bps = 15_000u32;
43
- let result = apply_premium(&env, fee, multiplier_bps, 10_000, 0, NATIVE_DECIMALS_RATE);
45
+ let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, 0, NATIVE_DECIMALS_RATE);
44
46
  assert_eq!(result, fee * multiplier_bps as i128 / BPS_BASE);
45
47
  }
46
48
 
@@ -50,7 +52,7 @@ fn apply_premium_uses_default_when_multiplier_zero() {
50
52
  let fee = 1_000i128;
51
53
  let default_bps = 12_000u32;
52
54
  // multiplier_bps is 0, so default_multiplier_bps should be used
53
- let result = apply_premium(&env, fee, 0, default_bps, 0, 0);
55
+ let result = apply_premium_for_test(&env, fee, 0, default_bps, 0, 0);
54
56
  assert_eq!(result, fee * default_bps as i128 / BPS_BASE);
55
57
  }
56
58
 
@@ -62,7 +64,7 @@ fn apply_premium_floor_margin_wins() {
62
64
  let floor_margin_usd = 10u128;
63
65
  let native_price_usd = NATIVE_DECIMALS_RATE;
64
66
 
65
- let result = apply_premium(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
67
+ let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
66
68
  assert_eq!(result, fee + floor_margin_usd as i128);
67
69
  }
68
70
 
@@ -74,7 +76,7 @@ fn apply_premium_multiplier_wins_over_small_floor() {
74
76
  let floor_margin_usd = 1u128;
75
77
  let native_price_usd = NATIVE_DECIMALS_RATE;
76
78
 
77
- let result = apply_premium(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
79
+ let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
78
80
  assert_eq!(result, 1_200);
79
81
  }
80
82
 
@@ -108,8 +110,7 @@ fn get_fee_panics_when_options_not_empty() {
108
110
  env.mock_all_auths();
109
111
  let owner = Address::generate(&env);
110
112
  let fee_lib_addr = env.register(DvnFeeLib, (&owner,));
111
- let mut options = Bytes::new(&env);
112
- options.push_back(1u8);
113
+ let options = Bytes::from_slice(&env, &[1u8]);
113
114
 
114
115
  let params = DvnFeeParams {
115
116
  sender: Address::generate(&env),
@@ -282,7 +283,7 @@ fn apply_premium_panics_on_overflow() {
282
283
  let env = Env::default();
283
284
  let fee = i128::MAX / 2;
284
285
  let multiplier_bps = 20_000u32;
285
- apply_premium(&env, fee, multiplier_bps, 10_000, u128::MAX, 1);
286
+ apply_premium_for_test(&env, fee, multiplier_bps, 10_000, u128::MAX, 1);
286
287
  }
287
288
 
288
289
  #[test]
@@ -293,6 +294,6 @@ fn apply_premium_floor_margin_truncates() {
293
294
  let floor_margin_usd = 1u128;
294
295
  let native_price_usd = NATIVE_DECIMALS_RATE * 3 / 2;
295
296
 
296
- let result = apply_premium(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
297
+ let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
297
298
  assert_eq!(result, 0);
298
299
  }
@@ -19,11 +19,15 @@ 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"] }
25
26
 
26
27
  [dev-dependencies]
27
28
  soroban-sdk = { workspace = true, features = ["testutils"] }
29
+ rand = { workspace = true }
30
+ ed25519-dalek = { workspace = true }
31
+ utils = { workspace = true, features = ["testutils"] }
28
32
 
29
33
 
@@ -7,16 +7,17 @@ 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
- use utils::{option_ext::OptionExt, upgradeable::UpgradeableInternal};
13
+ use utils::option_ext::OptionExt;
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.
19
- #[lz_contract(upgradeable)]
20
+ #[lz_contract(upgradeable(no_migration))]
20
21
  pub struct LzExecutor;
21
22
 
22
23
  #[contract_impl]
@@ -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
 
@@ -203,18 +194,6 @@ impl ILayerZeroExecutor for LzExecutor {
203
194
  #[contract_impl(contracttrait)]
204
195
  impl Worker for LzExecutor {}
205
196
 
206
- // ============================================================================
207
- // Upgradeable Implementation
208
- // ============================================================================
209
-
210
- impl UpgradeableInternal for LzExecutor {
211
- type MigrationData = ();
212
-
213
- fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
214
- // No migration logic needed for initial upgrade capability
215
- }
216
- }
217
-
218
197
  // ============================================================================
219
198
  // Include SubModules
220
199
  // ============================================================================
@@ -16,5 +16,5 @@ cfg_if::cfg_if! {
16
16
  }
17
17
  }
18
18
 
19
- // #[cfg(test)]
20
- // mod tests;
19
+ #[cfg(test)]
20
+ mod tests;