@layerzerolabs/protocol-stellar-v2 0.2.15 → 0.2.19

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 (262) hide show
  1. package/.turbo/turbo-build.log +365 -297
  2. package/.turbo/turbo-lint.log +142 -110
  3. package/.turbo/turbo-test.log +1273 -1222
  4. package/Cargo.lock +20 -5
  5. package/Cargo.toml +4 -1
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +181 -30
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  13. package/contracts/common-macros/src/tests/mod.rs +2 -2
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  16. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +3 -3
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -21
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +2 -2
  21. package/contracts/common-macros/src/ttl_configurable.rs +19 -34
  22. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  23. package/contracts/common-macros/src/upgradeable.rs +5 -5
  24. package/contracts/common-macros/src/utils.rs +9 -0
  25. package/contracts/endpoint-v2/src/constants.rs +4 -4
  26. package/contracts/endpoint-v2/src/endpoint_v2.rs +38 -40
  27. package/contracts/endpoint-v2/src/errors.rs +4 -3
  28. package/contracts/endpoint-v2/src/events.rs +1 -1
  29. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  30. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  31. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  32. package/contracts/endpoint-v2/src/storage.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +3 -3
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +1 -1
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +3 -3
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +3 -3
  39. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +1 -1
  40. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +3 -3
  41. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +1 -1
  42. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +4 -4
  43. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +1 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +3 -6
  45. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +2 -2
  46. package/contracts/macro-integration-tests/tests/runtime/ownable/{only_owner_guard.rs → only_auth_guard.rs} +1 -1
  47. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +1 -1
  48. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +1 -1
  49. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +0 -1
  50. package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.rs → only_auth_missing_env.rs} +3 -3
  51. package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.stderr → only_auth_missing_env.stderr} +4 -4
  52. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +2 -3
  53. package/contracts/macro-integration-tests/tests/ui/ownable/pass/{only_owner_env_param_variants.rs → only_auth_env_param_variants.rs} +9 -9
  54. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +6 -6
  55. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  56. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +3 -3
  57. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +1 -2
  58. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +1 -2
  59. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +9 -9
  60. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +1 -1
  61. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +1 -1
  62. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +2 -2
  63. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  64. package/contracts/message-libs/treasury/src/errors.rs +2 -2
  65. package/contracts/message-libs/treasury/src/events.rs +1 -1
  66. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  67. package/contracts/message-libs/treasury/src/storage.rs +1 -1
  68. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  69. package/contracts/message-libs/treasury/src/treasury.rs +14 -16
  70. package/contracts/message-libs/uln-302/src/receive_uln.rs +13 -2
  71. package/contracts/message-libs/uln-302/src/send_uln.rs +24 -4
  72. package/contracts/message-libs/uln-302/src/uln302.rs +6 -24
  73. package/contracts/oapps/counter/Cargo.toml +14 -1
  74. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  75. package/contracts/oapps/counter/integration_tests/{setup.rs → setup_sml.rs} +48 -80
  76. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  77. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  78. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  79. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  80. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  81. package/contracts/oapps/counter/src/counter.rs +67 -43
  82. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  83. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  84. package/contracts/oapps/oapp/src/errors.rs +5 -1
  85. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +93 -78
  86. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  87. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  88. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  89. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  90. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -8
  91. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -17
  92. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -7
  93. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -15
  94. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  95. package/contracts/oapps/oapp-macros/src/lib.rs +113 -56
  96. package/contracts/oapps/oft/Cargo.toml +10 -7
  97. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
  98. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
  99. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
  100. package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
  101. package/contracts/oapps/oft/integration-tests/setup.rs +29 -110
  102. package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
  103. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -14
  104. package/contracts/oapps/oft/src/extensions/pausable.rs +4 -4
  105. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +5 -5
  106. package/contracts/oapps/oft/src/lib.rs +11 -13
  107. package/contracts/oapps/oft/src/oft.rs +147 -225
  108. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -13
  109. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +31 -14
  110. package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
  111. package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
  112. package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
  113. package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +129 -30
  114. package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
  115. package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
  116. package/contracts/oapps/oft-core/src/errors.rs +13 -0
  117. package/contracts/oapps/oft-core/src/lib.rs +18 -0
  118. package/contracts/oapps/oft-core/src/oft_core.rs +439 -0
  119. package/contracts/oapps/{oft → oft-core}/src/storage.rs +2 -0
  120. package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
  121. package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +2 -2
  122. package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
  123. package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -5
  124. package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
  125. package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +78 -37
  126. package/contracts/oapps/oft-core/src/types.rs +58 -0
  127. package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
  128. package/contracts/upgrader/src/lib.rs +4 -4
  129. package/contracts/utils/src/auth.rs +44 -0
  130. package/contracts/utils/src/errors.rs +31 -5
  131. package/contracts/utils/src/lib.rs +3 -0
  132. package/contracts/utils/src/multisig.rs +211 -0
  133. package/contracts/utils/src/ownable.rs +137 -13
  134. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  135. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  136. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  137. package/contracts/utils/src/tests/mod.rs +1 -0
  138. package/contracts/utils/src/tests/multisig.rs +731 -0
  139. package/contracts/utils/src/tests/option_ext.rs +2 -5
  140. package/contracts/utils/src/tests/ownable.rs +456 -7
  141. package/contracts/utils/src/tests/ttl_configurable.rs +27 -16
  142. package/contracts/utils/src/tests/upgradeable.rs +4 -2
  143. package/contracts/utils/src/ttl_configurable.rs +23 -8
  144. package/contracts/utils/src/ttl_extendable.rs +27 -0
  145. package/contracts/utils/src/upgradeable.rs +2 -0
  146. package/contracts/workers/dvn/Cargo.toml +1 -1
  147. package/contracts/workers/dvn/src/auth.rs +7 -7
  148. package/contracts/workers/dvn/src/dvn.rs +10 -38
  149. package/contracts/workers/dvn/src/errors.rs +0 -7
  150. package/contracts/workers/dvn/src/events.rs +1 -14
  151. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  152. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  153. package/contracts/workers/dvn/src/storage.rs +3 -13
  154. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  155. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  156. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  157. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  158. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  159. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  160. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  161. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -6
  162. package/contracts/workers/executor/src/auth.rs +80 -16
  163. package/contracts/workers/executor/src/executor.rs +5 -31
  164. package/contracts/workers/executor/src/storage.rs +2 -9
  165. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  166. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +3 -6
  167. package/contracts/workers/executor-helper/Cargo.toml +1 -1
  168. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  169. package/contracts/workers/price-feed/Cargo.toml +1 -1
  170. package/contracts/workers/price-feed/src/price_feed.rs +7 -10
  171. package/contracts/workers/worker/src/errors.rs +4 -0
  172. package/contracts/workers/worker/src/tests/worker.rs +7 -6
  173. package/contracts/workers/worker/src/worker.rs +20 -16
  174. package/package.json +7 -5
  175. package/sdk/.turbo/turbo-build.log +1 -0
  176. package/sdk/.turbo/turbo-test.log +1019 -0
  177. package/sdk/dist/generated/bml.d.ts +95 -8
  178. package/sdk/dist/generated/bml.js +95 -36
  179. package/sdk/dist/generated/counter.d.ts +289 -44
  180. package/sdk/dist/generated/counter.js +119 -49
  181. package/sdk/dist/generated/dvn.d.ts +312 -229
  182. package/sdk/dist/generated/dvn.js +144 -83
  183. package/sdk/dist/generated/dvn_fee_lib.d.ts +258 -63
  184. package/sdk/dist/generated/dvn_fee_lib.js +95 -26
  185. package/sdk/dist/generated/endpoint.d.ts +219 -24
  186. package/sdk/dist/generated/endpoint.js +108 -41
  187. package/sdk/dist/generated/executor.d.ts +239 -87
  188. package/sdk/dist/generated/executor.js +135 -63
  189. package/sdk/dist/generated/executor_fee_lib.d.ts +278 -74
  190. package/sdk/dist/generated/executor_fee_lib.js +135 -59
  191. package/sdk/dist/generated/executor_helper.d.ts +163 -21
  192. package/sdk/dist/generated/executor_helper.js +124 -52
  193. package/sdk/dist/generated/oft.d.ts +1842 -0
  194. package/sdk/dist/generated/oft.js +345 -0
  195. package/sdk/dist/generated/price_feed.d.ts +258 -63
  196. package/sdk/dist/generated/price_feed.js +95 -26
  197. package/sdk/dist/generated/sml.d.ts +235 -34
  198. package/sdk/dist/generated/sml.js +126 -53
  199. package/sdk/dist/generated/treasury.d.ts +1016 -0
  200. package/sdk/dist/generated/treasury.js +248 -0
  201. package/sdk/dist/generated/uln302.d.ts +235 -34
  202. package/sdk/dist/generated/uln302.js +126 -53
  203. package/sdk/dist/generated/upgrader.d.ts +17 -2
  204. package/sdk/dist/generated/upgrader.js +19 -1
  205. package/sdk/dist/index.d.ts +2 -1
  206. package/sdk/dist/index.js +2 -1
  207. package/sdk/package.json +6 -3
  208. package/sdk/src/index.ts +2 -1
  209. package/sdk/test/counter-sml.test.ts +376 -0
  210. package/sdk/test/counter-uln.test.ts +493 -0
  211. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +196 -321
  212. package/sdk/test/suites/constants.ts +22 -2
  213. package/sdk/test/suites/globalSetup.ts +450 -0
  214. package/sdk/test/suites/localnet.ts +23 -6
  215. package/sdk/test/upgrader.test.ts +7 -16
  216. package/sdk/test/utils.ts +558 -85
  217. package/sdk/turbo.json +8 -0
  218. package/sdk/vitest.config.ts +21 -0
  219. package/tools/ts-bindings-gen/Cargo.toml +2 -0
  220. package/tools/ts-bindings-gen/src/main.rs +52 -4
  221. package/contracts/common-macros/src/contract_impl.rs +0 -52
  222. package/contracts/common-macros/src/ownable.rs +0 -41
  223. package/contracts/common-macros/src/tests/contract_impl.rs +0 -386
  224. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -12
  225. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +0 -50
  226. package/contracts/oapps/oapp-macros/src/oapp_core.rs +0 -41
  227. package/contracts/oapps/oapp-macros/src/oapp_full.rs +0 -21
  228. package/contracts/oapps/oapp-macros/src/oapp_options_type3.rs +0 -31
  229. package/contracts/oapps/oapp-macros/src/oapp_receiver.rs +0 -48
  230. package/contracts/oapps/oapp-macros/src/oapp_sender.rs +0 -21
  231. package/contracts/oapps/oapp-macros/src/util.rs +0 -107
  232. package/contracts/oapps/oft/src/constants.rs +0 -5
  233. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -152
  234. package/contracts/oapps/oft/src/errors.rs +0 -8
  235. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
  236. package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
  237. package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
  238. package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -903
  239. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -749
  240. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -432
  241. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1078
  242. package/contracts/oapps/oft/src/types.rs +0 -38
  243. package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
  244. package/contracts/oapps/oft-std/src/lib.rs +0 -16
  245. package/contracts/oapps/oft-std/src/oft.rs +0 -156
  246. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  247. package/contracts/workers/dvn/src/multisig.rs +0 -157
  248. package/sdk/dist/generated/oft_std.d.ts +0 -1544
  249. package/sdk/dist/generated/oft_std.js +0 -271
  250. package/sdk/test/index.test.ts +0 -375
  251. /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
  252. /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
  253. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
  254. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
  255. /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
  256. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
  257. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
  258. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
  259. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
  260. /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
  261. /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
  262. /package/sdk/test/suites/{testUpgradeable.ts → dummyContractClient.ts} +0 -0
