@layerzerolabs/protocol-stellar-v2 0.2.8

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 (265) hide show
  1. package/.turbo/turbo-build.log +727 -0
  2. package/.turbo/turbo-lint.log +158 -0
  3. package/.turbo/turbo-test.log +796 -0
  4. package/Cargo.lock +2237 -0
  5. package/Cargo.toml +63 -0
  6. package/clippy.toml +7 -0
  7. package/contracts/common-macros/Cargo.toml +20 -0
  8. package/contracts/common-macros/src/error.rs +53 -0
  9. package/contracts/common-macros/src/event.rs +16 -0
  10. package/contracts/common-macros/src/lib.rs +255 -0
  11. package/contracts/common-macros/src/ownable.rs +63 -0
  12. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +310 -0
  13. package/contracts/common-macros/src/storage.rs +439 -0
  14. package/contracts/common-macros/src/tests.rs +287 -0
  15. package/contracts/common-macros/src/ttl_configurable.rs +60 -0
  16. package/contracts/endpoint-v2/ARCHITECTURE.md +233 -0
  17. package/contracts/endpoint-v2/Cargo.toml +30 -0
  18. package/contracts/endpoint-v2/src/constants.rs +52 -0
  19. package/contracts/endpoint-v2/src/endpoint_v2.rs +305 -0
  20. package/contracts/endpoint-v2/src/errors.rs +29 -0
  21. package/contracts/endpoint-v2/src/events.rs +207 -0
  22. package/contracts/endpoint-v2/src/interfaces/layerzero_composer.rs +26 -0
  23. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +170 -0
  24. package/contracts/endpoint-v2/src/interfaces/layerzero_receiver.rs +43 -0
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +62 -0
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +220 -0
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +121 -0
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +63 -0
  29. package/contracts/endpoint-v2/src/interfaces/mod.rs +17 -0
  30. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +70 -0
  31. package/contracts/endpoint-v2/src/lib.rs +22 -0
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +315 -0
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +218 -0
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +76 -0
  35. package/contracts/endpoint-v2/src/storage.rs +78 -0
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +131 -0
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +237 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +42 -0
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +76 -0
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +211 -0
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +18 -0
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +10 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +10 -0
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +424 -0
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +144 -0
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +72 -0
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +29 -0
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +513 -0
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +43 -0
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +27 -0
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +30 -0
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +202 -0
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +59 -0
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +172 -0
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +23 -0
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +10 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +131 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +35 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +28 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +79 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +246 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +285 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +180 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +405 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +80 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +131 -0
  67. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +358 -0
  68. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +316 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +288 -0
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +316 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +388 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +307 -0
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +10 -0
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +239 -0
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +324 -0
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +242 -0
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +232 -0
  78. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +212 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +213 -0
  80. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +269 -0
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +173 -0
  83. package/contracts/endpoint-v2/src/tests/mock.rs +132 -0
  84. package/contracts/endpoint-v2/src/tests/mod.rs +12 -0
  85. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +126 -0
  86. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +82 -0
  87. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +115 -0
  88. package/contracts/endpoint-v2/src/tests/util/mod.rs +3 -0
  89. package/contracts/endpoint-v2/src/util.rs +52 -0
  90. package/contracts/message-libs/Cargo.toml +12 -0
  91. package/contracts/message-libs/block-message-lib/Cargo.toml +19 -0
  92. package/contracts/message-libs/block-message-lib/src/lib.rs +70 -0
  93. package/contracts/message-libs/lib.rs +2 -0
  94. package/contracts/message-libs/message-lib-common/Cargo.toml +24 -0
  95. package/contracts/message-libs/message-lib-common/src/errors.rs +20 -0
  96. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +55 -0
  97. package/contracts/message-libs/message-lib-common/src/interfaces/executor.rs +46 -0
  98. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +7 -0
  99. package/contracts/message-libs/message-lib-common/src/interfaces/treasury.rs +17 -0
  100. package/contracts/message-libs/message-lib-common/src/lib.rs +14 -0
  101. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +99 -0
  102. package/contracts/message-libs/message-lib-common/src/testing_utils.rs +27 -0
  103. package/contracts/message-libs/message-lib-common/src/tests/mod.rs +2 -0
  104. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +162 -0
  105. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +319 -0
  106. package/contracts/message-libs/message-lib-common/src/worker_options.rs +190 -0
  107. package/contracts/message-libs/simple-message-lib/Cargo.toml +26 -0
  108. package/contracts/message-libs/simple-message-lib/src/errors.rs +11 -0
  109. package/contracts/message-libs/simple-message-lib/src/lib.rs +14 -0
  110. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +136 -0
  111. package/contracts/message-libs/simple-message-lib/src/storage.rs +27 -0
  112. package/contracts/message-libs/simple-message-lib/src/test.rs +280 -0
  113. package/contracts/message-libs/treasury/Cargo.toml +27 -0
  114. package/contracts/message-libs/treasury/src/errors.rs +10 -0
  115. package/contracts/message-libs/treasury/src/events.rs +28 -0
  116. package/contracts/message-libs/treasury/src/interfaces/mod.rs +3 -0
  117. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +20 -0
  118. package/contracts/message-libs/treasury/src/lib.rs +20 -0
  119. package/contracts/message-libs/treasury/src/storage.rs +18 -0
  120. package/contracts/message-libs/treasury/src/tests/mod.rs +2 -0
  121. package/contracts/message-libs/treasury/src/tests/setup.rs +112 -0
  122. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +562 -0
  123. package/contracts/message-libs/treasury/src/treasury.rs +140 -0
  124. package/contracts/message-libs/uln-302/Cargo.toml +28 -0
  125. package/contracts/message-libs/uln-302/src/config_validation.rs +173 -0
  126. package/contracts/message-libs/uln-302/src/errors.rs +29 -0
  127. package/contracts/message-libs/uln-302/src/events.rs +72 -0
  128. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +5 -0
  129. package/contracts/message-libs/uln-302/src/interfaces/receive.rs +82 -0
  130. package/contracts/message-libs/uln-302/src/interfaces/send.rs +159 -0
  131. package/contracts/message-libs/uln-302/src/lib.rs +20 -0
  132. package/contracts/message-libs/uln-302/src/receive.rs +199 -0
  133. package/contracts/message-libs/uln-302/src/send.rs +349 -0
  134. package/contracts/message-libs/uln-302/src/storage.rs +47 -0
  135. package/contracts/message-libs/uln-302/src/tests/config/mod.rs +2 -0
  136. package/contracts/message-libs/uln-302/src/tests/config/oapp_uln_config.rs +291 -0
  137. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +163 -0
  138. package/contracts/message-libs/uln-302/src/tests/mod.rs +7 -0
  139. package/contracts/message-libs/uln-302/src/tests/receive_uln302/commit_verification.rs +183 -0
  140. package/contracts/message-libs/uln-302/src/tests/receive_uln302/confirmations.rs +128 -0
  141. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +104 -0
  142. package/contracts/message-libs/uln-302/src/tests/receive_uln302/mod.rs +66 -0
  143. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +79 -0
  144. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +463 -0
  145. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +173 -0
  146. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +132 -0
  147. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +117 -0
  148. package/contracts/message-libs/uln-302/src/tests/send_uln302/mod.rs +6 -0
  149. package/contracts/message-libs/uln-302/src/tests/send_uln302/quote.rs +586 -0
  150. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +834 -0
  151. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +95 -0
  152. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +80 -0
  153. package/contracts/message-libs/uln-302/src/tests/setup.rs +268 -0
  154. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +47 -0
  155. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +51 -0
  156. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +51 -0
  157. package/contracts/message-libs/uln-302/src/tests/uln302/get_oapp_executor_config.rs +48 -0
  158. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +4 -0
  159. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +998 -0
  160. package/contracts/message-libs/uln-302/src/uln302.rs +117 -0
  161. package/contracts/oapp-macros/Cargo.toml +21 -0
  162. package/contracts/oapp-macros/src/lib.rs +408 -0
  163. package/contracts/oapp-macros/src/oapp_core.rs +49 -0
  164. package/contracts/oapp-macros/src/oapp_full.rs +15 -0
  165. package/contracts/oapp-macros/src/oapp_options_type3.rs +46 -0
  166. package/contracts/oapp-macros/src/oapp_receiver.rs +67 -0
  167. package/contracts/oapp-macros/src/oapp_sender.rs +23 -0
  168. package/contracts/oapp-macros/src/util.rs +103 -0
  169. package/contracts/oapp-macros/tests/test_macros.rs +522 -0
  170. package/contracts/oapps/Cargo.toml +12 -0
  171. package/contracts/oapps/counter/Cargo.toml +24 -0
  172. package/contracts/oapps/counter/integration_tests/mod.rs +3 -0
  173. package/contracts/oapps/counter/integration_tests/setup.rs +201 -0
  174. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +166 -0
  175. package/contracts/oapps/counter/integration_tests/utils.rs +144 -0
  176. package/contracts/oapps/counter/src/codec.rs +63 -0
  177. package/contracts/oapps/counter/src/counter.rs +235 -0
  178. package/contracts/oapps/counter/src/errors.rs +9 -0
  179. package/contracts/oapps/counter/src/lib.rs +16 -0
  180. package/contracts/oapps/counter/src/options.rs +30 -0
  181. package/contracts/oapps/counter/src/storage.rs +33 -0
  182. package/contracts/oapps/counter/src/tests/mod.rs +37 -0
  183. package/contracts/oapps/counter/src/tests/test_codec.rs +64 -0
  184. package/contracts/oapps/counter/src/tests/test_counter.rs +390 -0
  185. package/contracts/oapps/counter/src/u256_ext.rs +21 -0
  186. package/contracts/oapps/lib.rs +2 -0
  187. package/contracts/oapps/oapp/Cargo.toml +21 -0
  188. package/contracts/oapps/oapp/src/errors.rs +9 -0
  189. package/contracts/oapps/oapp/src/lib.rs +10 -0
  190. package/contracts/oapps/oapp/src/oapp_core.rs +92 -0
  191. package/contracts/oapps/oapp/src/oapp_options_type3.rs +89 -0
  192. package/contracts/oapps/oapp/src/oapp_receiver.rs +72 -0
  193. package/contracts/oapps/oapp/src/oapp_sender.rs +66 -0
  194. package/contracts/oapps/oapp/src/tests/mod.rs +4 -0
  195. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +162 -0
  196. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +180 -0
  197. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +157 -0
  198. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +283 -0
  199. package/contracts/utils/Cargo.toml +21 -0
  200. package/contracts/utils/src/buffer_reader.rs +143 -0
  201. package/contracts/utils/src/buffer_writer.rs +117 -0
  202. package/contracts/utils/src/bytes_ext.rs +19 -0
  203. package/contracts/utils/src/errors.rs +30 -0
  204. package/contracts/utils/src/lib.rs +15 -0
  205. package/contracts/utils/src/option_ext.rs +38 -0
  206. package/contracts/utils/src/ownable.rs +88 -0
  207. package/contracts/utils/src/testing_utils.rs +100 -0
  208. package/contracts/utils/src/tests/buffer_reader.rs +1006 -0
  209. package/contracts/utils/src/tests/buffer_writer.rs +330 -0
  210. package/contracts/utils/src/tests/bytes_ext.rs +77 -0
  211. package/contracts/utils/src/tests/mod.rs +4 -0
  212. package/contracts/utils/src/tests/ownable.rs +149 -0
  213. package/contracts/utils/src/ttl.rs +164 -0
  214. package/contracts/workers/Cargo.toml +13 -0
  215. package/contracts/workers/executor/Cargo.toml +26 -0
  216. package/contracts/workers/executor/src/events.rs +22 -0
  217. package/contracts/workers/executor/src/executor.rs +347 -0
  218. package/contracts/workers/executor/src/interfaces/executor.rs +40 -0
  219. package/contracts/workers/executor/src/interfaces/mod.rs +5 -0
  220. package/contracts/workers/executor/src/interfaces/types.rs +51 -0
  221. package/contracts/workers/executor/src/lib.rs +10 -0
  222. package/contracts/workers/executor/src/storage.rs +23 -0
  223. package/contracts/workers/lib.rs +2 -0
  224. package/contracts/workers/worker-common/Cargo.toml +18 -0
  225. package/contracts/workers/worker-common/src/constants.rs +17 -0
  226. package/contracts/workers/worker-common/src/errors.rs +6 -0
  227. package/contracts/workers/worker-common/src/events.rs +34 -0
  228. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +35 -0
  229. package/contracts/workers/worker-common/src/interfaces/mod.rs +7 -0
  230. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +40 -0
  231. package/contracts/workers/worker-common/src/interfaces/worker.rs +60 -0
  232. package/contracts/workers/worker-common/src/lib.rs +19 -0
  233. package/contracts/workers/worker-common/src/storage.rs +32 -0
  234. package/contracts/workers/worker-common/src/worker_common.rs +166 -0
  235. package/package.json +25 -0
  236. package/rust-toolchain.toml +4 -0
  237. package/rustfmt.toml +17 -0
  238. package/sdk/.turbo/turbo-build.log +4 -0
  239. package/sdk/dist/generated/bml.d.ts +452 -0
  240. package/sdk/dist/generated/bml.js +72 -0
  241. package/sdk/dist/generated/counter.d.ts +824 -0
  242. package/sdk/dist/generated/counter.js +125 -0
  243. package/sdk/dist/generated/endpoint.d.ts +1676 -0
  244. package/sdk/dist/generated/endpoint.js +216 -0
  245. package/sdk/dist/generated/sml.d.ts +810 -0
  246. package/sdk/dist/generated/sml.js +132 -0
  247. package/sdk/dist/generated/uln302.d.ts +1227 -0
  248. package/sdk/dist/generated/uln302.js +185 -0
  249. package/sdk/dist/index.d.ts +5 -0
  250. package/sdk/dist/index.js +5 -0
  251. package/sdk/node_modules/.bin/tsc +21 -0
  252. package/sdk/node_modules/.bin/tsserver +21 -0
  253. package/sdk/node_modules/.bin/vitest +21 -0
  254. package/sdk/node_modules/.bin/zx +21 -0
  255. package/sdk/package.json +40 -0
  256. package/sdk/src/index.ts +5 -0
  257. package/sdk/test/index.test.ts +271 -0
  258. package/sdk/test/suites/constants.ts +13 -0
  259. package/sdk/test/suites/deploy.ts +277 -0
  260. package/sdk/test/suites/localnet.ts +42 -0
  261. package/sdk/test/suites/scan.ts +189 -0
  262. package/sdk/tsconfig.json +106 -0
  263. package/tools/ts-bindings-gen/Cargo.toml +14 -0
  264. package/tools/ts-bindings-gen/src/main.rs +147 -0
  265. package/turbo.json +12 -0
