@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.18

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 (435) hide show
  1. package/.turbo/turbo-build.log +484 -337
  2. package/.turbo/turbo-lint.log +126 -56
  3. package/.turbo/turbo-test.log +1403 -984
  4. package/Cargo.lock +142 -3
  5. package/Cargo.toml +5 -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 +219 -29
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/storage.rs +1 -1
  12. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  13. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  14. package/contracts/common-macros/src/tests/mod.rs +3 -2
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  17. 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
  18. 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} +26 -10
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -41
  22. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  23. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  24. package/contracts/common-macros/src/ttl_configurable.rs +21 -66
  25. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  26. package/contracts/common-macros/src/upgradeable.rs +76 -0
  27. package/contracts/common-macros/src/utils.rs +9 -0
  28. package/contracts/endpoint-v2/src/constants.rs +4 -4
  29. package/contracts/endpoint-v2/src/endpoint_v2.rs +58 -36
  30. package/contracts/endpoint-v2/src/errors.rs +4 -3
  31. package/contracts/endpoint-v2/src/events.rs +1 -1
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  35. package/contracts/endpoint-v2/src/storage.rs +1 -1
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +62 -10
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  56. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  69. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  70. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  71. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  72. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  73. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +4 -6
  74. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  75. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +16 -2
  76. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  77. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  78. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  79. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  80. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  81. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  82. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  83. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  84. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  85. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  86. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  87. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  88. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  89. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  90. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  91. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  92. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  93. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  94. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  95. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  96. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  97. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  98. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  99. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  100. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  101. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  102. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  103. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  104. package/contracts/layerzero-views/Cargo.toml +35 -0
  105. package/contracts/layerzero-views/src/errors.rs +10 -0
  106. package/contracts/layerzero-views/src/layerzero_view.rs +226 -0
  107. package/contracts/layerzero-views/src/lib.rs +38 -0
  108. package/contracts/layerzero-views/src/storage.rs +18 -0
  109. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  110. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  111. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  112. package/contracts/layerzero-views/src/types.rs +50 -0
  113. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  114. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  115. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  116. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  117. package/contracts/macro-integration-tests/tests/runtime/ownable/only_auth_guard.rs +97 -0
  118. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  119. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  120. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  121. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  122. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  123. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  124. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  125. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  126. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +2 -0
  127. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  128. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  129. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  130. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  131. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  133. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  135. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  137. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  138. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +22 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +16 -0
  141. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +21 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +46 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  158. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  159. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  160. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  161. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  163. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  164. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  165. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  166. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  167. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  168. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  169. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  170. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  171. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  172. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  173. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  174. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  175. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  176. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  177. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  178. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  179. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  180. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  181. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  182. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  183. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  184. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +49 -0
  185. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +73 -0
  186. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  187. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  188. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  189. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  190. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  191. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  192. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  193. package/contracts/message-libs/treasury/src/errors.rs +2 -3
  194. package/contracts/message-libs/treasury/src/events.rs +1 -1
  195. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  196. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  197. package/contracts/message-libs/treasury/src/storage.rs +3 -1
  198. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  199. package/contracts/message-libs/treasury/src/treasury.rs +23 -26
  200. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  201. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  202. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  203. package/contracts/message-libs/uln-302/src/receive_uln.rs +37 -56
  204. package/contracts/message-libs/uln-302/src/send_uln.rs +112 -138
  205. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  206. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  207. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  208. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  209. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  210. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  211. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  212. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  213. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  214. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  215. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  216. package/contracts/message-libs/uln-302/src/uln302.rs +10 -25
  217. package/contracts/oapps/counter/Cargo.toml +14 -1
  218. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  219. package/contracts/oapps/counter/integration_tests/setup_sml.rs +169 -0
  220. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  221. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  222. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  223. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  224. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  225. package/contracts/oapps/counter/src/counter.rs +67 -44
  226. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  227. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  228. package/contracts/oapps/oapp/src/errors.rs +5 -1
  229. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +318 -221
  230. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  231. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  232. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  233. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  234. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -9
  235. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -18
  236. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -8
  237. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -16
  238. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  239. package/contracts/oapps/oapp-macros/src/lib.rs +211 -0
  240. package/contracts/oapps/oft/integration-tests/setup.rs +34 -9
  241. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  242. package/contracts/oapps/oft/src/errors.rs +6 -1
  243. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -13
  244. package/contracts/oapps/oft/src/extensions/pausable.rs +5 -5
  245. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +23 -23
  246. package/contracts/oapps/oft/src/lib.rs +4 -2
  247. package/contracts/oapps/oft/src/oft.rs +31 -71
  248. package/contracts/oapps/oft/src/oft_impl.rs +201 -0
  249. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +2 -4
  250. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
  251. package/contracts/oapps/oft/src/storage.rs +2 -0
  252. package/contracts/oapps/oft/src/tests/extensions/setup.rs +60 -31
  253. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
  254. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
  255. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +6 -4
  256. package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
  257. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
  258. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  259. package/contracts/oapps/oft/src/tests/test_utils.rs +122 -81
  260. package/contracts/oapps/oft/src/types.rs +20 -0
  261. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  262. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  263. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  264. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  265. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  266. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  267. package/contracts/oapps/{counter/integration_tests → oft-std/integration-tests}/setup.rs +76 -30
  268. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  269. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  270. package/contracts/oapps/oft-std/src/oft.rs +141 -26
  271. package/contracts/upgrader/Cargo.toml +19 -0
  272. package/contracts/upgrader/src/lib.rs +96 -0
  273. package/contracts/upgrader/src/tests/mod.rs +1 -0
  274. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  275. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  276. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  277. package/contracts/utils/src/auth.rs +44 -0
  278. package/contracts/utils/src/errors.rs +32 -5
  279. package/contracts/utils/src/lib.rs +5 -1
  280. package/contracts/utils/src/multisig.rs +211 -0
  281. package/contracts/utils/src/ownable.rs +50 -60
  282. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  283. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  284. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  285. package/contracts/utils/src/tests/mod.rs +4 -1
  286. package/contracts/utils/src/tests/multisig.rs +731 -0
  287. package/contracts/utils/src/tests/option_ext.rs +18 -0
  288. package/contracts/utils/src/tests/ownable.rs +22 -70
  289. package/contracts/utils/src/tests/ttl_configurable.rs +607 -0
  290. package/contracts/utils/src/tests/upgradeable.rs +290 -0
  291. package/contracts/utils/src/ttl_configurable.rs +153 -0
  292. package/contracts/utils/src/ttl_extendable.rs +27 -0
  293. package/contracts/utils/src/upgradeable.rs +56 -0
  294. package/contracts/workers/dvn/Cargo.toml +2 -2
  295. package/contracts/workers/dvn/src/auth.rs +24 -35
  296. package/contracts/workers/dvn/src/dvn.rs +23 -14
  297. package/contracts/workers/dvn/src/errors.rs +1 -7
  298. package/contracts/workers/dvn/src/events.rs +1 -14
  299. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  300. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  301. package/contracts/workers/dvn/src/storage.rs +3 -13
  302. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  303. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  304. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  305. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  306. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  307. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  308. package/contracts/workers/dvn-fee-lib/Cargo.toml +0 -1
  309. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +45 -16
  310. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  311. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  312. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  313. package/contracts/workers/executor/src/auth.rs +80 -16
  314. package/contracts/workers/executor/src/executor.rs +17 -29
  315. package/contracts/workers/executor/src/storage.rs +2 -9
  316. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  317. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  318. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +153 -121
  319. package/contracts/workers/executor-helper/Cargo.toml +1 -6
  320. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  321. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  322. package/contracts/workers/price-feed/Cargo.toml +1 -2
  323. package/contracts/workers/price-feed/src/errors.rs +3 -2
  324. package/contracts/workers/price-feed/src/lib.rs +5 -6
  325. package/contracts/workers/price-feed/src/price_feed.rs +42 -23
  326. package/contracts/workers/worker/Cargo.toml +4 -0
  327. package/contracts/workers/worker/src/errors.rs +4 -0
  328. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  329. package/contracts/workers/worker/src/lib.rs +2 -2
  330. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  331. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  332. package/contracts/workers/worker/src/tests/worker.rs +502 -0
  333. package/contracts/workers/worker/src/worker.rs +28 -30
  334. package/package.json +8 -5
  335. package/sdk/.turbo/turbo-build.log +1 -0
  336. package/sdk/.turbo/turbo-test.log +1009 -0
  337. package/sdk/dist/generated/bml.d.ts +104 -37
  338. package/sdk/dist/generated/bml.js +83 -42
  339. package/sdk/dist/generated/counter.d.ts +334 -175
  340. package/sdk/dist/generated/counter.js +109 -63
  341. package/sdk/dist/generated/dvn.d.ts +1985 -0
  342. package/sdk/dist/generated/dvn.js +326 -0
  343. package/sdk/dist/generated/dvn_fee_lib.d.ts +690 -0
  344. package/sdk/dist/generated/dvn_fee_lib.js +163 -0
  345. package/sdk/dist/generated/endpoint.d.ts +155 -46
  346. package/sdk/dist/generated/endpoint.js +93 -50
  347. package/sdk/dist/generated/executor.d.ts +1841 -0
  348. package/sdk/dist/generated/executor.js +312 -0
  349. package/sdk/dist/generated/executor_fee_lib.d.ts +1083 -0
  350. package/sdk/dist/generated/executor_fee_lib.js +255 -0
  351. package/sdk/dist/generated/executor_helper.d.ts +981 -0
  352. package/sdk/dist/generated/executor_helper.js +236 -0
  353. package/sdk/dist/generated/oft_std.d.ts +1722 -0
  354. package/sdk/dist/generated/oft_std.js +316 -0
  355. package/sdk/dist/generated/price_feed.d.ts +1077 -0
  356. package/sdk/dist/generated/price_feed.js +210 -0
  357. package/sdk/dist/generated/sml.d.ts +171 -56
  358. package/sdk/dist/generated/sml.js +111 -62
  359. package/sdk/dist/generated/treasury.d.ts +896 -0
  360. package/sdk/dist/generated/treasury.js +219 -0
  361. package/sdk/dist/generated/uln302.d.ts +175 -75
  362. package/sdk/dist/generated/uln302.js +126 -82
  363. package/sdk/dist/generated/upgrader.d.ts +70 -0
  364. package/sdk/dist/generated/upgrader.js +19 -0
  365. package/sdk/dist/index.d.ts +10 -0
  366. package/sdk/dist/index.js +14 -0
  367. package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
  368. package/sdk/dist/wasm/blocked-message-lib.js +2 -0
  369. package/sdk/dist/wasm/counter.d.ts +1 -0
  370. package/sdk/dist/wasm/counter.js +2 -0
  371. package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
  372. package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
  373. package/sdk/dist/wasm/dvn.d.ts +1 -0
  374. package/sdk/dist/wasm/dvn.js +2 -0
  375. package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
  376. package/sdk/dist/wasm/endpoint-v2.js +2 -0
  377. package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
  378. package/sdk/dist/wasm/executor-fee-lib.js +2 -0
  379. package/sdk/dist/wasm/executor-helper.d.ts +1 -0
  380. package/sdk/dist/wasm/executor-helper.js +2 -0
  381. package/sdk/dist/wasm/executor.d.ts +1 -0
  382. package/sdk/dist/wasm/executor.js +2 -0
  383. package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
  384. package/sdk/dist/wasm/layerzero-views.js +2 -0
  385. package/sdk/dist/wasm/oft-std.d.ts +1 -0
  386. package/sdk/dist/wasm/oft-std.js +2 -0
  387. package/sdk/dist/wasm/price-feed.d.ts +1 -0
  388. package/sdk/dist/wasm/price-feed.js +2 -0
  389. package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
  390. package/sdk/dist/wasm/simple-message-lib.js +2 -0
  391. package/sdk/dist/wasm/treasury.d.ts +1 -0
  392. package/sdk/dist/wasm/treasury.js +2 -0
  393. package/sdk/dist/wasm/uln302.d.ts +1 -0
  394. package/sdk/dist/wasm/uln302.js +2 -0
  395. package/sdk/dist/wasm/upgrader.d.ts +1 -0
  396. package/sdk/dist/wasm/upgrader.js +2 -0
  397. package/sdk/dist/wasm.d.ts +15 -0
  398. package/sdk/dist/wasm.js +15 -0
  399. package/sdk/package.json +7 -4
  400. package/sdk/src/index.ts +17 -0
  401. package/sdk/test/counter-sml.test.ts +376 -0
  402. package/sdk/test/counter-uln.test.ts +493 -0
  403. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +187 -323
  404. package/sdk/test/suites/constants.ts +22 -2
  405. package/sdk/test/suites/dummyContractClient.ts +169 -0
  406. package/sdk/test/suites/globalSetup.ts +450 -0
  407. package/sdk/test/suites/localnet.ts +23 -6
  408. package/sdk/test/upgrader.test.ts +300 -0
  409. package/sdk/test/utils.ts +558 -85
  410. package/sdk/vitest.config.ts +21 -0
  411. package/tools/ts-bindings-gen/src/main.rs +12 -1
  412. package/turbo.json +2 -0
  413. package/contracts/common-macros/src/contract_impl.rs +0 -47
  414. package/contracts/common-macros/src/ownable.rs +0 -59
  415. package/contracts/common-macros/src/tests/contract_impl.rs +0 -381
  416. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -32
  417. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  418. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  419. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  420. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  421. package/contracts/oapp-macros/src/lib.rs +0 -154
  422. package/contracts/oapp-macros/src/oapp_core.rs +0 -40
  423. package/contracts/oapp-macros/src/oapp_full.rs +0 -21
  424. package/contracts/oapp-macros/src/oapp_options_type3.rs +0 -31
  425. package/contracts/oapp-macros/src/oapp_receiver.rs +0 -48
  426. package/contracts/oapp-macros/src/oapp_sender.rs +0 -21
  427. package/contracts/oapp-macros/src/util.rs +0 -107
  428. package/contracts/oapps/oft/src/constants.rs +0 -5
  429. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -146
  430. package/contracts/utils/src/tests/ttl.rs +0 -421
  431. package/contracts/utils/src/ttl.rs +0 -123
  432. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  433. package/contracts/workers/dvn/src/multisig.rs +0 -153
  434. package/sdk/test/index.test.ts +0 -376
  435. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
