@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
@@ -1,153 +0,0 @@
1
- use crate::{
2
- self as oapp, errors::OAppError, oapp_core::OAppCoreStorage, oapp_receiver::LzReceiveInternal,
3
- tests::test_oapp_core::DummyEndpoint,
4
- };
5
- use endpoint_v2::Origin;
6
- use soroban_sdk::{assert_with_error, contractimpl, testutils::Address as _, Address, Bytes, BytesN, Env};
7
- use utils::option_ext::OptionExt;
8
-
9
- #[oapp_macros::oapp]
10
- pub struct DummyOAppReceiver;
11
-
12
- impl LzReceiveInternal for DummyOAppReceiver {
13
- fn __lz_receive(
14
- _env: &Env,
15
- _origin: &Origin,
16
- _guid: &BytesN<32>,
17
- _message: &Bytes,
18
- _extra_data: &Bytes,
19
- _executor: &Address,
20
- _value: i128,
21
- ) {
22
- // do nothing
23
- }
24
- }
25
-
26
- #[contractimpl]
27
- impl DummyOAppReceiver {
28
- pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address) {
29
- oapp::oapp_core::initialize_oapp::<Self>(env, owner, endpoint, &None);
30
- }
31
-
32
- pub fn assert_allowed_peer(env: &Env, origin: &Origin) {
33
- let peer = OAppCoreStorage::peer(env, origin.src_eid).unwrap_or_panic(env, OAppError::NoPeer);
34
- assert_with_error!(env, peer == origin.sender, OAppError::OnlyPeer);
35
- }
36
- }
37
-
38
- const REMOTE_EID: u32 = 100;
39
- const UNSET_EID: u32 = 999;
40
-
41
- struct TestSetup<'a> {
42
- env: Env,
43
- #[allow(dead_code)]
44
- owner: Address,
45
- #[allow(dead_code)]
46
- endpoint: Address,
47
- #[allow(dead_code)]
48
- native_token: Address,
49
- oapp_client: DummyOAppReceiverClient<'a>,
50
- }
51
-
52
- fn setup<'a>() -> TestSetup<'a> {
53
- let env = Env::default();
54
-
55
- let owner = Address::generate(&env);
56
- let endpoint = env.register(DummyEndpoint, ());
57
- let native_token = Address::generate(&env);
58
- let oapp = env.register(DummyOAppReceiver, (&owner, &endpoint));
59
- let oapp_client = DummyOAppReceiverClient::new(&env, &oapp);
60
- TestSetup { env, owner, endpoint, native_token, oapp_client }
61
- }
62
-
63
- #[test]
64
- fn test_is_compose_msg_sender_same_contract() {
65
- let TestSetup { env, oapp_client, .. } = setup();
66
-
67
- let origin = Origin { src_eid: REMOTE_EID, sender: BytesN::from_array(&env, &[1; 32]), nonce: 1 };
68
- let message = Bytes::from_array(&env, &[1, 2, 3, 4]);
69
-
70
- // Test with same contract address (should return true)
71
- let result = oapp_client.is_compose_msg_sender(&origin, &message, &oapp_client.address);
72
- assert_eq!(result, true);
73
- }
74
-
75
- #[test]
76
- fn test_is_compose_msg_sender_different_contract() {
77
- let TestSetup { env, oapp_client, .. } = setup();
78
-
79
- let origin = Origin { src_eid: REMOTE_EID, sender: BytesN::from_array(&env, &[1; 32]), nonce: 1 };
80
- let message = Bytes::from_array(&env, &[1, 2, 3, 4]);
81
- let different_sender = Address::generate(&env);
82
-
83
- // Test with different sender address (should return false)
84
- let result = oapp_client.is_compose_msg_sender(&origin, &message, &different_sender);
85
- assert_eq!(result, false);
86
- }
87
-
88
- #[test]
89
- fn test_allow_initialize_path_with_matching_peer() {
90
- let TestSetup { env, oapp_client, .. } = setup();
91
- env.mock_all_auths();
92
-
93
- let peer_bytes: BytesN<32> = BytesN::from_array(&env, &[5; 32]);
94
- oapp_client.set_peer(&REMOTE_EID, &Some(peer_bytes.clone()));
95
-
96
- let origin = Origin { src_eid: REMOTE_EID, sender: peer_bytes.clone(), nonce: 1 };
97
-
98
- let result = oapp_client.allow_initialize_path(&origin);
99
- assert_eq!(result, true);
100
- }
101
-
102
- #[test]
103
- fn test_allow_initialize_path_with_non_matching_peer() {
104
- let TestSetup { env, oapp_client, .. } = setup();
105
- env.mock_all_auths();
106
-
107
- let peer_bytes: BytesN<32> = BytesN::from_array(&env, &[5; 32]);
108
- oapp_client.set_peer(&REMOTE_EID, &Some(peer_bytes));
109
-
110
- let different_sender: BytesN<32> = BytesN::from_array(&env, &[6; 32]);
111
- let origin = Origin { src_eid: REMOTE_EID, sender: different_sender, nonce: 1 };
112
-
113
- let result = oapp_client.allow_initialize_path(&origin);
114
- assert_eq!(result, false);
115
- }
116
-
117
- #[test]
118
- fn test_allow_initialize_path_with_no_peer_set() {
119
- let TestSetup { env, oapp_client, .. } = setup();
120
-
121
- let origin = Origin { src_eid: UNSET_EID, sender: BytesN::from_array(&env, &[5; 32]), nonce: 1 };
122
-
123
- let result = oapp_client.allow_initialize_path(&origin);
124
- assert_eq!(result, false);
125
- }
126
-
127
- #[test]
128
- fn test_assert_allowed_peer_wrong_sender() {
129
- let TestSetup { env, oapp_client, .. } = setup();
130
- env.mock_all_auths();
131
-
132
- let peer_bytes: BytesN<32> = BytesN::from_array(&env, &[7; 32]);
133
- oapp_client.set_peer(&REMOTE_EID, &Some(peer_bytes));
134
-
135
- let wrong_sender: BytesN<32> = BytesN::from_array(&env, &[8; 32]);
136
- let origin = Origin { src_eid: REMOTE_EID, sender: wrong_sender, nonce: 1 };
137
-
138
- // This should panic with OnlyPeer error
139
- let result = oapp_client.try_assert_allowed_peer(&origin);
140
- assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::OnlyPeer.into());
141
- }
142
-
143
- #[test]
144
- fn test_assert_allowed_peer_no_peer() {
145
- let TestSetup { env, oapp_client, .. } = setup();
146
- env.mock_all_auths();
147
-
148
- let origin = Origin { src_eid: UNSET_EID, sender: BytesN::from_array(&env, &[7; 32]), nonce: 1 };
149
-
150
- // This should panic with NoPeer error
151
- let result = oapp_client.try_assert_allowed_peer(&origin);
152
- assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::NoPeer.into());
153
- }
@@ -1,294 +0,0 @@
1
- use crate::{self as oapp, errors::OAppError, oapp_receiver::LzReceiveInternal};
2
- use endpoint_v2::{MessagingFee, MessagingParams, MessagingReceipt, Origin};
3
- use soroban_sdk::{
4
- contract, contractimpl, symbol_short,
5
- testutils::{Address as _, MockAuth, MockAuthInvoke},
6
- token::{StellarAssetClient, TokenClient},
7
- Address, Bytes, BytesN, Env, IntoVal,
8
- };
9
-
10
- // Mock Endpoint contract
11
- #[contract]
12
- pub struct MockEndpoint;
13
-
14
- #[contractimpl]
15
- impl MockEndpoint {
16
- pub fn __constructor(env: Env, zro_token: &Address, native_token: &Address) {
17
- env.storage().instance().set(&symbol_short!("zro"), zro_token);
18
- env.storage().instance().set(&symbol_short!("ntk"), native_token);
19
- }
20
-
21
- pub fn set_delegate(_env: Env, _oapp: Address, _delegate: Option<Address>) {
22
- // do nothing in mock
23
- }
24
-
25
- pub fn quote(_env: Env, _sender: Address, params: MessagingParams) -> MessagingFee {
26
- MessagingFee { native_fee: 1000, zro_fee: if params.pay_in_zro { 500 } else { 0 } }
27
- }
28
-
29
- pub fn send(env: Env, _sender: Address, params: MessagingParams, _refund_address: Address) -> MessagingReceipt {
30
- // Return mock receipt
31
- MessagingReceipt {
32
- guid: BytesN::from_array(&env, &[1u8; 32]),
33
- nonce: 1,
34
- fee: MessagingFee { native_fee: 1000, zro_fee: if params.pay_in_zro { 500 } else { 0 } },
35
- }
36
- }
37
-
38
- pub fn zro(env: Env) -> Option<Address> {
39
- // Return a mock ZRO token address
40
- env.storage().instance().get(&symbol_short!("zro")).unwrap()
41
- }
42
-
43
- pub fn native_token(env: Env) -> Address {
44
- env.storage().instance().get(&symbol_short!("ntk")).unwrap()
45
- }
46
- }
47
-
48
- #[oapp_macros::oapp]
49
- pub struct DummyOAppSender;
50
-
51
- impl LzReceiveInternal for DummyOAppSender {
52
- fn __lz_receive(
53
- _env: &Env,
54
- _origin: &Origin,
55
- _guid: &BytesN<32>,
56
- _message: &Bytes,
57
- _extra_data: &Bytes,
58
- _executor: &Address,
59
- _value: i128,
60
- ) {
61
- // Not used in sender tests
62
- }
63
- }
64
-
65
- #[contractimpl]
66
- impl DummyOAppSender {
67
- pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address) {
68
- oapp::oapp_core::initialize_oapp::<Self>(env, owner, endpoint, &None);
69
- }
70
-
71
- pub fn quote(env: &Env, dst_eid: u32, message: &Bytes, options: &Bytes, pay_in_zro: bool) -> MessagingFee {
72
- Self::__quote(env, dst_eid, message, options, pay_in_zro)
73
- }
74
-
75
- pub fn send(
76
- env: &Env,
77
- sender: &Address,
78
- dst_eid: u32,
79
- message: &Bytes,
80
- options: &Bytes,
81
- fee: &MessagingFee,
82
- refund_address: &Address,
83
- ) -> MessagingReceipt {
84
- sender.require_auth();
85
- Self::__lz_send(env, dst_eid, message, options, sender, fee, refund_address)
86
- }
87
-
88
- pub fn pay_native_fee(env: &Env, fee_payer: &Address, native_fee: i128) {
89
- fee_payer.require_auth();
90
- Self::__pay_native(env, fee_payer, native_fee)
91
- }
92
-
93
- pub fn pay_zro_fee(env: &Env, fee_payer: &Address, zro_fee: i128) {
94
- fee_payer.require_auth();
95
- Self::__pay_zro(env, fee_payer, zro_fee)
96
- }
97
- }
98
-
99
- const REMOTE_EID: u32 = 100;
100
- const UNSET_EID: u32 = 999;
101
-
102
- struct TestSetup<'a> {
103
- env: Env,
104
- #[allow(dead_code)]
105
- token_admin: Address,
106
- endpoint: Address,
107
- #[allow(dead_code)]
108
- owner: Address,
109
- oapp_client: DummyOAppSenderClient<'a>,
110
- native_token_client: TokenClient<'a>,
111
- native_token_admin_client: StellarAssetClient<'a>,
112
- zro_token_admin_client: StellarAssetClient<'a>,
113
- }
114
-
115
- fn setup<'a>() -> TestSetup<'a> {
116
- let env = Env::default();
117
-
118
- let owner = Address::generate(&env);
119
-
120
- let token_admin = Address::generate(&env);
121
- // Deploy mock tokens
122
- let native_token_sac = env.register_stellar_asset_contract_v2(token_admin.clone());
123
- let native_token = native_token_sac.address();
124
- let native_token_client = TokenClient::new(&env, &native_token);
125
- let native_token_admin_client = StellarAssetClient::new(&env, &native_token);
126
-
127
- let zro_token_sac = env.register_stellar_asset_contract_v2(token_admin.clone());
128
- let zro_token = zro_token_sac.address();
129
- let zro_token_admin_client = StellarAssetClient::new(&env, &zro_token);
130
-
131
- // Deploy mock endpoint
132
- let endpoint = env.register(MockEndpoint, (&zro_token, &native_token));
133
-
134
- // Deploy OApp
135
- let oapp = env.register(DummyOAppSender, (&owner, &endpoint));
136
- let oapp_client = DummyOAppSenderClient::new(&env, &oapp);
137
-
138
- TestSetup {
139
- env,
140
- endpoint,
141
- token_admin,
142
- native_token_client,
143
- native_token_admin_client,
144
- zro_token_admin_client,
145
- owner,
146
- oapp_client,
147
- }
148
- }
149
-
150
- #[test]
151
- fn test_quote_with_peer_set() {
152
- let TestSetup { env, owner, oapp_client, .. } = setup();
153
-
154
- // Set peer for destination
155
- let peer = BytesN::from_array(&env, &[1; 32]);
156
- let peer_option = Some(peer.clone());
157
- env.mock_auths(&[MockAuth {
158
- address: &owner,
159
- invoke: &MockAuthInvoke {
160
- contract: &oapp_client.address,
161
- fn_name: "set_peer",
162
- args: (&REMOTE_EID, &peer_option).into_val(&env),
163
- sub_invokes: &[],
164
- },
165
- }]);
166
- oapp_client.set_peer(&REMOTE_EID, &peer_option);
167
-
168
- let message = Bytes::from_array(&env, &[1, 2, 3, 4, 5]);
169
- let options = Bytes::from_array(&env, &[6, 7, 8]);
170
-
171
- // Test quote without ZRO
172
- let fee = oapp_client.quote(&REMOTE_EID, &message, &options, &false);
173
- assert!(fee.native_fee > 0);
174
- assert_eq!(fee.zro_fee, 0);
175
-
176
- // Test quote with ZRO
177
- let fee_with_zro = oapp_client.quote(&REMOTE_EID, &message, &options, &true);
178
- assert!(fee_with_zro.native_fee > 0);
179
- assert!(fee_with_zro.zro_fee > 0);
180
- }
181
-
182
- #[test]
183
- fn test_quote_without_peer_panics() {
184
- let TestSetup { env, oapp_client, .. } = setup();
185
-
186
- let message = Bytes::from_array(&env, &[1, 2, 3]);
187
- let options = Bytes::from_array(&env, &[]);
188
-
189
- // This should panic because no peer is set for UNSET_EID
190
- let result = oapp_client.try_quote(&UNSET_EID, &message, &options, &false);
191
- assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::NoPeer.into());
192
- }
193
-
194
- #[test]
195
- fn test_lz_send_native_only() {
196
- let TestSetup { env, oapp_client, endpoint, native_token_client, native_token_admin_client, .. } = setup();
197
-
198
- env.mock_all_auths();
199
-
200
- // Setup peer
201
- let peer = BytesN::from_array(&env, &[2; 32]);
202
- oapp_client.set_peer(&REMOTE_EID, &Some(peer));
203
-
204
- // Setup sender with funds
205
- let sender = Address::generate(&env);
206
- let initial_balance = 10000i128;
207
- native_token_admin_client.mint(&sender, &initial_balance);
208
-
209
- let message = Bytes::from_array(&env, &[1, 2, 3]);
210
- let options = Bytes::from_array(&env, &[]);
211
- let refund_address = Address::generate(&env);
212
-
213
- let fee = MessagingFee { native_fee: 1000, zro_fee: 0 };
214
-
215
- // Send message (auth is mocked automatically)
216
- let receipt = oapp_client.send(&sender, &REMOTE_EID, &message, &options, &fee, &refund_address);
217
-
218
- // Verify receipt
219
- assert_eq!(receipt.nonce, 1);
220
- assert_eq!(receipt.fee.native_fee, fee.native_fee);
221
-
222
- // Verify native token was transferred to endpoint
223
- let sender_balance = native_token_client.balance(&sender);
224
- assert_eq!(sender_balance, initial_balance - fee.native_fee);
225
-
226
- let endpoint_balance = native_token_client.balance(&endpoint);
227
- assert_eq!(endpoint_balance, fee.native_fee);
228
- }
229
-
230
- #[test]
231
- fn test_lz_send_with_zro() {
232
- let TestSetup { env, oapp_client, native_token_admin_client, zro_token_admin_client, .. } = setup();
233
-
234
- env.mock_all_auths();
235
-
236
- // Setup peer
237
- let peer = BytesN::from_array(&env, &[3; 32]);
238
- oapp_client.set_peer(&REMOTE_EID, &Some(peer));
239
-
240
- // Setup sender with both native and ZRO funds
241
- let fee = MessagingFee { native_fee: 1000, zro_fee: 500 };
242
-
243
- let sender = Address::generate(&env);
244
- native_token_admin_client.mint(&sender, &fee.native_fee);
245
- zro_token_admin_client.mint(&sender, &fee.zro_fee);
246
-
247
- let message = Bytes::from_array(&env, &[1, 2, 3, 4]);
248
- let options = Bytes::from_array(&env, &[5]);
249
- let refund_address = Address::generate(&env);
250
-
251
- // Send message with ZRO payment
252
- let receipt = oapp_client.send(&sender, &REMOTE_EID, &message, &options, &fee, &refund_address);
253
-
254
- assert_eq!(receipt.fee.zro_fee, fee.zro_fee);
255
- }
256
-
257
- #[test]
258
- fn test_pay_native() {
259
- let TestSetup { env, oapp_client, endpoint, native_token_admin_client, .. } = setup();
260
-
261
- env.mock_all_auths();
262
-
263
- let payer = Address::generate(&env);
264
- let payment_amount = 2000i128;
265
-
266
- // Fund the payer
267
- native_token_admin_client.mint(&payer, &payment_amount);
268
-
269
- // Make payment
270
- oapp_client.pay_native_fee(&payer, &payment_amount);
271
-
272
- // Verify balances
273
- assert_eq!(native_token_admin_client.balance(&payer), 0);
274
- assert_eq!(native_token_admin_client.balance(&endpoint), payment_amount);
275
- }
276
-
277
- #[test]
278
- #[should_panic(expected = "balance is not sufficient to spend")]
279
- fn test_pay_native_insufficient_balance() {
280
- let TestSetup { env, oapp_client, native_token_admin_client, .. } = setup();
281
-
282
- env.mock_all_auths();
283
-
284
- let balance = 500i128;
285
- let payment_amount = 1000i128;
286
-
287
- let payer = Address::generate(&env);
288
-
289
- // Fund with less than required
290
- native_token_admin_client.mint(&payer, &balance);
291
-
292
- // This should panic due to insufficient balance
293
- oapp_client.pay_native_fee(&payer, &payment_amount);
294
- }