@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
@@ -0,0 +1,338 @@
1
+ // Runtime tests: OAppReceiver defaults generated by `#[oapp]`.
2
+
3
+ use super::{TestOApp, TestOAppClient};
4
+ use endpoint_v2::Origin;
5
+ use oapp::errors::OAppError;
6
+ use soroban_sdk::{
7
+ contract, contractimpl, symbol_short,
8
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
9
+ token::StellarAssetClient,
10
+ Address, Bytes, BytesN, Env, IntoVal,
11
+ };
12
+
13
+ const REMOTE_EID: u32 = 100;
14
+ const REMOTE_EID_FOR_ALLOW_INIT: u32 = 42;
15
+
16
+ // Minimal mock endpoint used by receiver flow.
17
+ #[contract]
18
+ pub struct MockEndpoint;
19
+
20
+ #[contractimpl]
21
+ impl MockEndpoint {
22
+ pub fn __constructor(env: Env, native_token: Address) {
23
+ env.storage().instance().set(&symbol_short!("ntk"), &native_token);
24
+ }
25
+
26
+ pub fn set_delegate(_env: Env, _oapp: &Address, _delegate: &Option<Address>) {
27
+ // no-op
28
+ }
29
+
30
+ pub fn native_token(env: Env) -> Address {
31
+ env.storage().instance().get(&symbol_short!("ntk")).unwrap()
32
+ }
33
+
34
+ pub fn clear(env: Env, caller: Address, origin: Origin, receiver: Address, guid: BytesN<32>, message: Bytes) {
35
+ env.storage().instance().set(&symbol_short!("clr_c"), &caller);
36
+ env.storage().instance().set(&symbol_short!("clr_o"), &origin);
37
+ env.storage().instance().set(&symbol_short!("clr_r"), &receiver);
38
+ env.storage().instance().set(&symbol_short!("clr_g"), &guid);
39
+ env.storage().instance().set(&symbol_short!("clr_m"), &message);
40
+ }
41
+
42
+ pub fn last_clear(env: Env) -> (Address, Origin, Address, BytesN<32>, Bytes) {
43
+ (
44
+ env.storage().instance().get(&symbol_short!("clr_c")).unwrap(),
45
+ env.storage().instance().get(&symbol_short!("clr_o")).unwrap(),
46
+ env.storage().instance().get(&symbol_short!("clr_r")).unwrap(),
47
+ env.storage().instance().get(&symbol_short!("clr_g")).unwrap(),
48
+ env.storage().instance().get(&symbol_short!("clr_m")).unwrap(),
49
+ )
50
+ }
51
+ }
52
+
53
+ #[test]
54
+ fn next_nonce_defaults_to_unordered() {
55
+ let env = Env::default();
56
+ let contract_id = env.register(TestOApp, ());
57
+ let client = TestOAppClient::new(&env, &contract_id);
58
+
59
+ let sender = BytesN::<32>::from_array(&env, &[9u8; 32]);
60
+ assert_eq!(client.next_nonce(&1u32, &sender), 0u64);
61
+ }
62
+
63
+ #[test]
64
+ fn is_compose_msg_sender_defaults_to_current_contract() {
65
+ let env = Env::default();
66
+ let contract_id = env.register(TestOApp, ());
67
+ let client = TestOAppClient::new(&env, &contract_id);
68
+
69
+ let origin = Origin { src_eid: 1, sender: BytesN::<32>::from_array(&env, &[1u8; 32]), nonce: 1 };
70
+ let msg = Bytes::from_slice(&env, &[0xAA, 0xBB]);
71
+
72
+ // When sender is current contract => true.
73
+ let this = contract_id.clone();
74
+ assert_eq!(client.is_compose_msg_sender(&origin, &msg, &this), true);
75
+
76
+ // Different sender => false.
77
+ let other = Address::generate(&env);
78
+ assert_eq!(client.is_compose_msg_sender(&origin, &msg, &other), false);
79
+ }
80
+
81
+ #[test]
82
+ fn allow_initialize_path_follows_peer_configuration() {
83
+ let env = Env::default();
84
+ let contract_id = env.register(TestOApp, ());
85
+ let client = TestOAppClient::new(&env, &contract_id);
86
+
87
+ let owner = Address::generate(&env);
88
+ let endpoint = Address::generate(&env);
89
+ client.init(&owner, &endpoint);
90
+
91
+ let eid: u32 = REMOTE_EID_FOR_ALLOW_INIT;
92
+ let sender = BytesN::<32>::from_array(&env, &[3u8; 32]);
93
+
94
+ // No peer set => false.
95
+ let origin = Origin { src_eid: eid, sender: sender.clone(), nonce: 1 };
96
+ assert_eq!(client.allow_initialize_path(&origin), false);
97
+
98
+ // Set a non-matching peer => still false.
99
+ let other_sender = BytesN::<32>::from_array(&env, &[4u8; 32]);
100
+ let other_peer = Some(other_sender.clone());
101
+ env.mock_auths(&[MockAuth {
102
+ address: &owner,
103
+ invoke: &MockAuthInvoke {
104
+ contract: &contract_id,
105
+ fn_name: "set_peer",
106
+ args: (&eid, &other_peer).into_val(&env),
107
+ sub_invokes: &[],
108
+ },
109
+ }]);
110
+ client.set_peer(&eid, &other_peer);
111
+ assert_eq!(client.allow_initialize_path(&origin), false);
112
+
113
+ // Set matching peer => true.
114
+ let matching_peer = Some(sender.clone());
115
+ env.mock_auths(&[MockAuth {
116
+ address: &owner,
117
+ invoke: &MockAuthInvoke {
118
+ contract: &contract_id,
119
+ fn_name: "set_peer",
120
+ args: (&eid, &matching_peer).into_val(&env),
121
+ sub_invokes: &[],
122
+ },
123
+ }]);
124
+ client.set_peer(&eid, &matching_peer);
125
+
126
+ assert_eq!(client.allow_initialize_path(&origin), true);
127
+ }
128
+
129
+ #[test]
130
+ fn lz_receive_clears_payload_transfers_value_and_calls_internal_handler() {
131
+ let env = Env::default();
132
+
133
+ let owner = Address::generate(&env);
134
+ let token_admin = Address::generate(&env);
135
+ let native_token_sac = env.register_stellar_asset_contract_v2(token_admin.clone());
136
+ let native_token = native_token_sac.address();
137
+ let native_token_admin_client = StellarAssetClient::new(&env, &native_token);
138
+
139
+ let endpoint = env.register(MockEndpoint, (&native_token,));
140
+ let oapp = env.register(TestOApp, ());
141
+ let oapp_client = TestOAppClient::new(&env, &oapp);
142
+ oapp_client.init(&owner, &endpoint);
143
+
144
+ // Configure peer so peer check passes.
145
+ let peer = BytesN::<32>::from_array(&env, &[9u8; 32]);
146
+ let peer_opt = Some(peer.clone());
147
+ env.mock_auths(&[MockAuth {
148
+ address: &owner,
149
+ invoke: &MockAuthInvoke {
150
+ contract: &oapp,
151
+ fn_name: "set_peer",
152
+ args: (&REMOTE_EID, &peer_opt).into_val(&env),
153
+ sub_invokes: &[],
154
+ },
155
+ }]);
156
+ oapp_client.set_peer(&REMOTE_EID, &peer_opt);
157
+
158
+ // Before any lz_receive call, internal handler should not have been invoked.
159
+ assert_eq!(oapp_client.lz_receive_called(), false);
160
+
161
+ let executor = Address::generate(&env);
162
+ let origin = Origin { src_eid: REMOTE_EID, sender: peer, nonce: 1 };
163
+ let guid = BytesN::<32>::from_array(&env, &[3u8; 32]);
164
+ let message = Bytes::from_array(&env, &[4, 5, 6]);
165
+ let extra_data = Bytes::new(&env);
166
+ let value: i128 = 123;
167
+
168
+ // Mint native token to executor.
169
+ env.mock_auths(&[MockAuth {
170
+ address: &token_admin,
171
+ invoke: &MockAuthInvoke {
172
+ contract: &native_token,
173
+ fn_name: "mint",
174
+ args: (&executor, &value).into_val(&env),
175
+ sub_invokes: &[],
176
+ },
177
+ }]);
178
+ native_token_admin_client.mint(&executor, &value);
179
+
180
+ // lz_receive requires executor auth, and will sub-invoke token transfer.
181
+ let transfer_invoke = MockAuthInvoke {
182
+ contract: &native_token,
183
+ fn_name: "transfer",
184
+ args: (&executor, &oapp, &value).into_val(&env),
185
+ sub_invokes: &[],
186
+ };
187
+ env.mock_auths(&[MockAuth {
188
+ address: &executor,
189
+ invoke: &MockAuthInvoke {
190
+ contract: &oapp,
191
+ fn_name: "lz_receive",
192
+ args: (&executor, &origin, &guid, &message, &extra_data, &value).into_val(&env),
193
+ sub_invokes: &[transfer_invoke],
194
+ },
195
+ }]);
196
+ oapp_client.lz_receive(&executor, &origin, &guid, &message, &extra_data, &value);
197
+
198
+ // Prove the default `lz_receive` called `Self::__lz_receive`.
199
+ assert_eq!(oapp_client.lz_receive_called(), true);
200
+
201
+ // Assert clear() happened.
202
+ let endpoint_client = MockEndpointClient::new(&env, &endpoint);
203
+ let (caller, cleared_origin, receiver, cleared_guid, cleared_message) = endpoint_client.last_clear();
204
+ assert_eq!(caller, oapp);
205
+ assert_eq!(cleared_origin, origin);
206
+ assert_eq!(receiver, oapp);
207
+ assert_eq!(cleared_guid, guid);
208
+ assert_eq!(cleared_message, message);
209
+
210
+ // Assert transfer happened.
211
+ let token_client = soroban_sdk::token::TokenClient::new(&env, &native_token);
212
+ assert_eq!(token_client.balance(&executor), 0);
213
+ assert_eq!(token_client.balance(&oapp), value);
214
+ }
215
+
216
+ #[test]
217
+ fn lz_receive_wrong_peer_returns_only_peer() {
218
+ let env = Env::default();
219
+
220
+ let owner = Address::generate(&env);
221
+ let token_admin = Address::generate(&env);
222
+ let native_token_sac = env.register_stellar_asset_contract_v2(token_admin.clone());
223
+ let native_token = native_token_sac.address();
224
+ let endpoint = env.register(MockEndpoint, (&native_token,));
225
+
226
+ let oapp = env.register(TestOApp, ());
227
+ let oapp_client = TestOAppClient::new(&env, &oapp);
228
+ oapp_client.init(&owner, &endpoint);
229
+
230
+ // Set peer to some value...
231
+ let configured_peer = BytesN::<32>::from_array(&env, &[7u8; 32]);
232
+ let peer_opt = Some(configured_peer);
233
+ env.mock_auths(&[MockAuth {
234
+ address: &owner,
235
+ invoke: &MockAuthInvoke {
236
+ contract: &oapp,
237
+ fn_name: "set_peer",
238
+ args: (&REMOTE_EID, &peer_opt).into_val(&env),
239
+ sub_invokes: &[],
240
+ },
241
+ }]);
242
+ oapp_client.set_peer(&REMOTE_EID, &peer_opt);
243
+
244
+ // ...but call lz_receive with a different sender.
245
+ let executor = Address::generate(&env);
246
+ let origin = Origin { src_eid: REMOTE_EID, sender: BytesN::<32>::from_array(&env, &[8u8; 32]), nonce: 1 };
247
+ let guid = BytesN::<32>::from_array(&env, &[2u8; 32]);
248
+ let message = Bytes::from_array(&env, &[1, 2, 3]);
249
+ let extra_data = Bytes::new(&env);
250
+ let value: i128 = 0;
251
+
252
+ env.mock_auths(&[MockAuth {
253
+ address: &executor,
254
+ invoke: &MockAuthInvoke {
255
+ contract: &oapp,
256
+ fn_name: "lz_receive",
257
+ args: (&executor, &origin, &guid, &message, &extra_data, &value).into_val(&env),
258
+ sub_invokes: &[],
259
+ },
260
+ }]);
261
+
262
+ let result = oapp_client.try_lz_receive(&executor, &origin, &guid, &message, &extra_data, &value);
263
+ assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::OnlyPeer.into());
264
+ }
265
+
266
+ #[test]
267
+ fn lz_receive_no_peer_returns_only_peer() {
268
+ let env = Env::default();
269
+
270
+ let owner = Address::generate(&env);
271
+ let token_admin = Address::generate(&env);
272
+ let native_token_sac = env.register_stellar_asset_contract_v2(token_admin.clone());
273
+ let native_token = native_token_sac.address();
274
+ let endpoint = env.register(MockEndpoint, (&native_token,));
275
+
276
+ let oapp = env.register(TestOApp, ());
277
+ let oapp_client = TestOAppClient::new(&env, &oapp);
278
+ oapp_client.init(&owner, &endpoint);
279
+
280
+ let executor = Address::generate(&env);
281
+ let origin = Origin { src_eid: REMOTE_EID, sender: BytesN::<32>::from_array(&env, &[1u8; 32]), nonce: 1 };
282
+ let guid = BytesN::<32>::from_array(&env, &[2u8; 32]);
283
+ let message = Bytes::from_array(&env, &[1, 2, 3]);
284
+ let extra_data = Bytes::new(&env);
285
+ let value: i128 = 0;
286
+
287
+ env.mock_auths(&[MockAuth {
288
+ address: &executor,
289
+ invoke: &MockAuthInvoke {
290
+ contract: &oapp,
291
+ fn_name: "lz_receive",
292
+ args: (&executor, &origin, &guid, &message, &extra_data, &value).into_val(&env),
293
+ sub_invokes: &[],
294
+ },
295
+ }]);
296
+
297
+ let result = oapp_client.try_lz_receive(&executor, &origin, &guid, &message, &extra_data, &value);
298
+ assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::OnlyPeer.into());
299
+ }
300
+
301
+ #[test]
302
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
303
+ fn lz_receive_requires_executor_auth() {
304
+ let env = Env::default();
305
+
306
+ let owner = Address::generate(&env);
307
+ let token_admin = Address::generate(&env);
308
+ let native_token_sac = env.register_stellar_asset_contract_v2(token_admin.clone());
309
+ let native_token = native_token_sac.address();
310
+ let endpoint = env.register(MockEndpoint, (&native_token,));
311
+
312
+ let oapp = env.register(TestOApp, ());
313
+ let oapp_client = TestOAppClient::new(&env, &oapp);
314
+ oapp_client.init(&owner, &endpoint);
315
+
316
+ // Configure peer so we fail specifically at executor.require_auth().
317
+ let peer = BytesN::<32>::from_array(&env, &[7u8; 32]);
318
+ let peer_opt = Some(peer.clone());
319
+ env.mock_auths(&[MockAuth {
320
+ address: &owner,
321
+ invoke: &MockAuthInvoke {
322
+ contract: &oapp,
323
+ fn_name: "set_peer",
324
+ args: (&REMOTE_EID, &peer_opt).into_val(&env),
325
+ sub_invokes: &[],
326
+ },
327
+ }]);
328
+ oapp_client.set_peer(&REMOTE_EID, &peer_opt);
329
+
330
+ let executor = Address::generate(&env);
331
+ let origin = Origin { src_eid: REMOTE_EID, sender: peer, nonce: 1 };
332
+ let guid = BytesN::<32>::from_array(&env, &[2u8; 32]);
333
+ let message = Bytes::from_array(&env, &[1, 2, 3]);
334
+ let extra_data = Bytes::new(&env);
335
+
336
+ // No env.mock_auths for executor => should panic.
337
+ oapp_client.lz_receive(&executor, &origin, &guid, &message, &extra_data, &0);
338
+ }