@@ -1,37 +1,139 @@
1
- //! Integration test setup for OFT-STD with real EndpointV2 and SimpleMessageLib.
1
+ //! Integration test setup for OFT.
2
2
  //!
3
- //! This file contains test setup utilities for OFT-STD with all extensions enabled.
3
+ //! This file contains TestOFT contract and test setup utilities.
4
4
 
5
- extern crate self as oft_std;
6
5
  extern crate std;
7
6
 
8
- use crate::integration_tests::utils::{address_to_peer_bytes32, peer_bytes32_to_address};
9
- use crate::oft::{OFTMode, OFTStd, OFTStdClient};
10
- use endpoint_v2::{EndpointV2, EndpointV2Client};
7
+ use crate::{
8
+ self as oft_core,
9
+ integration_tests::utils::{address_to_peer_bytes32, peer_bytes32_to_address},
10
+ oft_core::{initialize_oft, lz_receive, OFTClient, OFTCore, OFTInternal},
11
+ storage::OFTStorage,
12
+ types::OFTReceipt,
13
+ };
14
+ use common_macros::contract_impl;
15
+ use endpoint_v2::{EndpointV2, EndpointV2Client, ILayerZeroComposer, Origin};
16
+ use oapp::oapp_receiver::LzReceiveInternal;
11
17
  use simple_message_lib::{SimpleMessageLib, SimpleMessageLibClient};