@@ -1,144 +1,471 @@
1
- use crate::{tests::endpoint_setup::setup, MessagingParams};
2
- use soroban_sdk::{
3
- testutils::{Address as _, MockAuth, MockAuthInvoke},
4
- vec, Bytes, BytesN, IntoVal,
5
- };
1
+ use soroban_sdk::{testutils::Address as _, vec, Address, Bytes, BytesN};
6
2
 
3
+ use crate::{errors::EndpointError, tests::endpoint_setup::setup, util::compute_guid, MessagingParams};
4
+
5
+ // Helpers
6
+ /// Helper to create default messaging params
7
+ fn default_params(env: &soroban_sdk::Env, dst_eid: u32, pay_in_zro: bool) -> MessagingParams {
8
+ MessagingParams {
9
+ dst_eid,
10
+ receiver: BytesN::from_array(env, &[1u8; 32]),
11
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
12
+ options: Bytes::new(env),
13
+ pay_in_zro,
14
+ }
15
+ }
16
+
17
+ // Native Fee Payment
7
18
  #[test]
8
19
  fn test_quote_with_native_fee() {
9
20
  let context = setup();
10
21
  let env = &context.env;
11
22
  let endpoint_client = &context.endpoint_client;
12
23
 
13
- let sender = soroban_sdk::Address::generate(env);
24
+ let sender = Address::generate(env);
14
25
  let dst_eid = 2u32;
15
- let receiver = BytesN::from_array(env, &[1u8; 32]);
16
- let message = Bytes::from_array(env, &[1, 2, 3, 4]);
17
- let options = Bytes::new(env);
18
- let fee_recipient = soroban_sdk::Address::generate(env);
19
-
20
- // Setup mock send library with 100 native fee, 0 zro fee
21
- let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient);
22
-
23
- // Register and set as default send library
24
- context.mock_owner_auth("register_library", (&send_lib,));
25
- endpoint_client.register_library(&send_lib);
26
- context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
27
- endpoint_client.set_default_send_library(&dst_eid, &send_lib);
28
-
29
- let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
30
-
31
- // Mock auth for sender
32
- env.mock_auths(&[MockAuth {
33
- address: &sender,
34
- invoke: &MockAuthInvoke {
35
- contract: &endpoint_client.address,
36
- fn_name: "quote",
37
- args: (&sender, &params).into_val(env),
38
- sub_invokes: &[],
39
- },
40
- }]);
26
+ context.setup_default_send_lib(dst_eid, 100, 0);
27
+
28
+ let params = default_params(env, dst_eid, false);
41
29
 
