@layerzerolabs/protocol-stellar-v2 0.2.8 → 0.2.9

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 (239) hide show
  1. package/.turbo/turbo-build.log +443 -302
  2. package/.turbo/turbo-lint.log +118 -96
  3. package/.turbo/turbo-test.log +853 -731
  4. package/Cargo.lock +120 -37
  5. package/Cargo.toml +8 -5
  6. package/contracts/common-macros/src/contract_impl.rs +44 -0
  7. package/contracts/common-macros/src/lib.rs +86 -40
  8. package/contracts/common-macros/src/ownable.rs +24 -32
  9. package/contracts/common-macros/src/storage.rs +95 -120
  10. package/contracts/common-macros/src/tests/contract_impl.rs +289 -0
  11. package/contracts/common-macros/src/tests/mod.rs +9 -0
  12. package/contracts/common-macros/src/tests/ownable.rs +151 -0
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +85 -0
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +30 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap +9 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +1072 -0
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +45 -0
  18. package/contracts/common-macros/src/tests/storage.rs +485 -0
  19. package/contracts/common-macros/src/tests/test_helpers.rs +93 -0
  20. package/contracts/common-macros/src/tests/ttl_configurable.rs +34 -0
  21. package/contracts/common-macros/src/ttl_configurable.rs +31 -14
  22. package/contracts/common-macros/src/utils.rs +27 -0
  23. package/contracts/endpoint-v2/ARCHITECTURE.md +4 -4
  24. package/contracts/endpoint-v2/src/endpoint_v2.rs +18 -15
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +2 -3
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +5 -3
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +2 -2
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  29. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +4 -4
  30. package/contracts/endpoint-v2/src/lib.rs +6 -5
  31. package/contracts/endpoint-v2/src/message_lib_manager.rs +14 -6
  32. package/contracts/endpoint-v2/src/messaging_channel.rs +6 -2
  33. package/contracts/endpoint-v2/src/messaging_composer.rs +6 -2
  34. package/contracts/endpoint-v2/src/storage.rs +10 -7
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +16 -16
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +46 -46
  37. package/contracts/endpoint-v2/src/tests/mock.rs +2 -2
  38. package/contracts/endpoint-v2/src/util.rs +8 -2
  39. package/contracts/message-libs/block-message-lib/Cargo.toml +1 -0
  40. package/contracts/message-libs/block-message-lib/src/lib.rs +5 -5
  41. package/contracts/message-libs/message-lib-common/src/errors.rs +8 -8
  42. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +0 -1
  43. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +3 -3
  44. package/contracts/message-libs/message-lib-common/src/lib.rs +0 -2
  45. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +4 -6
  46. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +2 -2
  47. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +11 -11
  48. package/contracts/message-libs/message-lib-common/src/worker_options.rs +10 -16
  49. package/contracts/message-libs/simple-message-lib/src/errors.rs +0 -4
  50. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +49 -34
  51. package/contracts/message-libs/simple-message-lib/src/storage.rs +3 -7
  52. package/contracts/message-libs/simple-message-lib/src/test.rs +3 -3
  53. package/contracts/message-libs/treasury/src/storage.rs +1 -2
  54. package/contracts/message-libs/treasury/src/tests/setup.rs +3 -2
  55. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +0 -13
  56. package/contracts/message-libs/treasury/src/treasury.rs +18 -21
  57. package/contracts/message-libs/uln-302/Cargo.toml +1 -0
  58. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +4 -4
  59. package/contracts/message-libs/uln-302/src/interfaces/{receive.rs → receive_uln.rs} +3 -3
  60. package/contracts/message-libs/uln-302/src/interfaces/{send.rs → send_uln.rs} +8 -80
  61. package/contracts/message-libs/uln-302/src/lib.rs +5 -4
  62. package/contracts/message-libs/uln-302/src/{receive.rs → receive_uln.rs} +20 -12
  63. package/contracts/message-libs/uln-302/src/{send.rs → send_uln.rs} +19 -13
  64. package/contracts/message-libs/uln-302/src/storage.rs +1 -2
  65. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +3 -2
  66. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +30 -30
  67. package/contracts/message-libs/uln-302/src/tests/setup.rs +12 -11
  68. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +1 -1
  69. package/contracts/message-libs/uln-302/src/{config_validation.rs → types.rs} +79 -11
  70. package/contracts/message-libs/uln-302/src/uln302.rs +15 -10
  71. package/contracts/oapp-macros/Cargo.toml +2 -8
  72. package/contracts/oapp-macros/src/lib.rs +57 -311
  73. package/contracts/oapp-macros/src/oapp_core.rs +23 -32
  74. package/contracts/oapp-macros/src/oapp_full.rs +8 -2
  75. package/contracts/oapp-macros/src/oapp_options_type3.rs +21 -36
  76. package/contracts/oapp-macros/src/oapp_receiver.rs +38 -57
  77. package/contracts/oapp-macros/src/oapp_sender.rs +12 -14
  78. package/contracts/oapp-macros/src/util.rs +14 -10
  79. package/contracts/oapps/counter/Cargo.toml +2 -1
  80. package/contracts/oapps/counter/integration_tests/utils.rs +4 -4
  81. package/contracts/oapps/counter/src/codec.rs +8 -9
  82. package/contracts/oapps/counter/src/counter.rs +156 -147
  83. package/contracts/oapps/counter/src/storage.rs +1 -2
  84. package/contracts/oapps/counter/src/tests/test_codec.rs +5 -5
  85. package/contracts/oapps/counter/src/tests/test_counter.rs +11 -13
  86. package/contracts/oapps/oapp/Cargo.toml +1 -0
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/lib.rs +3 -0
  89. package/contracts/oapps/oapp/src/macro_tests/mod.rs +1 -0
  90. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +312 -0
  91. package/contracts/oapps/oapp/src/oapp_core.rs +52 -53
  92. package/contracts/oapps/oapp/src/oapp_options_type3.rs +18 -28
  93. package/contracts/oapps/oapp/src/oapp_receiver.rs +82 -31
  94. package/contracts/oapps/oapp/src/oapp_sender.rs +55 -13
  95. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +16 -3
  96. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +33 -8
  97. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +6 -9
  98. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +28 -15
  99. package/contracts/oapps/oft/Cargo.toml +27 -0
  100. package/contracts/oapps/oft/integration-tests/mod.rs +3 -0
  101. package/contracts/oapps/oft/integration-tests/setup.rs +320 -0
  102. package/contracts/oapps/oft/integration-tests/test_with_sml.rs +155 -0
  103. package/contracts/oapps/oft/integration-tests/utils.rs +201 -0
  104. package/contracts/oapps/oft/src/codec/mod.rs +2 -0
  105. package/contracts/oapps/oft/src/codec/oft_compose_msg_codec.rs +55 -0
  106. package/contracts/oapps/oft/src/codec/oft_msg_codec.rs +62 -0
  107. package/contracts/oapps/oft/src/constants.rs +5 -0
  108. package/contracts/oapps/oft/src/errors.rs +8 -0
  109. package/contracts/oapps/oft/src/events.rs +19 -0
  110. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +23 -0
  111. package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
  112. package/contracts/oapps/oft/src/lib.rs +22 -0
  113. package/contracts/oapps/oft/src/macro_tests/mod.rs +2 -0
  114. package/contracts/oapps/oft/src/macro_tests/test_all_default.rs +41 -0
  115. package/contracts/oapps/oft/src/macro_tests/test_override.rs +83 -0
  116. package/contracts/oapps/oft/src/oft.rs +320 -0
  117. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +50 -0
  118. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +50 -0
  119. package/contracts/oapps/oft/src/oft_types/mod.rs +10 -0
  120. package/contracts/oapps/oft/src/storage.rs +11 -0
  121. package/contracts/oapps/oft/src/tests/mod.rs +13 -0
  122. package/contracts/oapps/oft/src/tests/test_decimals.rs +89 -0
  123. package/contracts/oapps/oft/src/tests/test_lz_receive.rs +282 -0
  124. package/contracts/oapps/oft/src/tests/test_oft_compose_msg_codec.rs +68 -0
  125. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +136 -0
  126. package/contracts/oapps/oft/src/tests/test_oft_version.rs +13 -0
  127. package/contracts/oapps/oft/src/tests/test_quote_oft.rs +159 -0
  128. package/contracts/oapps/oft/src/tests/test_quote_send.rs +195 -0
  129. package/contracts/oapps/oft/src/tests/test_resolve_address.rs +37 -0
  130. package/contracts/oapps/oft/src/tests/test_send.rs +915 -0
  131. package/contracts/oapps/oft/src/tests/test_token.rs +47 -0
  132. package/contracts/oapps/oft/src/tests/test_utils.rs +789 -0
  133. package/contracts/oapps/oft/src/types.rs +38 -0
  134. package/contracts/oapps/oft/src/utils.rs +67 -0
  135. package/contracts/oapps/oft-mint-burn/Cargo.toml +26 -0
  136. package/contracts/oapps/oft-mint-burn/src/lib.rs +3 -0
  137. package/contracts/oapps/oft-mint-burn/src/oft.rs +28 -0
  138. package/contracts/oapps/oft-mint-burn/src/tests/mod.rs +1 -0
  139. package/contracts/utils/src/buffer_reader.rs +8 -9
  140. package/contracts/utils/src/buffer_writer.rs +11 -5
  141. package/contracts/utils/src/errors.rs +5 -5
  142. package/contracts/utils/src/ownable.rs +14 -6
  143. package/contracts/utils/src/testing_utils.rs +11 -1
  144. package/contracts/utils/src/tests/buffer_reader.rs +491 -730
  145. package/contracts/utils/src/tests/buffer_writer.rs +336 -148
  146. package/contracts/utils/src/tests/bytes_ext.rs +125 -40
  147. package/contracts/utils/src/tests/mod.rs +3 -0
  148. package/contracts/utils/src/tests/ownable.rs +379 -27
  149. package/contracts/utils/src/tests/test_helper.rs +47 -0
  150. package/contracts/utils/src/tests/testing_utils.rs +555 -0
  151. package/contracts/utils/src/tests/ttl.rs +421 -0
  152. package/contracts/utils/src/ttl.rs +29 -89
  153. package/contracts/workers/dvn/Cargo.toml +31 -0
  154. package/contracts/workers/dvn/src/auth.rs +66 -0
  155. package/contracts/workers/dvn/src/dvn.rs +143 -0
  156. package/contracts/workers/dvn/src/errors.rs +21 -0
  157. package/contracts/workers/dvn/src/events.rs +19 -0
  158. package/contracts/workers/dvn/src/interfaces/dvn.rs +12 -0
  159. package/contracts/workers/dvn/src/interfaces/mod.rs +5 -0
  160. package/contracts/workers/dvn/src/interfaces/multisig.rs +15 -0
  161. package/contracts/workers/dvn/src/lib.rs +24 -0
  162. package/contracts/workers/dvn/src/multisig.rs +127 -0
  163. package/contracts/workers/dvn/src/storage.rs +35 -0
  164. package/contracts/workers/dvn/src/tests/auth.rs +237 -0
  165. package/contracts/workers/dvn/src/tests/dvn.rs +349 -0
  166. package/contracts/workers/dvn/src/tests/key_pair.rs +66 -0
  167. package/contracts/workers/dvn/src/tests/mod.rs +5 -0
  168. package/contracts/workers/dvn/src/tests/multisig/mod.rs +3 -0
  169. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +133 -0
  170. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +108 -0
  171. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +109 -0
  172. package/contracts/workers/dvn/src/tests/setup.rs +109 -0
  173. package/contracts/workers/dvn/src/types.rs +26 -0
  174. package/contracts/workers/dvn-fee-lib/Cargo.toml +24 -0
  175. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +113 -0
  176. package/contracts/workers/dvn-fee-lib/src/errors.rs +8 -0
  177. package/contracts/workers/dvn-fee-lib/src/lib.rs +17 -0
  178. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +282 -0
  179. package/contracts/workers/dvn-fee-lib/src/tests/mod.rs +1 -0
  180. package/contracts/workers/executor/Cargo.toml +10 -7
  181. package/contracts/workers/executor/src/errors.rs +8 -0
  182. package/contracts/workers/executor/src/events.rs +4 -7
  183. package/contracts/workers/executor/src/interfaces/executor.rs +72 -22
  184. package/contracts/workers/executor/src/interfaces/mod.rs +0 -2
  185. package/contracts/workers/executor/src/lib.rs +16 -7
  186. package/contracts/workers/executor/src/lz_executor.rs +308 -0
  187. package/contracts/workers/executor/src/storage.rs +24 -16
  188. package/contracts/workers/executor-fee-lib/Cargo.toml +22 -0
  189. package/contracts/workers/executor-fee-lib/src/errors.rs +15 -0
  190. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +215 -0
  191. package/contracts/workers/executor-fee-lib/src/executor_option.rs +203 -0
  192. package/contracts/workers/executor-fee-lib/src/lib.rs +7 -0
  193. package/contracts/workers/executor-helper/Cargo.toml +29 -0
  194. package/contracts/workers/executor-helper/src/executor_helper.rs +161 -0
  195. package/contracts/workers/executor-helper/src/lib.rs +11 -0
  196. package/contracts/workers/{worker-common → worker}/Cargo.toml +1 -4
  197. package/contracts/workers/worker/src/errors.rs +24 -0
  198. package/contracts/workers/worker/src/events.rs +62 -0
  199. package/contracts/workers/worker/src/interfaces/dvn_fee_lib.rs +75 -0
  200. package/contracts/workers/worker/src/interfaces/executor_fee_lib.rs +84 -0
  201. package/contracts/workers/{worker-common → worker}/src/interfaces/mod.rs +2 -2
  202. package/contracts/workers/worker/src/interfaces/price_feed.rs +85 -0
  203. package/contracts/workers/worker/src/lib.rs +14 -0
  204. package/contracts/workers/worker/src/storage.rs +63 -0
  205. package/contracts/workers/worker/src/worker.rs +459 -0
  206. package/package.json +3 -3
  207. package/sdk/dist/generated/bml.d.ts +88 -17
  208. package/sdk/dist/generated/bml.js +62 -16
  209. package/sdk/dist/generated/counter.d.ts +281 -102
  210. package/sdk/dist/generated/counter.js +93 -41
  211. package/sdk/dist/generated/endpoint.d.ts +128 -105
  212. package/sdk/dist/generated/endpoint.js +47 -45
  213. package/sdk/dist/generated/sml.d.ts +212 -69
  214. package/sdk/dist/generated/sml.js +103 -53
  215. package/sdk/dist/generated/uln302.d.ts +270 -173
  216. package/sdk/dist/generated/uln302.js +112 -64
  217. package/sdk/package.json +11 -11
  218. package/sdk/test/index.test.ts +147 -42
  219. package/sdk/test/suites/constants.ts +7 -3
  220. package/sdk/test/suites/deploy.ts +65 -42
  221. package/sdk/test/suites/localnet.ts +2 -2
  222. package/sdk/test/suites/scan.ts +28 -25
  223. package/sdk/test/utils.ts +199 -0
  224. package/sdk/tsconfig.json +93 -95
  225. package/tools/ts-bindings-gen/src/main.rs +2 -0
  226. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +0 -310
  227. package/contracts/common-macros/src/tests.rs +0 -287
  228. package/contracts/oapp-macros/tests/test_macros.rs +0 -522
  229. package/contracts/workers/executor/src/executor.rs +0 -347
  230. package/contracts/workers/executor/src/interfaces/types.rs +0 -51
  231. package/contracts/workers/worker-common/src/constants.rs +0 -17
  232. package/contracts/workers/worker-common/src/errors.rs +0 -6
  233. package/contracts/workers/worker-common/src/events.rs +0 -34
  234. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +0 -35
  235. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +0 -40
  236. package/contracts/workers/worker-common/src/interfaces/worker.rs +0 -60
  237. package/contracts/workers/worker-common/src/lib.rs +0 -19
  238. package/contracts/workers/worker-common/src/storage.rs +0 -32
  239. package/contracts/workers/worker-common/src/worker_common.rs +0 -166