12
18
  use soroban_sdk::{
13
- contract, contractimpl, log,
19
+ contract, contractimpl, contracttype, log, symbol_short,
14
20
  testutils::{Address as _, MockAuth, MockAuthInvoke},
15
- token::TokenClient,
16
- Address, BytesN, Env, IntoVal,
21
+ token::{StellarAssetClient, TokenClient},
22
+ Address, Bytes, BytesN, Env, IntoVal,
17
23
  };
18
24
 
19
25
  // ============================================================================
20
- // Dummy Recipient - used to create valid contract addresses for recipients
26
+ // Test OFT Contract
27
+ // ============================================================================
28
+
29
+ #[oapp_macros::oapp]
30
+ pub struct TestOFT;
31
+
32
+ impl LzReceiveInternal for TestOFT {
33
+ fn __lz_receive(
34
+ env: &Env,
35
+ origin: &Origin,
36
+ guid: &BytesN<32>,
37
+ message: &Bytes,
38
+ extra_data: &Bytes,
39
+ executor: &Address,
40
+ value: i128,
41
+ ) {
42
+ lz_receive::<Self>(env, executor, origin, guid, message, extra_data, value)
43
+ }
44
+ }
45
+
46
+ #[contract_impl]
47
+ impl TestOFT {
48
+ pub fn __constructor(
49
+ env: &Env,
50
+ token: &Address,
51
+ owner: &Address,
52
+ endpoint: &Address,
53
+ delegate: &Option<Address>,
54
+ shared_decimals: u32,
55
+ ) {
56
+ initialize_oft::<Self>(env, owner, token, endpoint, delegate, shared_decimals)
57
+ }
58
+ }
59
+
60
+ #[contractimpl(contracttrait)]
61
+ impl OFTCore for TestOFT {}
62
+
63
+ impl OFTInternal for TestOFT {
64
+ fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
65
+ // Get the receipt (handles decimal conversion, fees, etc.)
66
+ let receipt = Self::__debit_view(env, amount_ld, min_amount_ld, dst_eid);
67
+ // Actually burn tokens from sender
68
+ StellarAssetClient::new(env, &OFTStorage::token(env).unwrap()).burn(sender, &receipt.amount_sent_ld);
69
+ receipt
70
+ }
71
+
72
+ fn __credit(env: &Env, to: &Address, amount_ld: i128, _src_eid: u32) -> i128 {
73
+ // Actually mint tokens to recipient
74
+ StellarAssetClient::new(env, &OFTStorage::token(env).unwrap()).mint(to, &amount_ld);
75
+ amount_ld
76
+ }
77
+ }
78
+
79
+ // ============================================================================
80
+ // Dummy Composer for testing compose messages
21
81
  // ============================================================================