42
30
  let fee = endpoint_client.quote(&sender, &params);
43
31
  assert_eq!(fee.native_fee, 100);
44
32
  assert_eq!(fee.zro_fee, 0);
45
33
  }
46
34
 
35
+ // ZRO Fee Payment
47
36
  #[test]
48
37
  fn test_quote_with_zro_fee() {
49
38
  let context = setup();
50
39
  let env = &context.env;
51
40
  let endpoint_client = &context.endpoint_client;
52
41
 
53
- let sender = soroban_sdk::Address::generate(env);
42
+ let sender = Address::generate(env);
54
43
  let dst_eid = 2u32;
55
- let receiver = BytesN::from_array(env, &[1u8; 32]);
56
- let message = Bytes::from_array(env, &[1, 2, 3, 4]);
57
- let options = Bytes::new(env);
58
- let fee_recipient = soroban_sdk::Address::generate(env);
59
-
60
- // Setup ZRO token
61
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
62
- endpoint_client.set_zro(&context.zro_token_client.address);
63
-
64
- // Setup mock send library with 50 native fee, 25 zro fee
65
- let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 50, 25, fee_recipient);
66
-
67
- // Register and set as default send library
68
- context.mock_owner_auth("register_library", (&send_lib,));
69
- endpoint_client.register_library(&send_lib);
70
- context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
71
- endpoint_client.set_default_send_library(&dst_eid, &send_lib);
72
-
73
- let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: true };
74
-
75
- // Mock auth for sender
76
- env.mock_auths(&[MockAuth {
77
- address: &sender,
78
- invoke: &MockAuthInvoke {
79
- contract: &endpoint_client.address,
80
- fn_name: "quote",
81
- args: (&sender, &params).into_val(env),
82
- sub_invokes: &[],
83
- },
84
- }]);
44
+ context.setup_zro_with_auth();
45
+ context.setup_default_send_lib(dst_eid, 50, 25);
46
+
47
+ let params = default_params(env, dst_eid, true);
85
48
 