@@ -0,0 +1,136 @@
1
+ use crate::codec::oft_msg_codec::OFTMessage;
2
+ use crate::utils::address_to_bytes32;
3
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN, Env};
4
+
5
+ #[test]
6
+ fn test_encode_and_decode_without_compose() {
7
+ let env = Env::default();
8
+ let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
9
+ let amount_sd_val = 1000u64;
10
+
11
+ let msg =
12
+ OFTMessage { send_to: send_to_addr.clone(), amount_sd: amount_sd_val, compose_from: None, compose_msg: None };
13
+ let (encoded, has_compose) = msg.encode(&env);
14
+
15
+ assert_eq!(has_compose, false);
16
+
17
+ // Test decode function
18
+ let decoded = OFTMessage::decode(&encoded);
19
+ assert_eq!(decoded.send_to, send_to_addr);
20
+ assert_eq!(decoded.amount_sd, amount_sd_val);
21
+ assert_eq!(decoded.compose_from.is_none(), true);
22
+ assert_eq!(decoded.compose_msg.is_none(), true);
23
+ assert_eq!(decoded.is_composed(), false);
24
+ }
25
+
26
+ #[test]
27
+ fn test_encode_and_decode_with_compose() {
28
+ let env = Env::default();
29
+ let sender = Address::generate(&env);
30
+ let send_to_addr = BytesN::from_array(&env, &[2u8; 32]);
31
+ let amount_sd_val = 5000u64;
32
+ let compose_msg_val = Bytes::from_array(&env, &[1u8, 2u8, 3u8, 4u8]);
33
+
34
+ let msg = OFTMessage {
35
+ send_to: send_to_addr.clone(),
36
+ amount_sd: amount_sd_val,
37
+ compose_from: Some(address_to_bytes32(&sender)),
38
+ compose_msg: Some(compose_msg_val),
39
+ };
40
+ let (encoded, has_compose) = msg.encode(&env);
41
+
42
+ assert_eq!(has_compose, true);
43
+
44
+ // Test decode function
45
+ let decoded = OFTMessage::decode(&encoded);
46
+ assert_eq!(decoded.send_to, send_to_addr);
47
+ assert_eq!(decoded.amount_sd, amount_sd_val);
48
+ assert_eq!(decoded.compose_from.is_some(), true);
49
+ assert_eq!(decoded.compose_msg.is_some(), true);
50
+ assert_eq!(decoded.compose_msg.as_ref().unwrap().len(), 4);
51
+ assert_eq!(decoded.is_composed(), true);
52
+
53
+ // Verify compose message structure: sender's bytes32 (32 bytes) + compose_msg (4 bytes)
54
+ let compose_from_len = decoded.compose_from.as_ref().unwrap().to_array().len() as u32;
55
+ let compose_msg_len = decoded.compose_msg.as_ref().unwrap().len();
56
+ assert_eq!(compose_from_len + compose_msg_len, 36);
57
+ }
58
+
59
+ #[test]
60
+ fn test_is_composed_false_when_only_compose_from() {
61
+ let env = Env::default();
62
+ let sender = Address::generate(&env);
63
+ let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
64
+ let amount_sd_val = 100u64;
65
+
66
+ // Manually construct invalid state: only compose_from, no compose_msg
67
+ let msg = OFTMessage {
68
+ send_to: send_to_addr,
69
+ amount_sd: amount_sd_val,
70
+ compose_from: Some(address_to_bytes32(&sender)),
71
+ compose_msg: None,
72
+ };
73
+
74
+ // Should return false - both fields are required for compose
75
+ assert_eq!(msg.is_composed(), false);
76
+ }
77
+
78
+ #[test]
79
+ fn test_is_composed_false_when_only_compose_msg() {
80
+ let env = Env::default();
81
+ let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
82
+ let amount_sd_val = 100u64;
83
+ let compose_msg_val = Bytes::from_array(&env, &[1u8, 2u8, 3u8]);
84
+
85
+ // Manually construct invalid state: only compose_msg, no compose_from
86
+ let msg = OFTMessage {
87
+ send_to: send_to_addr,
88
+ amount_sd: amount_sd_val,
89
+ compose_from: None,
90
+ compose_msg: Some(compose_msg_val),
91
+ };
92
+
93
+ // Should return false - both fields are required for compose
94
+ assert_eq!(msg.is_composed(), false);
95
+ }
96
+
97
+ #[test]
98
+ fn test_is_composed_false_when_compose_msg_empty() {
99
+ let env = Env::default();
100
+ let sender = Address::generate(&env);
101
+ let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
102
+ let amount_sd_val = 100u64;
103
+ let empty_compose_msg = Bytes::new(&env); // Empty bytes, not None
104
+
105
+ // Manually construct state with empty compose_msg
106
+ let msg = OFTMessage {
107
+ send_to: send_to_addr.clone(),
108
+ amount_sd: amount_sd_val,
109
+ compose_from: Some(address_to_bytes32(&sender)),
110
+ compose_msg: Some(empty_compose_msg),
111
+ };
112
+
113
+ // Should return false - compose_msg must have data
114
+ assert_eq!(msg.is_composed(), false);
115
+
116
+ // Verify encoding also treats it as non-composed
117
+ let (_, has_compose) = msg.encode(&env);
118
+ assert_eq!(has_compose, false);
119
+ }
120
+
121
+ #[test]
122
+ #[should_panic]
123
+ fn test_decode_panic_on_empty_data() {
124
+ let env = Env::default();
125
+ let data = Bytes::new(&env);
126
+ OFTMessage::decode(&data);
127
+ }
128
+
129
+ #[test]
130
+ #[should_panic]
131
+ fn test_decode_panic_on_insufficient_data() {
132
+ let env = Env::default();
133
+ let mut data = Bytes::new(&env);
134
+ data.extend_from_array(&[0u8; 20]); // Not enough data for amount_sd
135
+ OFTMessage::decode(&data);
136
+ }
@@ -0,0 +1,13 @@
1
+ use soroban_sdk::Env;
2
+
3
+ use super::test_utils::OFTTestSetup;
4
+
5
+ #[test]
6
+ fn test_oft_version_returns_correct_values() {
7
+ let env = Env::default();
8
+ let setup = OFTTestSetup::new(&env);
9
+
10
+ let (major, minor) = setup.oft.oft_version();
11
+ assert_eq!(major, 1);
12
+ assert_eq!(minor, 1);
13
+ }
@@ -0,0 +1,159 @@
1
+ use crate::errors::OFTError;
2
+ use soroban_sdk::Env;
3
+
4
+ use super::test_utils::{create_send_param, OFTTestSetup};
5
+
6
+ // ==================== Basic Quote OFT Tests ====================
7
+
8
+ #[test]
9
+ fn test_quote_oft_basic() {
10
+ let env = Env::default();
11
+ let setup = OFTTestSetup::new(&env);
12
+
13
+ let conversion_rate = setup.oft.decimal_conversion_rate();
14
+ let amount_ld = 12345670i128;
15
+ let dust_removed = (amount_ld / conversion_rate) * conversion_rate; // No dust with last digit 0
16
+ let send_param = create_send_param(&env, 1, amount_ld, dust_removed);
17
+
18
+ let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
19
+
20
+ // Check limits
21
+ assert_eq!(limit.min_amount_ld, 0);
22
+ assert_eq!(limit.max_amount_ld, i128::MAX);
23
+
24
+ // Check fees (should be empty for basic OFT)
25
+ assert_eq!(fees.len(), 0);
26
+
27
+ // Check receipt
28
+ assert_eq!(receipt.amount_sent_ld, dust_removed);
29
+ assert_eq!(receipt.amount_received_ld, dust_removed);
30
+ }
31
+
32
+ #[test]
33
+ fn test_quote_oft_with_dust_removal() {
34
+ let env = Env::default();
35
+ let setup = OFTTestSetup::new(&env);
36
+
37
+ let conversion_rate = setup.oft.decimal_conversion_rate();
38
+ // Amount with dust that will be removed
39
+ let amount_ld = 12345678i128;
40
+ let dust_removed = (amount_ld / conversion_rate) * conversion_rate;
41
+ let send_param = create_send_param(&env, 1, amount_ld, dust_removed);
42
+
43
+ let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
44
+
45
+ // Check limits
46
+ assert_eq!(limit.min_amount_ld, 0);
47
+ assert_eq!(limit.max_amount_ld, i128::MAX);
48
+
49
+ // Check fees (should be empty for basic OFT)
50
+ assert_eq!(fees.len(), 0);
51
+
52
+ // Check receipt - dust removed
53
+ assert_eq!(receipt.amount_sent_ld, dust_removed);
54
+ assert_eq!(receipt.amount_received_ld, dust_removed);
55
+ }
56
+
57
+ #[test]
58
+ fn test_quote_oft_zero_amount() {
59
+ let env = Env::default();
60
+ let setup = OFTTestSetup::new(&env);
61
+
62
+ let send_param = create_send_param(&env, 1, 0, 0);
63
+
64
+ let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
65
+
66
+ assert_eq!(receipt.amount_sent_ld, 0);
67
+ assert_eq!(receipt.amount_received_ld, 0);
68
+ assert_eq!(limit.min_amount_ld, 0);
69
+ assert_eq!(limit.max_amount_ld, i128::MAX);
70
+ assert_eq!(fees.len(), 0);
71
+ }
72
+
73
+ #[test]
74
+ fn test_quote_oft_dust_only_amount() {
75
+ let env = Env::default();
76
+ let setup = OFTTestSetup::new(&env);
77
+
78
+ let conversion_rate = setup.oft.decimal_conversion_rate();
79
+ // Amount that is entirely dust (less than conversion rate)
80
+ let amount_ld = conversion_rate - 1; // Less than conversion rate
81
+ let send_param = create_send_param(&env, 1, amount_ld, 0);
82
+
83
+ let (_, _, receipt) = setup.oft.quote_oft(&send_param);
84
+
85
+ // All dust should be removed
86
+ assert_eq!(receipt.amount_sent_ld, 0);
87
+ assert_eq!(receipt.amount_received_ld, 0);
88
+ }
89
+
90
+ #[test]
91
+ fn test_quote_oft_different_dst_eids() {
92
+ let env = Env::default();
93
+ let setup = OFTTestSetup::new(&env);
94
+
95
+ let amount_ld = 12345670i128; // No dust
96
+
97
+ // Test with different destination EIDs
98
+ for dst_eid in [1u32, 100, 10000, u32::MAX] {
99
+ let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
100
+ let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
101
+
102
+ // Results should be the same regardless of dst_eid
103
+ assert_eq!(limit.min_amount_ld, 0);
104
+ assert_eq!(limit.max_amount_ld, i128::MAX);
105
+ assert_eq!(fees.len(), 0);
106
+ assert_eq!(receipt.amount_sent_ld, amount_ld);
107
+ assert_eq!(receipt.amount_received_ld, amount_ld);
108
+ }
109
+ }
110
+
111
+ #[test]
112
+ fn test_quote_oft_large_amounts() {
113
+ let env = Env::default();
114
+ let setup = OFTTestSetup::new(&env);
115
+
116
+ // Test with a large amount
117
+ let amount_ld = 1_000_000_000_000_000_000i128;
118
+ let send_param = create_send_param(&env, 1, amount_ld, amount_ld);
119
+
120
+ let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
121
+
122
+ assert_eq!(limit.min_amount_ld, 0);
123
+ assert_eq!(limit.max_amount_ld, i128::MAX);
124
+ assert_eq!(fees.len(), 0);
125
+ assert_eq!(receipt.amount_sent_ld, amount_ld);
126
+ assert_eq!(receipt.amount_received_ld, amount_ld);
127
+ }
128
+
129
+ // ==================== Slippage Tests ====================
130
+
131
+ #[test]
132
+ fn test_quote_oft_slippage_less_than_received() {
133
+ let env = Env::default();
134
+ let setup = OFTTestSetup::new(&env);
135
+
136
+ let conversion_rate = setup.oft.decimal_conversion_rate();
137
+ let amount_ld = 12345678i128;
138
+ let dust_removed = (amount_ld / conversion_rate) * conversion_rate;
139
+ // min_amount_ld is less than what will be received
140
+ let send_param = create_send_param(&env, 1, amount_ld, dust_removed - conversion_rate);
141
+
142
+ let (_, _, receipt) = setup.oft.quote_oft(&send_param);
143
+
144
+ assert_eq!(receipt.amount_sent_ld, dust_removed);
145
+ assert_eq!(receipt.amount_received_ld, dust_removed);
146
+ }
147
+
148
+ #[test]
149
+ fn test_quote_oft_slippage_exceeded() {
150
+ let env = Env::default();
151
+ let setup = OFTTestSetup::new(&env);
152
+
153
+ let amount_ld = 12345678i128;
154
+ // min_amount_ld is higher than what can be received after dust removal
155
+ let send_param = create_send_param(&env, 1, amount_ld, amount_ld);
156
+
157
+ let result = setup.oft.try_quote_oft(&send_param);
158
+ assert_eq!(result.err().unwrap().ok().unwrap(), OFTError::SlippageExceeded.into());
159
+ }
@@ -0,0 +1,195 @@
1
+ use crate::{errors::OFTError, types::SendParam};
2
+ use oapp::errors::OAppError;
3
+ use soroban_sdk::{bytes, testutils::Address as _, Address, Bytes, BytesN, Env};
4
+
5
+ use super::test_utils::{create_send_param, OFTTestSetup};
6
+
7
+ #[test]
8
+ fn test_quote_send_basic() {
9
+ let env = Env::default();
10
+ let setup = OFTTestSetup::new(&env);
11
+
12
+ let sender = Address::generate(&env);
13
+
14
+ // Set peer
15
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
16
+ let dst_eid = 100u32;
17
+ setup.set_peer(dst_eid, &peer);
18
+
19
+ // SAC has 7 decimals, shared is 6, conversion rate = 10
20
+ // Use amount with no dust
21
+ let amount_ld = 12345670i128;
22
+ let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
23
+
24
+ // Quote send without ZRO
25
+ let fee = setup.oft.quote_send(&sender, &send_param, &false);
26
+ assert_eq!(fee.native_fee, setup.native_fee);
27
+ assert_eq!(fee.zro_fee, 0);
28
+ }
29
+
30
+ #[test]
31
+ fn test_quote_send_with_zro() {
32
+ let env = Env::default();
33
+ let setup = OFTTestSetup::new(&env);
34
+
35
+ let sender = Address::generate(&env);
36
+
37
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
38
+ let dst_eid = 100u32;
39
+ setup.set_peer(dst_eid, &peer);
40
+
41
+ let amount_ld = 12345670i128;
42
+ let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
43
+
44
+ // Quote send with ZRO
45
+ let fee = setup.oft.quote_send(&sender, &send_param, &true);
46
+ assert_eq!(fee.native_fee, setup.native_fee);
47
+ assert_eq!(fee.zro_fee, setup.zro_fee);
48
+ }
49
+
50
+ #[test]
51
+ fn test_quote_send_different_amounts() {
52
+ let env = Env::default();
53
+ let setup = OFTTestSetup::new(&env);
54
+
55
+ let sender = Address::generate(&env);
56
+
57
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
58
+ let dst_eid = 100u32;
59
+ setup.set_peer(dst_eid, &peer);
60
+
61
+ // Test with different amounts (all divisible by conversion rate to avoid dust)
62
+ let conversion_rate = setup.oft.decimal_conversion_rate();
63
+ for amount in [100i128, 1000, 10000, 100000, 1000000] {
64
+ let dust_removed = (amount / conversion_rate) * conversion_rate;
65
+ let send_param = create_send_param(&env, dst_eid, amount, dust_removed);
66
+ let fee = setup.oft.quote_send(&sender, &send_param, &false);
67
+ assert_eq!(fee.native_fee, setup.native_fee);
68
+ }
69
+ }
70
+
71
+ #[test]
72
+ fn test_quote_send_multiple_destinations() {
73
+ let env = Env::default();
74
+ let setup = OFTTestSetup::new(&env);
75
+
76
+ let sender = Address::generate(&env);
77
+
78
+ // Set multiple peers
79
+ let dst_eids = [1u32, 100, 200, 300];
80
+ for eid in dst_eids.iter() {
81
+ let peer = BytesN::from_array(&env, &[*eid as u8; 32]);
82
+ setup.set_peer(*eid, &peer);
83
+ }
84
+
85
+ let amount_ld = 12345670i128;
86
+
87
+ // Test quote for each destination
88
+ for dst_eid in dst_eids.iter() {
89
+ let send_param = create_send_param(&env, *dst_eid, amount_ld, amount_ld);
90
+ let fee = setup.oft.quote_send(&sender, &send_param, &false);
91
+ assert_eq!(fee.native_fee, setup.native_fee);
92
+ assert_eq!(fee.zro_fee, 0);
93
+ }
94
+ }
95
+
96
+ #[test]
97
+ fn test_quote_send_no_peer_set() {
98
+ let env = Env::default();
99
+ let setup = OFTTestSetup::new(&env);
100
+
101
+ let sender = Address::generate(&env);
102
+
103
+ // Don't set peer - should fail
104
+ let amount_ld = 12345670i128;
105
+ let send_param = create_send_param(&env, 100, amount_ld, amount_ld);
106
+
107
+ let result = setup.oft.try_quote_send(&sender, &send_param, &false);
108
+ assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::NoPeer.into());
109
+ }
110
+
111
+ #[test]
112
+ fn test_quote_send_with_compose_msg() {
113
+ let env = Env::default();
114
+ let setup = OFTTestSetup::new(&env);
115
+
116
+ let sender = Address::generate(&env);
117
+
118
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
119
+ let dst_eid = 100u32;
120
+ setup.set_peer(dst_eid, &peer);
121
+
122
+ // Create send param with compose message
123
+ let amount_ld = 12345670i128;
124
+ let send_param = SendParam {
125
+ dst_eid,
126
+ to: BytesN::from_array(&env, &[1u8; 32]),
127
+ amount_ld,
128
+ min_amount_ld: amount_ld,
129
+ extra_options: bytes!(&env),
130
+ compose_msg: Bytes::from_array(&env, b"test compose msg"),
131
+ oft_cmd: bytes!(&env),
132
+ };
133
+
134
+ let fee = setup.oft.quote_send(&sender, &send_param, &false);
135
+ assert_eq!(fee.native_fee, setup.native_fee);
136
+ }
137
+
138
+ #[test]
139
+ fn test_quote_send_slippage_exceeded() {
140
+ let env = Env::default();
141
+ let setup = OFTTestSetup::new(&env);
142
+
143
+ let sender = Address::generate(&env);
144
+
145
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
146
+ let dst_eid = 100u32;
147
+ setup.set_peer(dst_eid, &peer);
148
+
149
+ let amount_ld = 12345678i128;
150
+ // min_amount_ld is higher than what can be received after dust removal
151
+ let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
152
+
153
+ let result = setup.oft.try_quote_send(&sender, &send_param, &false);
154
+ assert_eq!(result.err().unwrap().ok().unwrap(), OFTError::SlippageExceeded.into());
155
+ }
156
+
157
+ #[test]
158
+ fn test_quote_send_zero_amount() {
159
+ let env = Env::default();
160
+ let setup = OFTTestSetup::new(&env);
161
+
162
+ let sender = Address::generate(&env);
163
+
164
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
165
+ let dst_eid = 100u32;
166
+ setup.set_peer(dst_eid, &peer);
167
+
168
+ let send_param = create_send_param(&env, dst_eid, 0, 0);
169
+
170
+ let fee = setup.oft.quote_send(&sender, &send_param, &false);
171
+ assert_eq!(fee.native_fee, setup.native_fee);
172
+ assert_eq!(fee.zro_fee, 0);
173
+ }
174
+
175
+ #[test]
176
+ fn test_quote_send_with_dust_removal() {
177
+ let env = Env::default();
178
+ let setup = OFTTestSetup::new(&env);
179
+
180
+ let sender = Address::generate(&env);
181
+
182
+ let peer = BytesN::from_array(&env, &[2u8; 32]);
183
+ let dst_eid = 100u32;
184
+ setup.set_peer(dst_eid, &peer);
185
+
186
+ // Amount with dust that will be removed
187
+ let amount_ld = 12345678i128;
188
+ let conversion_rate = setup.oft.decimal_conversion_rate();
189
+ let dust_removed = (amount_ld / conversion_rate) * conversion_rate;
190
+ let send_param = create_send_param(&env, dst_eid, amount_ld, dust_removed);
191
+
192
+ let fee = setup.oft.quote_send(&sender, &send_param, &false);
193
+ assert_eq!(fee.native_fee, setup.native_fee);
194
+ assert_eq!(fee.zro_fee, 0);
195
+ }
@@ -0,0 +1,37 @@
1
+ use crate::{
2
+ tests::test_utils::{create_recipient_address, generate_g_address},
3
+ utils::{address_to_bytes32, resolve_address},
4
+ };
5
+ use soroban_sdk::Env;
6
+
7
+ #[test]
8
+ fn test_resolve_address_contract_exists() {
9
+ let env = Env::default();
10
+
11
+ // Create a contract address
12
+ let contract_address = create_recipient_address(&env);
13
+
14
+ // Convert to bytes32
15
+ let bytes32 = address_to_bytes32(&contract_address);
16
+
17
+ // Resolve back - should return the same contract address
18
+ let resolved = resolve_address(&env, &bytes32);
19
+
20
+ assert_eq!(resolved, contract_address);
21
+ }
22
+
23
+ #[test]
24
+ fn test_resolve_address_contract_not_exists_fallback_to_g_address() {
25
+ let env = Env::default();
26
+
27
+ // Create a G-address (account address)
28
+ let g_address = generate_g_address(&env);
29
+
30
+ // Convert to bytes32
31
+ let bytes32 = address_to_bytes32(&g_address);
32
+
33
+ // Resolve - should fallback to G-address since contract doesn't exist
34
+ let resolved = resolve_address(&env, &bytes32);
35
+
36
+ assert_eq!(resolved, g_address);
37
+ }