22
82
 
83
+ #[contracttype]
84
+ pub struct ComposeMessage {
85
+ pub executor: Address,
86
+ pub from: Address,
87
+ pub guid: BytesN<32>,
88
+ pub index: u32,
89
+ pub message: Bytes,
90
+ pub extra_data: Bytes,
91
+ pub value: i128,
92
+ }
93
+
23
94
  #[contract]
24
- pub struct DummyRecipient;
95
+ pub struct DummyComposer;
25
96
 
26
- #[contractimpl]
27
- impl DummyRecipient {
28
- pub fn __constructor(_env: &Env) {}
97
+ #[contract_impl]
98
+ impl DummyComposer {
99
+ pub fn __constructor(env: &Env, endpoint: &Address) {
100
+ env.storage().instance().set(&symbol_short!("endpoint"), endpoint);
101
+ }
102
+
103
+ pub fn compose_message(env: &Env) -> Option<ComposeMessage> {
104
+ env.storage().instance().get(&symbol_short!("msg"))
105
+ }
29
106
  }
30
107
 
31
- /// Creates a valid recipient address by deploying a dummy contract.
32
- /// Use this in tests when the address needs to pass the `.exists()` check.
33
- pub fn create_recipient_address(env: &Env) -> Address {
34
- env.register(DummyRecipient, ())
108
+ #[contract_impl]
109
+ impl ILayerZeroComposer for DummyComposer {
110
+ fn lz_compose(
111
+ env: &Env,
112
+ executor: &Address,
113
+ from: &Address,
114
+ guid: &BytesN<32>,
115
+ index: u32,
116
+ message: &Bytes,
117
+ extra_data: &Bytes,
118
+ value: i128,
119
+ ) {
120
+ let endpoint_address: Address = env.storage().instance().get(&symbol_short!("endpoint")).unwrap();
121
+ let endpoint = endpoint_v2::MessagingComposerClient::new(env, &endpoint_address);
122
+ endpoint.clear_compose(&env.current_contract_address(), from, guid, &index, message);
123
+
124
+ env.storage().instance().set(
125
+ &symbol_short!("msg"),
126
+ &ComposeMessage {
127
+ executor: executor.clone(),
128
+ from: from.clone(),
129
+ guid: guid.clone(),
130
+ index,
131
+ message: message.clone(),
132
+ extra_data: extra_data.clone(),
133
+ value,
134
+ },
135
+ );
136
+ }
35
137
  }
36
138
 
37
139
  // ============================================================================
@@ -42,16 +144,16 @@ pub struct ChainSetup<'a> {
42
144
  pub eid: u32,
43
145
  pub owner: Address,
44
146
  pub native_token: Address,
45
- pub zro_token: Address,
46
147
  pub oft_token: Address,
47
148
  pub endpoint: EndpointV2Client<'a>,
48
149
  pub sml: SimpleMessageLibClient<'a>,
49
- pub oft: OFTStdClient<'a>,
50
- pub fee_collector: Address,
150
+ pub oft: OFTClient<'a>,
151
+ pub composer: DummyComposerClient<'a>,
51
152
  }
52
153
 
53
154
  pub struct TestSetup<'a> {
54
155
  pub env: Env,
156
+
55
157
  pub chain_a: ChainSetup<'a>,
56
158
  pub chain_b: ChainSetup<'a>,
57
159
  }