86
49
  let fee = endpoint_client.quote(&sender, &params);
87
50
  assert_eq!(fee.native_fee, 50);
88
51
  assert_eq!(fee.zro_fee, 25);
89
52
  }
90
53
 
54
+ #[test]
55
+ fn test_quote_pay_in_zro_false_with_zro_set() {
56
+ let context = setup();
57
+ let env = &context.env;
58
+ let endpoint_client = &context.endpoint_client;
59
+
60
+ let sender = Address::generate(env);
61
+ let dst_eid = 2u32;
62
+ context.setup_zro_with_auth(); // Set ZRO but don't use it
63
+ context.setup_default_send_lib(dst_eid, 100, 0);
64
+
65
+ let params = default_params(env, dst_eid, false);
66
+
67
+ // Should work fine even though ZRO is set, because pay_in_zro is false
68
+ let fee = endpoint_client.quote(&sender, &params);
69
+ assert_eq!(fee.native_fee, 100);
70
+ assert_eq!(fee.zro_fee, 0);
71
+ }
72
+
73
+ // Send Library Management
91
74
  #[test]
92
75
  fn test_quote_with_custom_send_library() {
93
76
  let context = setup();
94
77
  let env = &context.env;
95
78
  let endpoint_client = &context.endpoint_client;
96
79
 
97
- let sender = soroban_sdk::Address::generate(env);
80
+ let sender = Address::generate(env);
98
81
  let dst_eid = 2u32;
99
- let receiver = BytesN::from_array(env, &[1u8; 32]);
100
- let message = Bytes::from_array(env, &[1, 2, 3, 4]);
101
- let options = Bytes::new(env);
102
- let fee_recipient = soroban_sdk::Address::generate(env);
82
+ let fee_recipient = Address::generate(env);
103
83
 
104
84
  // Setup default send library with 100 fee
105
- let default_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient.clone());
106
- context.mock_owner_auth("register_library", (&default_lib,));
107
- endpoint_client.register_library(&default_lib);
108
- context.mock_owner_auth("set_default_send_library", (&dst_eid, &default_lib));
109
- endpoint_client.set_default_send_library(&dst_eid, &default_lib);
85
+ context.setup_default_send_lib(dst_eid, 100, 0);
110
86
 