@@ -0,0 +1,513 @@
1
+ use crate::{events::PacketSent, tests::endpoint_setup::setup, MessagingParams};
2
+ use soroban_sdk::{
3
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
4
+ token::TokenClient,
5
+ vec, Bytes, BytesN, IntoVal,
6
+ };
7
+ use utils::testing_utils::assert_event;
8
+
9
+ #[test]
10
+ fn test_send_with_native_fee_exact_payment() {
11
+ let context = setup();
12
+ let env = &context.env;
13
+ let endpoint_client = &context.endpoint_client;
14
+
15
+ let sender = soroban_sdk::Address::generate(env);
16
+ let refund_address = soroban_sdk::Address::generate(env);
17
+ let fee_recipient = soroban_sdk::Address::generate(env);
18
+ let dst_eid = 2u32;
19
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
20
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
21
+ let options = Bytes::new(env);
22
+
23
+ // Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
24
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
25
+ endpoint_client.set_zro(&context.zro_token_client.address);
26
+
27
+ // Setup mock send library with 100 native fee, 0 zro fee
28
+ let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient.clone());
29
+
30
+ // Register and set as default send library
31
+ context.mock_owner_auth("register_library", (&send_lib,));
32
+ endpoint_client.register_library(&send_lib);
33
+ context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
34
+ endpoint_client.set_default_send_library(&dst_eid, &send_lib);
35
+
36
+ // Mint and transfer native tokens to endpoint for payment
37
+ context.mint_native(&sender, 100);
38
+ let token_client = TokenClient::new(env, &context.native_token_client.address);
39
+ env.mock_auths(&[MockAuth {
40
+ address: &sender,
41
+ invoke: &MockAuthInvoke {
42
+ contract: &context.native_token_client.address,
43
+ fn_name: "transfer",
44
+ args: (&sender, &endpoint_client.address, &100i128).into_val(env),
45
+ sub_invokes: &[],
46
+ },
47
+ }]);
48
+ token_client.transfer(&sender, &endpoint_client.address, &100);
49
+
50
+ let params = MessagingParams {
51
+ dst_eid,
52
+ receiver: receiver.clone(),
53
+ message: message.clone(),
54
+ options: options.clone(),
55
+ pay_in_zro: false,
56
+ };
57
+
58
+ // Mock auth for sender to call send
59
+ env.mock_auths(&[MockAuth {
60
+ address: &sender,
61
+ invoke: &MockAuthInvoke {
62
+ contract: &endpoint_client.address,
63
+ fn_name: "send",
64
+ args: (&sender, &params, &refund_address).into_val(env),
65
+ sub_invokes: &[],
66
+ },
67
+ }]);
68
+
69
+ let receipt = endpoint_client.send(&sender, &params, &refund_address);
70
+
71
+ // Verify receipt
72
+ assert_eq!(receipt.nonce, 1);
73
+ assert_eq!(receipt.fee.native_fee, 100);
74
+ assert_eq!(receipt.fee.zro_fee, 0);
75
+
76
+ // Verify PacketSent event was published
77
+ // MockSendLib::send returns encoded_packet = packet.message.clone()
78
+ assert_event(
79
+ env,
80
+ &endpoint_client.address,
81
+ PacketSent { encoded_packet: message, options, send_library: send_lib },
82
+ );
83
+
84
+ // Verify outbound nonce was incremented
85
+ let nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
86
+ assert_eq!(nonce, 1);
87
+
88
+ // Verify fee was paid to fee_recipient
89
+ assert_eq!(context.native_token_client.balance(&fee_recipient), 100);
90
+
91
+ // Verify no refund (exact payment)
92
+ assert_eq!(context.native_token_client.balance(&refund_address), 0);
93
+ }
94
+
95
+ #[test]
96
+ fn test_send_with_native_fee_and_refund() {
97
+ let context = setup();
98
+ let env = &context.env;
99
+ let endpoint_client = &context.endpoint_client;
100
+
101
+ let sender = soroban_sdk::Address::generate(env);
102
+ let refund_address = soroban_sdk::Address::generate(env);
103
+ let dst_eid = 2u32;
104
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
105
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
106
+ let options = Bytes::new(env);
107
+ let fee_recipient = soroban_sdk::Address::generate(env);
108
+
109
+ // Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
110
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
111
+ endpoint_client.set_zro(&context.zro_token_client.address);
112
+
113
+ // Setup mock send library with 100 native fee
114
+ let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient.clone());
115
+
116
+ // Register and set as default send library
117
+ context.mock_owner_auth("register_library", (&send_lib,));
118
+ endpoint_client.register_library(&send_lib);
119
+ context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
120
+ endpoint_client.set_default_send_library(&dst_eid, &send_lib);
121
+
122
+ // Mint and transfer MORE native tokens than needed (overpay)
123
+ context.mint_native(&sender, 250);
124
+ let token_client = TokenClient::new(env, &context.native_token_client.address);
125
+ env.mock_auths(&[MockAuth {
126
+ address: &sender,
127
+ invoke: &MockAuthInvoke {
128
+ contract: &context.native_token_client.address,
129
+ fn_name: "transfer",
130
+ args: (&sender, &endpoint_client.address, &250i128).into_val(env),
131
+ sub_invokes: &[],
132
+ },
133
+ }]);
134
+ token_client.transfer(&sender, &endpoint_client.address, &250);
135
+
136
+ let params = MessagingParams { dst_eid, receiver: receiver.clone(), message, options, pay_in_zro: false };
137
+
138
+ // Mock auth for sender to call send
139
+ env.mock_auths(&[MockAuth {
140
+ address: &sender,
141
+ invoke: &MockAuthInvoke {
142
+ contract: &endpoint_client.address,
143
+ fn_name: "send",
144
+ args: (&sender, &params, &refund_address).into_val(env),
145
+ sub_invokes: &[],
146
+ },
147
+ }]);
148
+
149
+ let receipt = endpoint_client.send(&sender, &params, &refund_address);
150
+
151
+ // Verify receipt
152
+ assert_eq!(receipt.nonce, 1);
153
+ assert_eq!(receipt.fee.native_fee, 100);
154
+
155
+ // Verify fee was paid to fee_recipient
156
+ assert_eq!(context.native_token_client.balance(&fee_recipient), 100);
157
+
158
+ // Verify refund (250 - 100 = 150)
159
+ assert_eq!(context.native_token_client.balance(&refund_address), 150);
160
+ }
161
+
162
+ #[test]
163
+ fn test_send_increments_nonce_sequentially() {
164
+ let context = setup();
165
+ let env = &context.env;
166
+ let endpoint_client = &context.endpoint_client;
167
+
168
+ let sender = soroban_sdk::Address::generate(env);
169
+ let refund_address = soroban_sdk::Address::generate(env);
170
+ let dst_eid = 2u32;
171
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
172
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
173
+ let options = Bytes::new(env);
174
+ let fee_recipient = soroban_sdk::Address::generate(env);
175
+
176
+ // Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
177
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
178
+ endpoint_client.set_zro(&context.zro_token_client.address);
179
+
180
+ // Setup mock send library
181
+ let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 50, 0, fee_recipient.clone());
182
+ context.mock_owner_auth("register_library", (&send_lib,));
183
+ endpoint_client.register_library(&send_lib);
184
+ context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
185
+ endpoint_client.set_default_send_library(&dst_eid, &send_lib);
186
+
187
+ // Mint tokens for multiple sends
188
+ context.mint_native(&sender, 200);
189
+ let token_client = TokenClient::new(env, &context.native_token_client.address);
190
+
191
+ let params = MessagingParams {
192
+ dst_eid,
193
+ receiver: receiver.clone(),
194
+ message: message.clone(),
195
+ options: options.clone(),
196
+ pay_in_zro: false,
197
+ };
198
+
199
+ // Send first message
200
+ env.mock_auths(&[MockAuth {
201
+ address: &sender,
202
+ invoke: &MockAuthInvoke {
203
+ contract: &context.native_token_client.address,
204
+ fn_name: "transfer",
205
+ args: (&sender, &endpoint_client.address, &50i128).into_val(env),
206
+ sub_invokes: &[],
207
+ },
208
+ }]);
209
+ token_client.transfer(&sender, &endpoint_client.address, &50);
210
+
211
+ env.mock_auths(&[MockAuth {
212
+ address: &sender,
213
+ invoke: &MockAuthInvoke {
214
+ contract: &endpoint_client.address,
215
+ fn_name: "send",
216
+ args: (&sender, &params, &refund_address).into_val(env),
217
+ sub_invokes: &[],
218
+ },
219
+ }]);
220
+ let receipt1 = endpoint_client.send(&sender, &params, &refund_address);
221
+
222
+ // Send second message
223
+ env.mock_auths(&[MockAuth {
224
+ address: &sender,
225
+ invoke: &MockAuthInvoke {
226
+ contract: &context.native_token_client.address,
227
+ fn_name: "transfer",
228
+ args: (&sender, &endpoint_client.address, &50i128).into_val(env),
229
+ sub_invokes: &[],
230
+ },
231
+ }]);
232
+ token_client.transfer(&sender, &endpoint_client.address, &50);
233
+
234
+ env.mock_auths(&[MockAuth {
235
+ address: &sender,
236
+ invoke: &MockAuthInvoke {
237
+ contract: &endpoint_client.address,
238
+ fn_name: "send",
239
+ args: (&sender, &params, &refund_address).into_val(env),
240
+ sub_invokes: &[],
241
+ },
242
+ }]);
243
+ let receipt2 = endpoint_client.send(&sender, &params, &refund_address);
244
+
245
+ // Send third message
246
+ env.mock_auths(&[MockAuth {
247
+ address: &sender,
248
+ invoke: &MockAuthInvoke {
249
+ contract: &context.native_token_client.address,
250
+ fn_name: "transfer",
251
+ args: (&sender, &endpoint_client.address, &50i128).into_val(env),
252
+ sub_invokes: &[],
253
+ },
254
+ }]);
255
+ token_client.transfer(&sender, &endpoint_client.address, &50);
256
+
257
+ env.mock_auths(&[MockAuth {
258
+ address: &sender,
259
+ invoke: &MockAuthInvoke {
260
+ contract: &endpoint_client.address,
261
+ fn_name: "send",
262
+ args: (&sender, &params, &refund_address).into_val(env),
263
+ sub_invokes: &[],
264
+ },
265
+ }]);
266
+ let receipt3 = endpoint_client.send(&sender, &params, &refund_address);
267
+
268
+ // Verify nonces increment sequentially
269
+ assert_eq!(receipt1.nonce, 1);
270
+ assert_eq!(receipt2.nonce, 2);
271
+ assert_eq!(receipt3.nonce, 3);
272
+
273
+ // Verify final outbound nonce
274
+ let final_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
275
+ assert_eq!(final_nonce, 3);
276
+ }
277
+
278
+ #[test]
279
+ fn test_send_with_custom_send_library() {
280
+ let context = setup();
281
+ let env = &context.env;
282
+ let endpoint_client = &context.endpoint_client;
283
+
284
+ let sender = soroban_sdk::Address::generate(env);
285
+ let refund_address = soroban_sdk::Address::generate(env);
286
+ let dst_eid = 2u32;
287
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
288
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
289
+ let options = Bytes::new(env);
290
+ let default_fee_recipient = soroban_sdk::Address::generate(env);
291
+ let custom_fee_recipient = soroban_sdk::Address::generate(env);
292
+
293
+ // Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
294
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
295
+ endpoint_client.set_zro(&context.zro_token_client.address);
296
+
297
+ // Setup default send library with 100 fee
298
+ let default_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, default_fee_recipient.clone());
299
+ context.mock_owner_auth("register_library", (&default_lib,));
300
+ endpoint_client.register_library(&default_lib);
301
+ context.mock_owner_auth("set_default_send_library", (&dst_eid, &default_lib));
302
+ endpoint_client.set_default_send_library(&dst_eid, &default_lib);
303
+
304
+ // Setup custom send library with different fee (200)
305
+ let custom_lib = context.setup_mock_send_lib(vec![env, dst_eid], 200, 0, custom_fee_recipient.clone());
306
+ context.mock_owner_auth("register_library", (&custom_lib,));
307
+ endpoint_client.register_library(&custom_lib);
308
+
309
+ // Set custom library for this sender
310
+ env.mock_auths(&[MockAuth {
311
+ address: &sender,
312
+ invoke: &MockAuthInvoke {
313
+ contract: &endpoint_client.address,
314
+ fn_name: "set_send_library",
315
+ args: (&sender, &sender, &dst_eid, &custom_lib).into_val(env),
316
+ sub_invokes: &[],
317
+ },
318
+ }]);
319
+ endpoint_client.set_send_library(&sender, &sender, &dst_eid, &Some(custom_lib.clone()));
320
+
321
+ // Mint and transfer tokens for custom library fee
322
+ context.mint_native(&sender, 200);
323
+ let token_client = TokenClient::new(env, &context.native_token_client.address);
324
+ env.mock_auths(&[MockAuth {
325
+ address: &sender,
326
+ invoke: &MockAuthInvoke {
327
+ contract: &context.native_token_client.address,
328
+ fn_name: "transfer",
329
+ args: (&sender, &endpoint_client.address, &200i128).into_val(env),
330
+ sub_invokes: &[],
331
+ },
332
+ }]);
333
+ token_client.transfer(&sender, &endpoint_client.address, &200);
334
+
335
+ let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
336
+
337
+ // Mock auth for sender to call send
338
+ env.mock_auths(&[MockAuth {
339
+ address: &sender,
340
+ invoke: &MockAuthInvoke {
341
+ contract: &endpoint_client.address,
342
+ fn_name: "send",
343
+ args: (&sender, &params, &refund_address).into_val(env),
344
+ sub_invokes: &[],
345
+ },
346
+ }]);
347
+
348
+ let receipt = endpoint_client.send(&sender, &params, &refund_address);
349
+
350
+ // Verify receipt uses custom library fee (200, not 100)
351
+ assert_eq!(receipt.fee.native_fee, 200);
352
+
353
+ // Verify fee was paid to custom_fee_recipient (not default_fee_recipient)
354
+ assert_eq!(context.native_token_client.balance(&custom_fee_recipient), 200);
355
+ assert_eq!(context.native_token_client.balance(&default_fee_recipient), 0);
356
+ }
357
+
358
+ #[test]
359
+ fn test_send_to_different_receivers() {
360
+ let context = setup();
361
+ let env = &context.env;
362
+ let endpoint_client = &context.endpoint_client;
363
+
364
+ let sender = soroban_sdk::Address::generate(env);
365
+ let refund_address = soroban_sdk::Address::generate(env);
366
+ let dst_eid = 2u32;
367
+ let receiver1 = BytesN::from_array(env, &[1u8; 32]);
368
+ let receiver2 = BytesN::from_array(env, &[2u8; 32]);
369
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
370
+ let options = Bytes::new(env);
371
+ let fee_recipient = soroban_sdk::Address::generate(env);
372
+
373
+ // Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
374
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
375
+ endpoint_client.set_zro(&context.zro_token_client.address);
376
+
377
+ // Setup mock send library
378
+ let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 50, 0, fee_recipient);
379
+ context.mock_owner_auth("register_library", (&send_lib,));
380
+ endpoint_client.register_library(&send_lib);
381
+ context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
382
+ endpoint_client.set_default_send_library(&dst_eid, &send_lib);
383
+
384
+ // Mint tokens
385
+ context.mint_native(&sender, 100);
386
+ let token_client = TokenClient::new(env, &context.native_token_client.address);
387
+
388
+ // Send to receiver1
389
+ env.mock_auths(&[MockAuth {
390
+ address: &sender,
391
+ invoke: &MockAuthInvoke {
392
+ contract: &context.native_token_client.address,
393
+ fn_name: "transfer",
394
+ args: (&sender, &endpoint_client.address, &50i128).into_val(env),
395
+ sub_invokes: &[],
396
+ },
397
+ }]);
398
+ token_client.transfer(&sender, &endpoint_client.address, &50);
399
+
400
+ let params1 = MessagingParams {
401
+ dst_eid,
402
+ receiver: receiver1.clone(),
403
+ message: message.clone(),
404
+ options: options.clone(),
405
+ pay_in_zro: false,
406
+ };
407
+
408
+ env.mock_auths(&[MockAuth {
409
+ address: &sender,
410
+ invoke: &MockAuthInvoke {
411
+ contract: &endpoint_client.address,
412
+ fn_name: "send",
413
+ args: (&sender, &params1, &refund_address).into_val(env),
414
+ sub_invokes: &[],
415
+ },
416
+ }]);
417
+ let receipt1 = endpoint_client.send(&sender, &params1, &refund_address);
418
+
419
+ // Send to receiver2
420
+ env.mock_auths(&[MockAuth {
421
+ address: &sender,
422
+ invoke: &MockAuthInvoke {
423
+ contract: &context.native_token_client.address,
424
+ fn_name: "transfer",
425
+ args: (&sender, &endpoint_client.address, &50i128).into_val(env),
426
+ sub_invokes: &[],
427
+ },
428
+ }]);
429
+ token_client.transfer(&sender, &endpoint_client.address, &50);
430
+
431
+ let params2 = MessagingParams { dst_eid, receiver: receiver2.clone(), message, options, pay_in_zro: false };
432
+
433
+ env.mock_auths(&[MockAuth {
434
+ address: &sender,
435
+ invoke: &MockAuthInvoke {
436
+ contract: &endpoint_client.address,
437
+ fn_name: "send",
438
+ args: (&sender, &params2, &refund_address).into_val(env),
439
+ sub_invokes: &[],
440
+ },
441
+ }]);
442
+ let receipt2 = endpoint_client.send(&sender, &params2, &refund_address);
443
+
444
+ // Verify each receiver has its own nonce tracking
445
+ assert_eq!(receipt1.nonce, 1);
446
+ assert_eq!(receipt2.nonce, 1); // First message to receiver2
447
+
448
+ // Verify outbound nonces are tracked separately per receiver
449
+ let nonce1 = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver1);
450
+ let nonce2 = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver2);
451
+ assert_eq!(nonce1, 1);
452
+ assert_eq!(nonce2, 1);
453
+ }
454
+
455
+ #[test]
456
+ fn test_send_returns_correct_guid() {
457
+ let context = setup();
458
+ let env = &context.env;
459
+ let endpoint_client = &context.endpoint_client;
460
+
461
+ let sender = soroban_sdk::Address::generate(env);
462
+ let refund_address = soroban_sdk::Address::generate(env);
463
+ let dst_eid = 2u32;
464
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
465
+ let message = Bytes::from_array(env, &[1, 2, 3, 4]);
466
+ let options = Bytes::new(env);
467
+ let fee_recipient = soroban_sdk::Address::generate(env);
468
+
469
+ // Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
470
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
471
+ endpoint_client.set_zro(&context.zro_token_client.address);
472
+
473
+ // Setup mock send library
474
+ let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient);
475
+ context.mock_owner_auth("register_library", (&send_lib,));
476
+ endpoint_client.register_library(&send_lib);
477
+ context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
478
+ endpoint_client.set_default_send_library(&dst_eid, &send_lib);
479
+
480
+ // Get the expected GUID before sending
481
+ let next_guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
482
+
483
+ // Mint and transfer tokens
484
+ context.mint_native(&sender, 100);
485
+ let token_client = TokenClient::new(env, &context.native_token_client.address);
486
+ env.mock_auths(&[MockAuth {
487
+ address: &sender,
488
+ invoke: &MockAuthInvoke {
489
+ contract: &context.native_token_client.address,
490
+ fn_name: "transfer",
491
+ args: (&sender, &endpoint_client.address, &100i128).into_val(env),
492
+ sub_invokes: &[],
493
+ },
494
+ }]);
495
+ token_client.transfer(&sender, &endpoint_client.address, &100);
496
+
497
+ let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
498
+
499
+ env.mock_auths(&[MockAuth {
500
+ address: &sender,
501
+ invoke: &MockAuthInvoke {
502
+ contract: &endpoint_client.address,
503
+ fn_name: "send",
504
+ args: (&sender, &params, &refund_address).into_val(env),
505
+ sub_invokes: &[],
506
+ },
507
+ }]);
508
+
509
+ let receipt = endpoint_client.send(&sender, &params, &refund_address);
510
+
511
+ // Verify the GUID in receipt matches the expected GUID
512
+ assert_eq!(receipt.guid, next_guid);
513
+ }
@@ -0,0 +1,43 @@
1
+ use crate::{events::DelegateSet, storage, tests::endpoint_setup::setup};
2
+ use soroban_sdk::{
3
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
4
+ Address, IntoVal,
5
+ };
6
+ use utils::testing_utils::assert_event;
7
+
8
+ #[test]
9
+ fn test_set_delegate() {
10
+ let context = setup();
11
+ let env = &context.env;
12
+ let endpoint_client = &context.endpoint_client;
13
+
14
+ let oapp = Address::generate(env);
15
+ let delegate = Address::generate(env);
16
+
17
+ // Verify initial state - delegate should not be set
18
+ let initial_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
19
+ assert_eq!(initial_delegate, None, "Initial delegate should be None");
20
+
21
+ let delegate_option = Some(delegate.clone());
22
+ env.mock_auths(&[MockAuth {
23
+ address: &oapp,
24
+ invoke: &MockAuthInvoke {
25
+ contract: &endpoint_client.address,
26
+ fn_name: "set_delegate",
27
+ args: (&oapp, &delegate_option).into_val(env),
28
+ sub_invokes: &[],
29
+ },
30
+ }]);
31
+ endpoint_client.set_delegate(&oapp, &delegate_option);
32
+
33
+ // Assert event was published
34
+ assert_event(env, &endpoint_client.address, DelegateSet { oapp: oapp.clone(), delegate: Some(delegate.clone()) });
35
+
36
+ // Verify delegate via public interface
37
+ let actual_delegate = endpoint_client.delegate(&oapp);
38
+ assert_eq!(actual_delegate, Some(delegate.clone()), "Delegate should be set");
39
+
40
+ // Assert storage change directly
41
+ let stored_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
42
+ assert_eq!(stored_delegate, Some(delegate.clone()), "Storage should contain the delegate address");
43
+ }
@@ -0,0 +1,27 @@
1
+ use crate::{events::ZROSet, storage, tests::endpoint_setup::setup};
2
+ use utils::testing_utils::assert_event;
3
+
4
+ #[test]
5
+ fn test_set_zro() {
6
+ let context = setup();
7
+ let env = &context.env;
8
+ let endpoint_client = &context.endpoint_client;
9
+
10
+ // Verify initial state - ZRO should not be set
11
+ let initial_zro = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::zro(env));
12
+ assert_eq!(initial_zro, None, "Initial ZRO should be None");
13
+
14
+ context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
15
+ endpoint_client.set_zro(&context.zro_token_client.address);
16
+
17
+ // Assert event was published
18
+ assert_event(env, &endpoint_client.address, ZROSet { zro: context.zro_token_client.address.clone() });
19
+
20
+ // Verify ZRO token is set via public interface
21
+ let zro_token = endpoint_client.zro();
22
+ assert_eq!(zro_token, Some(context.zro_token_client.address.clone()));
23
+
24
+ // Assert storage change directly
25
+ let stored_zro = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::zro(env));
26
+ assert_eq!(stored_zro, Some(context.zro_token_client.address.clone()), "Storage should contain the ZRO address");
27
+ }
@@ -0,0 +1,30 @@
1
+ use crate::tests::endpoint_setup::setup;
2
+ use soroban_sdk::testutils::Address as _;
3
+ use utils::ownable::DefaultOwnableStorage;
4
+
5
+ #[test]
6
+ fn test_transfer_ownership() {
7
+ let context = setup();
8
+ let env = &context.env;
9
+ let endpoint_client = &context.endpoint_client;
10
+ let new_owner = soroban_sdk::Address::generate(env);
11
+
12
+ // Verify initial owner via public interface
13
+ let initial_owner = endpoint_client.owner();
14
+ assert_eq!(initial_owner, Some(context.owner.clone()));
15
+
16
+ // Verify initial owner in storage directly
17
+ let initial_owner = env.as_contract(&endpoint_client.address, || DefaultOwnableStorage::owner(env));
18
+ assert_eq!(initial_owner, Some(context.owner.clone()), "Initial owner should be in storage");
19
+
20
+ context.mock_owner_auth("transfer_ownership", (&new_owner,));
21
+ endpoint_client.transfer_ownership(&new_owner);
22
+
23
+ // Verify new owner via public interface
24
+ let owner = endpoint_client.owner();
25
+ assert_eq!(owner, Some(new_owner.clone()));
26
+
27
+ // Assert storage change directly
28
+ let stored_owner = env.as_contract(&endpoint_client.address, || DefaultOwnableStorage::owner(env));
29
+ assert_eq!(stored_owner, Some(new_owner), "Storage should contain the new owner");
30
+ }