@@ -59,13 +161,9 @@ pub struct TestSetup<'a> {
59
161
  fn setup_chain<'a>(env: &Env) -> ChainSetup<'a> {
60
162
  let owner = Address::generate(env);
61
163
 
62
- // Create native token FIRST - this must match the endpoint's NATIVE_TOKEN constant
63
164
  let sac = env.register_stellar_asset_contract_v2(owner.clone());
64
165
  let native_token = sac.address();
65
166
 
66
- // Generate fee_collector AFTER native_token to not affect the address derivation
67
- let fee_collector = Address::generate(env);
68
-
69
167
  // Create ZRO token
70
168
  let zro_sac = env.register_stellar_asset_contract_v2(owner.clone());
71
169
  let zro_token = zro_sac.address();
@@ -79,12 +177,13 @@ fn setup_chain<'a>(env: &Env) -> ChainSetup<'a> {
79
177
  let sml_address = env.register(SimpleMessageLib, (&owner, &endpoint_address, &fee_recipient));
80
178
  let delegate: Option<Address> = Some(owner.clone());
81
179
  let shared_decimals: u32 = 6; // Default shared decimals
82
- let mode = OFTMode::MintBurn;
83
- let oft_address = env.register(OFTStd, (&oft_token, &owner, &endpoint_address, &delegate, &shared_decimals, &mode));
180
+ let oft_address = env.register(TestOFT, (&oft_token, &owner, &endpoint_address, &delegate, &shared_decimals));
181
+ let composer_address = env.register(DummyComposer, (&endpoint_address,));
84
182
 
85
183
  let endpoint = EndpointV2Client::new(env, &endpoint_address);
86
184
  let sml = SimpleMessageLibClient::new(env, &sml_address);
87
- let oft = OFTStdClient::new(env, &oft_address);
185
+ let oft = OFTClient::new(env, &oft_address);
186
+ let composer = DummyComposerClient::new(env, &composer_address);
88
187
 
89
188
  // Set ZRO token in endpoint
90
189
  env.mock_auths(&[MockAuth {
@@ -101,7 +200,7 @@ fn setup_chain<'a>(env: &Env) -> ChainSetup<'a> {
101
200
  register_library(env, &owner, &endpoint, &sml.address);
102
201
 
103
202
  let eid = endpoint.eid();
104
- ChainSetup { eid, owner, native_token, zro_token, oft_token, endpoint, sml, oft, fee_collector }
203
+ ChainSetup { eid, owner, native_token, oft_token, endpoint, sml, oft, composer }
105
204
  }
106
205
 
107
206
  pub fn setup<'a>() -> TestSetup<'a> {
@@ -158,7 +257,7 @@ pub fn wire_oft(env: &Env, chains: &[&ChainSetup<'_>]) {
158
257
  }
159
258
  }
160
259
 
161
- pub fn set_peer(env: &Env, owner: &Address, oft: &OFTStdClient<'_>, dst_eid: u32, peer: &BytesN<32>) {
260
+ pub fn set_peer(env: &Env, owner: &Address, oft: &OFTClient<'_>, dst_eid: u32, peer: &BytesN<32>) {
162
261
  env.mock_auths(&[MockAuth {
163
262
  address: owner,
164
263
  invoke: &MockAuthInvoke {
@@ -13,7 +13,7 @@ use crate::{
13
13
  },
14
14
  tests::test_utils::create_recipient_address,
15
15
  types::SendParam,
16
- utils::address_to_bytes32,
16
+ utils::address_payload,
17
17
  };
18
18
 
19
19
  #[test]
@@ -43,7 +43,7 @@ fn test_send_vanilla() {
43
43
 
44
44
  let send_param = SendParam {
45
45
  dst_eid: chain_b.eid,
46
- to: address_to_bytes32(&receiver),
46
+ to: address_payload(&receiver),
47
47
  amount_ld: 10e7 as i128,
48
48
  min_amount_ld: 10e7 as i128,
49
49
  extra_options: bytes!(&env),
@@ -99,7 +99,7 @@ fn test_send_composed() {
99
99
 
100
100
  let send_param = SendParam {
101
101
  dst_eid: chain_b.eid,
102
- to: address_to_bytes32(&receiver),
102
+ to: address_payload(&receiver),
103
103
  amount_ld: 10e7 as i128,
104
104
  min_amount_ld: 10e7 as i128,
105
105
  extra_options: bytes!(&env),
@@ -0,0 +1,201 @@
1
+ use core::ops::Mul;
2
+
3
+ use crate::{
4
+ codec::{oft_compose_msg_codec::OFTComposeMsg, oft_msg_codec},
5
+ integration_tests::setup::{decode_packet, ChainSetup},
6
+ types::{OFTFeeDetail, OFTLimit, OFTReceipt, SendParam},
7
+ };
8
+ use endpoint_v2::{MessagingFee, Origin, OutboundPacket};
9
+ use message_lib_common::packet_codec_v1;
10
+ use soroban_sdk::{
11
+ address_payload::AddressPayload,
12
+ testutils::{Events, MockAuth, MockAuthInvoke},
13
+ token::StellarAssetClient,
14
+ xdr::ToXdr,
15
+ Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val, Vec,
16
+ };
17
+
18
+ pub fn address_to_peer_bytes32(address: &Address) -> BytesN<32> {
19
+ match address.to_payload().unwrap() {
20
+ AddressPayload::ContractIdHash(payload) => payload,
21
+ AddressPayload::AccountIdPublicKeyEd25519(_) => panic!("peer must be a contract"),
22
+ }
23
+ }
24
+
25
+ pub fn peer_bytes32_to_address(env: &Env, bytes32: &BytesN<32>) -> Address {
26
+ AddressPayload::ContractIdHash(bytes32.clone()).to_address(env)
27
+ }
28
+
29
+ pub fn quote_oft(chain: &ChainSetup<'_>, send_param: &SendParam) -> (OFTLimit, Vec<OFTFeeDetail>, OFTReceipt) {
30
+ chain.oft.quote_oft(send_param)
31
+ }
32
+
33
+ pub fn quote_send(
34
+ env: &Env,
35
+ chain: &ChainSetup<'_>,
36
+ sender: &Address,
37
+ send_param: &SendParam,
38
+ pay_in_zro: bool,
39
+ ) -> MessagingFee {
40
+ env.mock_auths(&[MockAuth {
41
+ address: sender,
42
+ invoke: &MockAuthInvoke {
43
+ contract: &chain.oft.address,
44
+ fn_name: "quote_send",
45
+ args: (sender, send_param, &pay_in_zro).into_val(env),
46
+ sub_invokes: &[],
47
+ },
48
+ }]);
49
+ chain.oft.quote_send(sender, send_param, &pay_in_zro)
50
+ }
51
+
52
+ pub fn send(
53
+ env: &Env,
54
+ chain: &ChainSetup<'_>,
55
+ sender: &Address,
56
+ send_param: &SendParam,
57
+ fee: &MessagingFee,
58
+ refund_address: &Address,
59
+ oft_receipt: &OFTReceipt,
60
+ ) {
61
+ env.mock_auths(&[MockAuth {
62
+ address: sender,
63
+ invoke: &MockAuthInvoke {
64
+ contract: &chain.oft.address,
65
+ fn_name: "send",
66
+ args: (sender, send_param, fee, refund_address).into_val(env),
67
+ sub_invokes: &[
68
+ MockAuthInvoke {
69
+ contract: &chain.native_token,
70
+ fn_name: "transfer",
71
+ args: (sender, &chain.endpoint.address, &fee.native_fee).into_val(env),
72
+ sub_invokes: &[],
73
+ },
74
+ MockAuthInvoke {
75
+ contract: &chain.oft_token,
76
+ fn_name: "burn",
77
+ args: (sender, &oft_receipt.amount_received_ld).into_val(env),
78
+ sub_invokes: &[],
79
+ },
80
+ ],
81
+ },
82
+ }]);
83
+ chain.oft.send(sender, send_param, fee, refund_address);
84
+ }
85
+
86
+ pub fn validate_packet(env: &Env, chain: &ChainSetup<'_>, packet_event: &(Bytes, Bytes, Address)) {
87
+ let packet = decode_packet(env, &packet_event.0);
88
+ let encoded_header = packet_codec_v1::encode_packet_header(env, &packet);
89
+ let payload_hash = packet_codec_v1::payload_hash(env, &packet);
90
+
91
+ env.mock_auths(&[MockAuth {
92
+ address: &chain.owner,
93
+ invoke: &MockAuthInvoke {
94
+ contract: &chain.sml.address,
95
+ fn_name: "validate_packet",
96
+ args: (&encoded_header, &payload_hash).into_val(env),
97
+ sub_invokes: &[],
98
+ },
99
+ }]);
100
+ chain.sml.validate_packet(&encoded_header, &payload_hash);
101
+ }
102
+
103
+ pub fn lz_receive(
104
+ env: &Env,
105
+ chain: &ChainSetup<'_>,
106
+ executor: &Address,
107
+ packet: &OutboundPacket,
108
+ recipient: &Address,
109
+ value: i128,
110
+ ) {
111
+ let origin =
112
+ Origin { src_eid: packet.src_eid, sender: address_to_peer_bytes32(&packet.sender), nonce: packet.nonce };
113
+ let extra_options = recipient.to_xdr(env);
114
+
115
+ env.mock_auths(&[MockAuth {
116
+ address: executor,
117
+ invoke: &MockAuthInvoke {
118
+ contract: &chain.oft.address,
119
+ fn_name: "lz_receive",
120
+ args: (executor, &origin, &packet.guid, &packet.message, &extra_options, &value).into_val(env),
121
+ sub_invokes: &[],
122
+ },
123
+ }]);
124
+ endpoint_v2::LayerZeroReceiverClient::new(env, &chain.oft.address).lz_receive(
125
+ executor,
126
+ &origin,
127
+ &packet.guid,
128
+ &packet.message,
129
+ &extra_options,
130
+ &value,
131
+ );
132
+ }
133
+
134
+ pub fn lz_compose(
135
+ env: &Env,
136
+ chain: &ChainSetup<'_>,
137
+ executor: &Address,
138
+ packet: &OutboundPacket,
139
+ index: u32,
140
+ extra_data: &Bytes,
141
+ value: i128,
142
+ ) {
143
+ let oft_msg = oft_msg_codec::OFTMessage::decode(&packet.message);
144
+ let oft_compose_msg = OFTComposeMsg {
145
+ nonce: packet.nonce,
146
+ src_eid: packet.src_eid,
147
+ amount_ld: (oft_msg.amount_sd as i128).mul(chain.oft.decimal_conversion_rate()),
148
+ compose_from: oft_msg.compose_from.unwrap(),
149
+ compose_msg: oft_msg.compose_msg.unwrap(),
150
+ }
151
+ .encode(&env);
152
+
153
+ chain.composer.lz_compose(executor, &chain.oft.address, &packet.guid, &index, &oft_compose_msg, extra_data, &value);
154
+ }
155
+
156
+ // returns (encoded_payload, options, send_library)
157
+ pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, Bytes, Address)> {
158
+ let mut packet = None;
159
+ for (emitter, topics, data) in env.events().all() {
160
+ let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
161
+ if emitter == *endpoint && topics.contains(packet_sent_symbol) {
162
+ let map: Map<Symbol, Val> = data.into_val(env);
163
+
164
+ let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
165
+ let options: Bytes = map.get(Symbol::new(env, "options")).unwrap().into_val(env);
166
+ let send_library: Address = map.get(Symbol::new(env, "send_library")).unwrap().into_val(env);
167
+
168
+ packet = Some((encoded_payload, options, send_library));
169
+ }
170
+ }
171
+
172
+ packet
173
+ }
174
+
175
+ pub fn mint_to(env: &Env, owner: &Address, token: &Address, to: &Address, amount: i128) {
176
+ env.mock_auths(&[MockAuth {
177
+ address: owner,
178
+ invoke: &MockAuthInvoke {
179
+ contract: token,
180
+ fn_name: "mint",
181
+ args: (to, amount).into_val(env),
182
+ sub_invokes: &[],
183
+ },
184
+ }]);
185
+
186
+ let sac = StellarAssetClient::new(env, token);
187
+ sac.mint(to, &amount);
188
+ }
189
+
190
+ pub fn transfer_sac_admin(env: &Env, owner: &Address, token: &Address, new_admin: &Address) {
191
+ env.mock_auths(&[MockAuth {
192
+ address: owner,
193
+ invoke: &MockAuthInvoke {
194
+ contract: token,
195
+ fn_name: "set_admin",
196
+ args: (new_admin,).into_val(env),
197
+ sub_invokes: &[],
198
+ },
199
+ }]);
200
+ StellarAssetClient::new(env, token).set_admin(new_admin);
201
+ }
@@ -0,0 +1,13 @@
1
+ use common_macros::contract_error;
2
+
3
+ // OFT library error codes: 3000-3099
4
+ // See ERROR_SPEC.md for allocation rules
5
+
6
+ /// OFTError: 3000-3099
7
+ #[contract_error]
8
+ pub enum OFTError {
9
+ InvalidLocalDecimals = 3000,
10
+ NotInitialized,
11
+ Overflow,
12
+ SlippageExceeded,
13
+ }
@@ -0,0 +1,18 @@
1
+ #![no_std]
2
+
3
+ pub mod codec;
4
+ pub mod errors;
5
+ pub mod events;
6
+ pub mod oft_core;
7
+ pub mod storage;
8
+ pub mod types;
9
+ pub mod utils;
10
+
11
+ pub use oft_core::*;
12
+
13
+ #[cfg(test)]
14
+ #[path = "../integration-tests/mod.rs"]
15
+ pub mod integration_tests;
16
+
17
+ #[cfg(test)]
18
+ pub mod tests;