111
87
  // Setup custom send library with 200 fee
112
88
  let custom_lib = context.setup_mock_send_lib(vec![env, dst_eid], 200, 0, fee_recipient);
113
- context.mock_owner_auth("register_library", (&custom_lib,));
114
- endpoint_client.register_library(&custom_lib);
89
+ context.register_library_with_auth(&custom_lib);
115
90
 
116
91
  // Set custom library for sender
117
- env.mock_auths(&[MockAuth {
118
- address: &sender,
119
- invoke: &MockAuthInvoke {
120
- contract: &endpoint_client.address,
121
- fn_name: "set_send_library",
122
- args: (&sender, &sender, &dst_eid, &custom_lib).into_val(env),
123
- sub_invokes: &[],
124
- },
125
- }]);
92
+ let custom_lib_option = Some(custom_lib.clone());
93
+ context.mock_auth(&sender, "set_send_library", (&sender, &sender, &dst_eid, &custom_lib_option));
126
94
  endpoint_client.set_send_library(&sender, &sender, &dst_eid, &Some(custom_lib));
127
95
 
128
- let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
129
-
130
- // Mock auth for sender
131
- env.mock_auths(&[MockAuth {
132
- address: &sender,
133
- invoke: &MockAuthInvoke {
134
- contract: &endpoint_client.address,
135
- fn_name: "quote",
136
- args: (&sender, &params).into_val(env),
137
- sub_invokes: &[],
138
- },
139
- }]);
96
+ let params = default_params(env, dst_eid, false);
140
97
 
141
98
  let fee = endpoint_client.quote(&sender, &params);
142
99
  // Should use custom library with 200 fee
143
100
  assert_eq!(fee.native_fee, 200);
101
+ assert_eq!(fee.zro_fee, 0);
102
+ }
103
+
104
+ // Error Cases
105
+ #[test]
106
+ fn test_quote_zro_unavailable_when_pay_in_zro() {
107
+ let context = setup();
108
+ let env = &context.env;
109
+ let endpoint_client = &context.endpoint_client;
110
+
111
+ let sender = Address::generate(env);
112
+ let dst_eid = 999u32; // Use unique dst_eid to avoid conflicts
113
+
114
+ // Verify ZRO is not set
115
+ let zro_token = endpoint_client.zro();
116
+ assert_eq!(zro_token, None, "ZRO must not be set for this test");
117
+
118
+ // DO NOT setup send library - the ZRO check happens FIRST (line 44), before get_send_library is called
119
+ // So we should get ZROUnavailable error, not DefaultSendLibUnavailable
120
+ let params = default_params(env, dst_eid, true);
121
+
122
+ let result = endpoint_client.try_quote(&sender, &params);
123
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::ZroUnavailable.into());
124
+ }
125
+
126
+ #[test]
127
+ fn test_quote_default_send_lib_unavailable() {
128
+ let context = setup();
129
+ let env = &context.env;
130
+ let endpoint_client = &context.endpoint_client;
131
+
132
+ let sender = Address::generate(env);
133
+ let dst_eid = 999u32; // Use unique dst_eid that has no default send library
134
+
135
+ // Verify no default send library is set
136
+ let default_send_lib = context.endpoint_client.default_send_library(&dst_eid);
137
+ assert_eq!(default_send_lib, None, "Default send library should not be set for this test");
138
+
139
+ let params = default_params(env, dst_eid, false);
140
+
141
+ // Should fail with DefaultSendLibUnavailable since no default send library is set
142
+ let result = endpoint_client.try_quote(&sender, &params);
143
+ assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::DefaultSendLibUnavailable.into());
144
+ }
145
+
146
+ // Edge Cases
147
+ #[test]
148
+ fn test_quote_with_empty_message_and_options() {
149
+ let context = setup();
150
+ let env = &context.env;
151
+ let endpoint_client = &context.endpoint_client;
152
+
153
+ let sender = Address::generate(env);
154
+ let dst_eid = 2u32;
155
+ context.setup_default_send_lib(dst_eid, 100, 0);
156
+
157
+ let params = MessagingParams {
158
+ dst_eid,
159
+ receiver: BytesN::from_array(env, &[1u8; 32]),
160
+ message: Bytes::new(env), // Empty message
161
+ options: Bytes::new(env),
162
+ pay_in_zro: false,
163
+ };
164
+
165
+ // Should work fine with empty message
166
+ let fee = endpoint_client.quote(&sender, &params);
167
+ assert_eq!(fee.native_fee, 100);
168
+ }
169
+
170
+ #[test]
171
+ fn test_quote_with_non_empty_options() {
172
+ let context = setup();
173
+ let env = &context.env;
174
+ let endpoint_client = &context.endpoint_client;
175
+
176
+ let sender = Address::generate(env);
177
+ let dst_eid = 2u32;
178
+ context.setup_default_send_lib(dst_eid, 100, 0);
179
+
180
+ // Create non-empty options (simulating executor/DVN options)
181
+ // Format: [worker_id (1 byte), option_size (2 bytes), option_data...]
182
+ let options = Bytes::from_array(env, &[1u8, 0u8, 4u8, 1u8, 2u8, 3u8, 4u8]);
183
+
184
+ let params = MessagingParams {
185
+ dst_eid,
186
+ receiver: BytesN::from_array(env, &[1u8; 32]),
187
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
188
+ options,
189
+ pay_in_zro: false,
190
+ };
191
+
192
+ // Should work fine with non-empty options
193
+ let fee = endpoint_client.quote(&sender, &params);
194
+ assert_eq!(fee.native_fee, 100);
195
+ }
196
+
197
+ #[test]
198
+ fn test_quote_with_different_dst_eid() {
199
+ let context = setup();
200
+ let env = &context.env;
201
+ let endpoint_client = &context.endpoint_client;
202
+
203
+ let sender = Address::generate(env);
204
+ let dst_eid_1 = 2u32;
205
+ let dst_eid_2 = 3u32;
206
+
207
+ // Setup different send libraries for different dst_eids
208
+ context.setup_default_send_lib(dst_eid_1, 100, 0);
209
+ context.setup_default_send_lib(dst_eid_2, 200, 0);
210
+
211
+ let params_1 = default_params(env, dst_eid_1, false);
212
+ let fee_1 = endpoint_client.quote(&sender, &params_1);
213
+ assert_eq!(fee_1.native_fee, 100);
214
+
215
+ let params_2 = default_params(env, dst_eid_2, false);
216
+ let fee_2 = endpoint_client.quote(&sender, &params_2);
217
+ assert_eq!(fee_2.native_fee, 200);
218
+ }
219
+
220
+ #[test]
221
+ fn test_quote_with_different_receivers() {
222
+ let context = setup();
223
+ let env = &context.env;
224
+ let endpoint_client = &context.endpoint_client;
225
+
226
+ let sender = Address::generate(env);
227
+ let dst_eid = 2u32;
228
+ context.setup_default_send_lib(dst_eid, 100, 0);
229
+
230
+ let receiver_1 = BytesN::from_array(env, &[1u8; 32]);
231
+ let receiver_2 = BytesN::from_array(env, &[2u8; 32]);
232
+
233
+ let params_1 = MessagingParams {
234
+ dst_eid,
235
+ receiver: receiver_1,
236
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
237
+ options: Bytes::new(env),
238
+ pay_in_zro: false,
239
+ };
240
+ let fee_1 = endpoint_client.quote(&sender, &params_1);
241
+ assert_eq!(fee_1.native_fee, 100);
242
+
243
+ let params_2 = MessagingParams {
244
+ dst_eid,
245
+ receiver: receiver_2,
246
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
247
+ options: Bytes::new(env),
248
+ pay_in_zro: false,
249
+ };
250
+ let fee_2 = endpoint_client.quote(&sender, &params_2);
251
+ assert_eq!(fee_2.native_fee, 100);
252
+ }
253
+
254
+ #[test]
255
+ fn test_quote_with_different_senders() {
256
+ let context = setup();
257
+ let env = &context.env;
258
+ let endpoint_client = &context.endpoint_client;
259
+
260
+ let sender_1 = Address::generate(env);
261
+ let sender_2 = Address::generate(env);
262
+ let dst_eid = 2u32;
263
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
264
+ context.setup_default_send_lib(dst_eid, 100, 0);
265
+
266
+ // Each sender should have independent nonce tracking
267
+ let params_1 = MessagingParams {
268
+ dst_eid,
269
+ receiver: receiver.clone(),
270
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
271
+ options: Bytes::new(env),
272
+ pay_in_zro: false,
273
+ };
274
+ let fee_1 = endpoint_client.quote(&sender_1, &params_1);
275
+ assert_eq!(fee_1.native_fee, 100);
276
+
277
+ let params_2 = MessagingParams {
278
+ dst_eid,
279
+ receiver: receiver.clone(),
280
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
281
+ options: Bytes::new(env),
282
+ pay_in_zro: false,
283
+ };
284
+ let fee_2 = endpoint_client.quote(&sender_2, &params_2);
285
+ assert_eq!(fee_2.native_fee, 100);
286
+
287
+ // Verify both senders have independent nonces (both should be 0 initially)
288
+ let nonce_1 = endpoint_client.outbound_nonce(&sender_1, &dst_eid, &receiver);
289
+ let nonce_2 = endpoint_client.outbound_nonce(&sender_2, &dst_eid, &receiver);
290
+ assert_eq!(nonce_1, 0);
291
+ assert_eq!(nonce_2, 0);
292
+ }
293
+
294
+ // Large Message Tests
295
+ #[test]
296
+ fn test_quote_with_large_message() {
297
+ let context = setup();
298
+ let env = &context.env;
299
+ let endpoint_client = &context.endpoint_client;
300
+
301
+ let sender = Address::generate(env);
302
+ let dst_eid = 2u32;
303
+ context.setup_default_send_lib(dst_eid, 100, 0);
304
+
305
+ // Create a large message (1024 bytes)
306
+ let mut large_message_data = [0u8; 1024];
307
+ for i in 0..1024 {
308
+ large_message_data[i] = (i % 256) as u8;
309
+ }
310
+ let large_message = Bytes::from_array(env, &large_message_data);
311
+
312
+ let params = MessagingParams {
313
+ dst_eid,
314
+ receiver: BytesN::from_array(env, &[1u8; 32]),
315
+ message: large_message,
316
+ options: Bytes::new(env),
317
+ pay_in_zro: false,
318
+ };
319
+
320
+ // Should work fine with large message
321
+ let fee = endpoint_client.quote(&sender, &params);
322
+ assert_eq!(fee.native_fee, 100);
323
+ }
324
+
325
+ // Nonce and GUID Verification
326
+ #[test]
327
+ fn test_quote_nonce_calculation() {
328
+ let context = setup();
329
+ let env = &context.env;
330
+ let endpoint_client = &context.endpoint_client;
331
+
332
+ let sender = Address::generate(env);
333
+ let dst_eid = 2u32;
334
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
335
+ context.setup_default_send_lib(dst_eid, 100, 0);
336
+
337
+ // Initial nonce should be 0
338
+ let initial_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
339
+ assert_eq!(initial_nonce, 0);
340
+
341
+ let params = MessagingParams {
342
+ dst_eid,
343
+ receiver: receiver.clone(),
344
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
345
+ options: Bytes::new(env),
346
+ pay_in_zro: false,
347
+ };
348
+
349
+ // First quote should use nonce = 0 + 1 = 1
350
+ let _fee_1 = endpoint_client.quote(&sender, &params);
351
+ // Nonce should still be 0 (quote doesn't increment nonce)
352
+ let nonce_after_first = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
353
+ assert_eq!(nonce_after_first, 0);
354
+
355
+ // Second quote should also use nonce = 0 + 1 = 1 (nonce doesn't change)
356
+ let _fee_2 = endpoint_client.quote(&sender, &params);
357
+ let nonce_after_second = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
358
+ assert_eq!(nonce_after_second, 0);
359
+ }
360
+
361
+ #[test]
362
+ fn test_quote_guid_calculation() {
363
+ let context = setup();
364
+ let env = &context.env;
365
+ let endpoint_client = &context.endpoint_client;
366
+
367
+ let sender = Address::generate(env);
368
+ let dst_eid = 2u32;
369
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
370
+ context.setup_default_send_lib(dst_eid, 100, 0);
371
+
372
+ let params = MessagingParams {
373
+ dst_eid,
374
+ receiver: receiver.clone(),
375
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
376
+ options: Bytes::new(env),
377
+ pay_in_zro: false,
378
+ };
379
+
380
+ // Get the expected nonce (outbound_nonce + 1)
381
+ let expected_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver) + 1;
382
+ let src_eid = endpoint_client.eid();
383
+
384
+ // Calculate expected GUID
385
+ let expected_guid = compute_guid(env, expected_nonce, src_eid, &sender, dst_eid, &receiver);
386
+
387
+ // Mock the send library to capture the packet
388
+ // Since we can't directly inspect the packet passed to send_lib.quote(),
389
+ // we verify the nonce calculation indirectly by checking that quote works correctly
390
+ // The GUID is computed internally, so we verify the nonce is correct
391
+ let _fee = endpoint_client.quote(&sender, &params);
392
+
393
+ // Verify the GUID would be computed correctly by checking next_guid
394
+ let next_guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
395
+ assert_eq!(next_guid, expected_guid);
396
+ }
397
+
398
+ #[test]
399
+ fn test_quote_multiple_quotes_same_path() {
400
+ let context = setup();
401
+ let env = &context.env;
402
+ let endpoint_client = &context.endpoint_client;
403
+
404
+ let sender = Address::generate(env);
405
+ let dst_eid = 2u32;
406
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
407
+ context.setup_default_send_lib(dst_eid, 100, 0);
408
+
409
+ let params = MessagingParams {
410
+ dst_eid,
411
+ receiver: receiver.clone(),
412
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
413
+ options: Bytes::new(env),
414
+ pay_in_zro: false,
415
+ };
416
+
417
+ // Multiple quotes for the same path should all use the same nonce (outbound_nonce + 1)
418
+ // because quote doesn't increment the nonce
419
+ for _ in 0..5 {
420
+ let fee = endpoint_client.quote(&sender, &params);
421
+ assert_eq!(fee.native_fee, 100);
422
+ }
423
+
424
+ // Nonce should still be 0 (quote doesn't increment it)
425
+ let nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
426
+ assert_eq!(nonce, 0);
427
+ }
428
+
429
+ // Quote After Send
430
+ #[test]
431
+ fn test_quote_after_send() {
432
+ let context = setup();
433
+ let env = &context.env;
434
+ let endpoint_client = &context.endpoint_client;
435
+
436
+ let sender = Address::generate(env);
437
+ let refund_address = Address::generate(env);
438
+ let dst_eid = 2u32;
439
+ let receiver = BytesN::from_array(env, &[1u8; 32]);
440
+ context.setup_default_send_lib(dst_eid, 100, 0);
441
+
442
+ // Setup ZRO token (required for send)
443
+ context.setup_zro_with_auth();
444
+
445
+ // Mint and transfer native tokens for send
446
+ context.fund_endpoint_with_native(&sender, 100);
447
+
448
+ let params = MessagingParams {
449
+ dst_eid,
450
+ receiver: receiver.clone(),
451
+ message: Bytes::from_array(env, &[1, 2, 3, 4]),
452
+ options: Bytes::new(env),
453
+ pay_in_zro: false,
454
+ };
455
+
456
+ // Send a message (this increments the nonce)
457
+ context.mock_auth(&sender, "send", (&sender, &params, &refund_address));
458
+ let _receipt = endpoint_client.send(&sender, &params, &refund_address);
459
+
460
+ // Verify nonce was incremented
461
+ let nonce_after_send = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
462
+ assert_eq!(nonce_after_send, 1);
463
+
464
+ // Quote should now use nonce = 1 + 1 = 2
465
+ let _fee = endpoint_client.quote(&sender, &params);
466
+
467
+ // Verify next_guid uses nonce 2
468
+ let next_guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
469
+ let expected_guid = compute_guid(env, 2, endpoint_client.eid(), &sender, dst_eid, &receiver);
470
+ assert_eq!(next_guid, expected_guid);
144
471
  }
@@ -1,9 +1,9 @@
1
- use crate::tests::endpoint_setup::setup;
2
1
  use soroban_sdk::{
3
2
  testutils::{Address as _, MockAuth, MockAuthInvoke},
4
3
  Address, IntoVal,
5
4
  };
6
5
 
6
+ use crate::tests::endpoint_setup::setup;
7
7
  #[test]
8
8
  fn test_recover_token() {
9
9
  let context = setup();
@@ -1,29 +1,56 @@
1
- use crate::{storage, tests::endpoint_setup::setup};
2
- use soroban_sdk::testutils::{Address as _, MockAuth, MockAuthInvoke};
3
- use soroban_sdk::IntoVal;
1
+ use soroban_sdk::testutils::Address as _;
2
+ use soroban_sdk::Address;
4
3
 
4
+ use crate::{tests::endpoint_setup::setup, EndpointV2};
5
+
6
+ // NOTE ABOUT COVERAGE
7
+ //
8
+ // `require_oapp_auth` has two "success" paths:
9
+ // - caller == oapp
10
+ // - caller == delegate(oapp)
11
+ //
12
+ // Those success paths MUST also satisfy `caller.require_auth()`.
13
+ // Calling `require_oapp_auth` directly from a unit test is brittle because the mocked auth context
14
+ // is keyed off the *public contract invocation* (e.g. `clear`), not internal function calls.
15
+ //
16
+ // We intentionally do NOT test the success paths here.
17
+ // They are covered end-to-end via the public `clear()` entrypoint in `clear.rs`:
18
+ // - OApp (receiver) clears successfully (covers caller == oapp)
19
+ // - Delegate clears successfully (covers caller == delegate(oapp))
20
+
21
+ // Unauthorized caller is rejected
22
+ #[test]
23
+ #[should_panic(expected = "Error(Contract, #22)")] // EndpointError::Unauthorized
24
+ fn test_require_oapp_auth_unauthorized() {
25
+ let context = setup();
26
+ let env = &context.env;
27
+ let endpoint_client = &context.endpoint_client;
28
+ let oapp = Address::generate(env);
29
+ let unauthorized = Address::generate(env);
30
+
31
+ // Unauthorized address (not oapp itself and not delegate) should fail with Unauthorized error
32
+ env.as_contract(&endpoint_client.address, || {
33
+ EndpointV2::require_oapp_auth(env, &unauthorized, &oapp);
34
+ });
35
+ }
36
+
37
+ // Wrong delegate is rejected
5
38
  #[test]
6
- fn test_require_oapp_auth_delegate_set() {
39
+ #[should_panic(expected = "Error(Contract, #22)")] // EndpointError::Unauthorized
40
+ fn test_require_oapp_auth_wrong_delegate() {
7
41
  let context = setup();
8
42
  let env = &context.env;
9
43
  let endpoint_client = &context.endpoint_client;
10
- let oapp = soroban_sdk::Address::generate(env);
11
- let delegate = soroban_sdk::Address::generate(env);
44
+ let oapp = Address::generate(env);
45
+ let delegate = Address::generate(env);
46
+ let wrong_delegate = Address::generate(env);
12
47
 
13
48
  // Set delegate
14
- let delegate_option = Some(delegate.clone());
15
- env.mock_auths(&[MockAuth {
16
- address: &oapp,
17
- invoke: &MockAuthInvoke {
18
- contract: &endpoint_client.address,
19
- fn_name: "set_delegate",
20
- args: (&oapp, &delegate_option).into_val(env),
21
- sub_invokes: &[],
22
- },
23
- }]);
24
- endpoint_client.set_delegate(&oapp, &delegate_option);
49
+ let delegate_option = Some(delegate);
50
+ context.set_delegate_with_auth(&oapp, &delegate_option);
25
51
 
26
- // Verify delegate was set
27
- let stored_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
28
- assert_eq!(stored_delegate, Some(delegate));
52
+ // Wrong delegate (not the actual delegate) should fail with Unauthorized error
53
+ env.as_contract(&endpoint_client.address, || {
54
+ EndpointV2::require_oapp_auth(env, &wrong_delegate, &oapp);
55
+ });
29
56
  }