@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,16 +1,30 @@
1
- use crate::{
2
- codec::MsgType,
3
- integration_tests::setup::{decode_packet, ChainSetup},
4
- };
5
- use endpoint_v2::{MessagingFee, Origin, OutboundPacket};
1
+ //! Common utilities shared between SML and ULN302 integration tests.
2
+
3
+ extern crate std;
4
+
5
+ use crate::{codec::MsgType, counter::CounterClient, tests::mint_to};
6
+ use endpoint_v2::{EndpointV2Client, MessagingFee, Origin, OutboundPacket};
6
7
  use message_lib_common::packet_codec_v1;
7
8
  use soroban_sdk::{
8
9
  address_payload::AddressPayload,
9
10
  testutils::{Events, MockAuth, MockAuthInvoke},
10
- Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val,
11
+ Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val, Vec,
11
12
  };
13
+ use utils::buffer_reader::BufferReader;
14
+
15
+ /// Trait for common fields in chain setup structs.
16
+ /// Both SML and ULN302 ChainSetup implement this trait.
17
+ pub trait ChainSetupCommon<'a> {
18
+ fn counter(&self) -> &CounterClient<'a>;
19
+ fn endpoint(&self) -> &EndpointV2Client<'a>;
20
+ fn native_token(&self) -> &Address;
21
+ fn owner(&self) -> &Address;
22
+ /// Validates a packet using the message library's verification mechanism.
23
+ /// SML calls validate_packet, ULN302 does DVN verify + commit.
24
+ fn validate_packet(&self, env: &Env, packet_event: &(Bytes, Bytes, Address)) -> OutboundPacket;
25
+ }
12
26
 
13
- /// Helper to extract BytesN<32> payload from an Address
27
+ /// Converts an Address into its 32-byte payload.
14
28
  pub fn address_to_bytes32(address: &Address) -> BytesN<32> {
15
29
  match address.to_payload().unwrap() {
16
30
  AddressPayload::AccountIdPublicKeyEd25519(payload) => payload,
@@ -18,13 +32,76 @@ pub fn address_to_bytes32(address: &Address) -> BytesN<32> {
18
32
  }
19
33
  }
20
34
 
21
- pub fn quote(chain: &ChainSetup<'_>, dst_eid: u32, msg_type: MsgType, options: &Bytes) -> MessagingFee {
22
- chain.counter.quote(&dst_eid, &(msg_type as u32), options, &false)
35
+ /// Sets the ZRO token on the endpoint with owner authorization.
36
+ pub fn set_zro(env: &Env, owner: &Address, endpoint: &EndpointV2Client<'_>, zro_token: &Address) {
37
+ env.mock_auths(&[MockAuth {
38
+ address: owner,
39
+ invoke: &MockAuthInvoke {
40
+ contract: &endpoint.address,
41
+ fn_name: "set_zro",
42
+ args: (zro_token,).into_val(env),
43
+ sub_invokes: &[],
44
+ },
45
+ }]);
46
+ endpoint.set_zro(zro_token);
47
+ }
48
+
49
+ /// Registers a message library on the endpoint with owner authorization.
50
+ pub fn register_library(env: &Env, owner: &Address, endpoint: &EndpointV2Client<'_>, lib: &Address) {
51
+ env.mock_auths(&[MockAuth {
52
+ address: owner,
53
+ invoke: &MockAuthInvoke {
54
+ contract: &endpoint.address,
55
+ fn_name: "register_library",
56
+ args: (lib,).into_val(env),
57
+ sub_invokes: &[],
58
+ },
59
+ }]);
60
+ endpoint.register_library(lib);
61
+ }
62
+
63
+ /// Sets the peer address for a counter on a destination EID.
64
+ pub fn set_peer(env: &Env, owner: &Address, counter: &CounterClient<'_>, dst_eid: u32, peer: &BytesN<32>) {
65
+ let peer_option = Some(peer.clone());
66
+ env.mock_auths(&[MockAuth {
67
+ address: owner,
68
+ invoke: &MockAuthInvoke {
69
+ contract: &counter.address,
70
+ fn_name: "set_peer",
71
+ args: (&dst_eid, &peer_option).into_val(env),
72
+ sub_invokes: &[],
73
+ },
74
+ }]);
75
+ counter.set_peer(&dst_eid, &peer_option);
76
+ }
77
+
78
+ /// Decodes an outbound packet emitted by the endpoint.
79
+ pub fn decode_packet(env: &Env, encoded_packet: &Bytes) -> OutboundPacket {
80
+ let header = packet_codec_v1::decode_packet_header(env, &encoded_packet.slice(0..packet_codec_v1::HEADER_LENGTH));
81
+ let payload = encoded_packet.slice(packet_codec_v1::HEADER_LENGTH..);
82
+
83
+ let mut payload_reader = BufferReader::new(&payload);
84
+ let guid = payload_reader.read_bytes_n::<32>();
85
+ let message = payload_reader.read_bytes_until_end();
86
+
87
+ OutboundPacket {
88
+ nonce: header.nonce,
89
+ src_eid: header.src_eid,
90
+ sender: Address::from_payload(env, AddressPayload::ContractIdHash(header.sender)),
91
+ dst_eid: header.dst_eid,
92
+ receiver: header.receiver,
93
+ guid,
94
+ message,
95
+ }
96
+ }
97
+
98
+ pub fn quote<'a, C: ChainSetupCommon<'a>>(chain: &C, dst_eid: u32, msg_type: MsgType, options: &Bytes) -> MessagingFee {
99
+ chain.counter().quote(&dst_eid, &(msg_type as u32), options, &false)
23
100
  }
24
101
 
25
- pub fn increment(
102
+ pub fn increment<'a, C: ChainSetupCommon<'a>>(
26
103
  env: &Env,
27
- chain: &ChainSetup<'_>,
104
+ chain: &C,
28
105
  sender: &Address,
29
106
  dst_eid: u32,
30
107
  msg_type: MsgType,
@@ -35,87 +112,89 @@ pub fn increment(
35
112
  env.mock_auths(&[MockAuth {
36
113
  address: sender,
37
114
  invoke: &MockAuthInvoke {
38
- contract: &chain.counter.address,
115
+ contract: &chain.counter().address,
39
116
  fn_name: "increment",
40
117
  args: (sender, &dst_eid, &msg_type, options, fee).into_val(env),
41
118
  sub_invokes: &[MockAuthInvoke {
42
- contract: &chain.native_token,
119
+ contract: chain.native_token(),
43
120
  fn_name: "transfer",
44
- args: (sender, &chain.endpoint.address, &fee.native_fee).into_val(env),
121
+ args: (sender, &chain.endpoint().address, &fee.native_fee).into_val(env),
45
122
  sub_invokes: &[],
46
123
  }],
47
124
  },
48
125
  }]);
49
- chain.counter.increment(sender, &dst_eid, &msg_type, options, fee);
126
+ chain.counter().increment(sender, &dst_eid, &msg_type, options, fee);
50
127
  }
51
128
 
52
- pub fn validate_packet(env: &Env, chain: &ChainSetup<'_>, packet_event: &(Bytes, Bytes, Address)) {
53
- let packet = decode_packet(env, &packet_event.0);
54
- let encoded_header = packet_codec_v1::encode_packet_header(env, &packet);
55
- let payload_hash = packet_codec_v1::payload_hash(env, &packet);
56
-
57
- env.mock_auths(&[MockAuth {
58
- address: &chain.owner,
59
- invoke: &MockAuthInvoke {
60
- contract: &chain.sml.address,
61
- fn_name: "validate_packet",
62
- args: (&encoded_header, &payload_hash).into_val(env),
63
- sub_invokes: &[],
64
- },
65
- }]);
66
- chain.sml.validate_packet(&encoded_header, &payload_hash);
67
- }
68
-
69
- pub fn lz_receive(
129
+ /// Execute lz_receive on the counter contract.
130
+ /// Automatically mints native tokens to the executor if value > 0.
131
+ pub fn lz_receive<'a, C: ChainSetupCommon<'a>>(
70
132
  env: &Env,
71
- chain: &ChainSetup<'_>,
133
+ chain: &C,
72
134
  executor: &Address,
73
135
  packet: &OutboundPacket,
74
136
  value: i128,
75
- _aba: bool,
76
137
  ) {
138
+ // Mint native tokens to executor if value > 0
139
+ if value > 0 {
140
+ mint_to(env, chain.owner(), chain.native_token(), executor, value);
141
+ }
142
+
77
143
  let origin = Origin { src_eid: packet.src_eid, sender: address_to_bytes32(&packet.sender), nonce: packet.nonce };
78
144
 
79
145
  let sub_invokes_with_transfer = [MockAuthInvoke {
80
- contract: &chain.native_token,
146
+ contract: chain.native_token(),
81
147
  fn_name: "transfer",
82
- args: (executor, &chain.counter.address, &value).into_val(env),
148
+ args: (executor, &chain.counter().address, &value).into_val(env),
83
149
  sub_invokes: &[],
84
150
  }];
85
151
 
86
152
  env.mock_auths(&[MockAuth {
87
153
  address: executor,
88
154
  invoke: &MockAuthInvoke {
89
- contract: &chain.counter.address,
155
+ contract: &chain.counter().address,
90
156
  fn_name: "lz_receive",
91
157
  args: (executor, &origin, &packet.guid, &packet.message, &Bytes::new(env), &value).into_val(env),
92
158
  sub_invokes: if value > 0 { &sub_invokes_with_transfer } else { &[] },
93
159
  },
94
160
  }]);
95
- chain.counter.lz_receive(executor, &origin, &packet.guid, &packet.message, &Bytes::new(env), &value);
161
+ chain.counter().lz_receive(executor, &origin, &packet.guid, &packet.message, &Bytes::new(env), &value);
96
162
  }
97
163
 
98
- pub fn lz_compose(env: &Env, chain: &ChainSetup<'_>, executor: &Address, packet: &OutboundPacket, value: i128) {
164
+ /// Execute lz_compose on the counter contract.
165
+ /// Automatically mints native tokens to the executor if value > 0.
166
+ pub fn lz_compose<'a, C: ChainSetupCommon<'a>>(
167
+ env: &Env,
168
+ chain: &C,
169
+ executor: &Address,
170
+ packet: &OutboundPacket,
171
+ value: i128,
172
+ ) {
173
+ // Mint native tokens to executor if value > 0
174
+ if value > 0 {
175
+ mint_to(env, chain.owner(), chain.native_token(), executor, value);
176
+ }
177
+
99
178
  let sub_invokes_with_transfer = [MockAuthInvoke {
100
- contract: &chain.native_token,
101
- fn_name: "transfer_from",
102
- args: (executor, executor, &chain.counter.address, &value).into_val(env),
179
+ contract: chain.native_token(),
180
+ fn_name: "transfer",
181
+ args: (executor, &chain.counter().address, &value).into_val(env),
103
182
  sub_invokes: &[],
104
183
  }];
105
184
 
106
185
  env.mock_auths(&[MockAuth {
107
186
  address: executor,
108
187
  invoke: &MockAuthInvoke {
109
- contract: &chain.counter.address,
188
+ contract: &chain.counter().address,
110
189
  fn_name: "lz_compose",
111
- args: (executor, &chain.counter.address, &packet.guid, &0_u32, &packet.message, &Bytes::new(env), &value)
190
+ args: (executor, &chain.counter().address, &packet.guid, &0_u32, &packet.message, &Bytes::new(env), &value)
112
191
  .into_val(env),
113
192
  sub_invokes: if value > 0 { &sub_invokes_with_transfer } else { &[] },
114
193
  },
115
194
  }]);
116
- chain.counter.lz_compose(
195
+ chain.counter().lz_compose(
117
196
  executor,
118
- &chain.counter.address,
197
+ &chain.counter().address,
119
198
  &packet.guid,
120
199
  &0,
121
200
  &packet.message,
@@ -124,11 +203,24 @@ pub fn lz_compose(env: &Env, chain: &ChainSetup<'_>, executor: &Address, packet:
124
203
  );
125
204
  }
126
205
 
127
- // returns (encoded_payload, options, send_library)
206
+ /// Validates a packet using the chain's message library verification mechanism.
207
+ /// This is a convenience wrapper around the trait method.
208
+ pub fn validate_packet<'a, C: ChainSetupCommon<'a>>(
209
+ env: &Env,
210
+ chain: &C,
211
+ packet_event: &(Bytes, Bytes, Address),
212
+ ) -> OutboundPacket {
213
+ chain.validate_packet(env, packet_event)
214
+ }
215
+
216
+ /// Scans for the latest packet_sent event and returns (encoded_payload, options, send_library).
128
217
  pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, Bytes, Address)> {
129
- let mut packet = None;
130
- for (emitter, topics, data) in env.events().all() {
131
- let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
218
+ let events = env.events().all();
219
+ let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
220
+
221
+ // Iterate in reverse to find the most recent packet sent event
222
+ for i in (0..events.len()).rev() {
223
+ let (emitter, topics, data) = events.get(i).unwrap();
132
224
  if emitter == *endpoint && topics.contains(packet_sent_symbol) {
133
225
  let map: Map<Symbol, Val> = data.into_val(env);
134
226
 
@@ -136,9 +228,60 @@ pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, B
136
228
  let options: Bytes = map.get(Symbol::new(env, "options")).unwrap().into_val(env);
137
229
  let send_library: Address = map.get(Symbol::new(env, "send_library")).unwrap().into_val(env);
138
230
 
139
- packet = Some((encoded_payload, options, send_library));
231
+ return Some((encoded_payload, options, send_library));
232
+ }
233
+ }
234
+
235
+ None
236
+ }
237
+
238
+ /// Scans for ALL packet_sent events from an endpoint and returns them in chronological order.
239
+ /// NOTE: In Soroban test environment, events from previous contract calls may be cleared.
240
+ /// Use this only after all messages have been sent in a single "transaction" or collect events incrementally.
241
+ #[allow(dead_code)]
242
+ pub fn scan_all_packet_sent_events(env: &Env, endpoint: &Address) -> Vec<(Bytes, Bytes, Address)> {
243
+ let events = env.events().all();
244
+ let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
245
+ let mut result = Vec::new(env);
246
+
247
+ for i in 0..events.len() {
248
+ let (emitter, topics, data) = events.get(i).unwrap();
249
+ if emitter == *endpoint && topics.contains(packet_sent_symbol) {
250
+ let map: Map<Symbol, Val> = data.into_val(env);
251
+
252
+ let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
253
+ let options: Bytes = map.get(Symbol::new(env, "options")).unwrap().into_val(env);
254
+ let send_library: Address = map.get(Symbol::new(env, "send_library")).unwrap().into_val(env);
255
+
256
+ result.push_back((encoded_payload, options, send_library));
257
+ }
258
+ }
259
+
260
+ result
261
+ }
262
+
263
+ /// Compose sent event data: (from, to, guid, index, message)
264
+ pub type ComposeSentEvent = (Address, Address, BytesN<32>, u32, Bytes);
265
+
266
+ /// Scans for the latest compose_sent event and returns (from, to, guid, index, message).
267
+ pub fn scan_compose_sent_event(env: &Env, endpoint: &Address) -> Option<ComposeSentEvent> {
268
+ let events = env.events().all();
269
+ let compose_sent_symbol = Symbol::new(env, "compose_sent").to_val();
270
+
271
+ // Iterate in reverse to find the most recent compose sent event
272
+ for i in (0..events.len()).rev() {
273
+ let (emitter, topics, data) = events.get(i).unwrap();
274
+ if emitter == *endpoint && topics.contains(compose_sent_symbol) {
275
+ let map: Map<Symbol, Val> = data.into_val(env);
276
+ let from: Address = topics.get(1).unwrap().into_val(env);
277
+ let to: Address = topics.get(2).unwrap().into_val(env);
278
+ let guid: BytesN<32> = topics.get(3).unwrap().into_val(env);
279
+ let index: u32 = topics.get(4).unwrap().into_val(env);
280
+ let message: Bytes = map.get(Symbol::new(env, "message")).unwrap().into_val(env);
281
+
282
+ return Some((from, to, guid, index, message));
140
283
  }
141
284
  }
142
285
 
143
- packet
286
+ None
144
287
  }
@@ -4,34 +4,32 @@ use crate::{
4
4
  options,
5
5
  storage::CounterStorage,
6
6
  };
7
- use common_macros::{contract_impl, only_owner};
7
+ use common_macros::{contract_impl, only_auth};
8
8
  use endpoint_v2::{
9
9
  ILayerZeroComposer, LayerZeroEndpointV2Client, MessagingChannelClient, MessagingComposerClient, MessagingFee,
10
10
  Origin,
11
11
  };
12
12
  use oapp::{
13
- oapp_core::{oapp_initialize, OAppCore},
14
- oapp_receiver::{self, OAppReceiver},
15
- oapp_sender::OAppSender,
13
+ oapp_core::{initialize_oapp, OAppCore},
14
+ oapp_receiver::{LzReceiveInternal, OAppReceiver},
15
+ oapp_sender::OAppSenderInternal,
16
16
  };
17
- use oapp_macros::{oapp, oapp_manual_impl};
17
+ use oapp_macros::oapp;
18
18
  use soroban_sdk::{assert_with_error, panic_with_error, token::TokenClient, Address, Bytes, BytesN, Env};
19
- use utils::ownable::Ownable;
20
19
 
21
- #[oapp]
22
- #[oapp_manual_impl(receiver)]
20
+ #[oapp(custom = [receiver])]
23
21
  pub struct Counter;
24
22
 
25
23
  #[contract_impl]
26
24
  impl Counter {
27
25
  pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address, delegate: &Address) {
28
- oapp_initialize::<Self>(env, owner, endpoint, &Some(delegate.clone()));
26
+ initialize_oapp::<Self>(env, owner, endpoint, &Some(delegate.clone()));
29
27
  let endpoint_client = LayerZeroEndpointV2Client::new(env, endpoint);
30
28
  CounterStorage::set_eid(env, &endpoint_client.eid());
31
29
  }
32
30
 
33
31
  pub fn quote(env: &Env, dst_eid: u32, msg_type: u32, options: &Bytes, pay_in_zro: bool) -> MessagingFee {
34
- Self::lz_quote(env, dst_eid, &codec::encode(env, (msg_type as u8).into(), Self::eid(env)), options, pay_in_zro)
32
+ Self::__quote(env, dst_eid, &codec::encode(env, (msg_type as u8).into(), Self::eid(env)), options, pay_in_zro)
35
33
  }
36
34
 
37
35
  pub fn increment(env: &Env, caller: &Address, dst_eid: u32, msg_type: u32, options: &Bytes, fee: &MessagingFee) {
@@ -43,19 +41,19 @@ impl Counter {
43
41
 
44
42
  // Send the message
45
43
  let message = codec::encode(env, (msg_type as u8).into(), Self::eid(env));
46
- Self::lz_send(env, caller, dst_eid, &message, options, fee, caller);
44
+ Self::__lz_send(env, dst_eid, &message, options, caller, fee, caller);
47
45
  }
48
46
 
49
47
  // ============================================================================================
50
48
  // Owner functions
51
49
  // ============================================================================================
52
50
 
53
- #[only_owner]
51
+ #[only_auth]
54
52
  pub fn set_ordered_nonce(env: &Env, ordered_nonce: bool) {
55
53
  CounterStorage::set_ordered_nonce(env, &ordered_nonce);
56
54
  }
57
55
 
58
- #[only_owner]
56
+ #[only_auth]
59
57
  pub fn skip_inbound_nonce(env: &Env, src_eid: u32, sender: &BytesN<32>, nonce: u64) {
60
58
  let contract_address = env.current_contract_address();
61
59
 
@@ -110,30 +108,19 @@ impl Counter {
110
108
  }
111
109
 
112
110
  // ============================================================================================
113
- // OAppReceiver implementation
111
+ // LzReceiveInternal implementation
114
112
  // ============================================================================================
115
113
 
116
- #[contract_impl(contracttrait)]
117
- impl OAppReceiver for Counter {
118
- fn next_nonce(env: &Env, src_eid: u32, sender: &BytesN<32>) -> u64 {
119
- if CounterStorage::ordered_nonce(env) {
120
- CounterStorage::max_received_nonce(env, src_eid, sender) + 1
121
- } else {
122
- 0
123
- }
124
- }
125
-
126
- fn lz_receive(
114
+ impl LzReceiveInternal for Counter {
115
+ fn __lz_receive(
127
116
  env: &Env,
128
- executor: &Address,
129
117
  origin: &Origin,
130
118
  guid: &BytesN<32>,
131
119
  message: &Bytes,
132
120
  _extra_data: &Bytes,
121
+ _executor: &Address,
133
122
  value: i128,
134
123
  ) {
135
- oapp_receiver::verify_and_clear_payload::<Self>(env, executor, origin, guid, message, value);
136
-
137
124
  // handle the message
138
125
  Self::__accept_nonce(env, origin.src_eid, &origin.sender, origin.nonce);
139
126
 
@@ -167,12 +154,12 @@ impl OAppReceiver for Counter {
167
154
 
168
155
  // Send the response message
169
156
  let options = options::executor_lz_receive_option(env, 200000, 10);
170
- Self::lz_send(
157
+ Self::__lz_send(
171
158
  env,
172
- &contract_address,
173
159
  origin.src_eid,
174
160
  &codec::encode_with_value(env, MsgType::Vanilla, Self::eid(env), 10),
175
161
  &options,
162
+ &contract_address,
176
163
  &MessagingFee { native_fee: value, zro_fee: 0 },
177
164
  &contract_address,
178
165
  );
@@ -181,6 +168,21 @@ impl OAppReceiver for Counter {
181
168
  }
182
169
  }
183
170
 
171
+ // ============================================================================================
172
+ // Custom OAppReceiver implementation
173
+ // ============================================================================================
174
+
175
+ #[contract_impl(contracttrait)]
176
+ impl OAppReceiver for Counter {
177
+ fn next_nonce(env: &Env, src_eid: u32, sender: &BytesN<32>) -> u64 {
178
+ if CounterStorage::ordered_nonce(env) {
179
+ CounterStorage::max_received_nonce(env, src_eid, sender) + 1
180
+ } else {
181
+ 0
182
+ }
183
+ }
184
+ }
185
+
184
186
  // ============================================================================================
185
187
  // ILayerZeroComposer implementation
186
188
  // ============================================================================================
@@ -197,28 +199,18 @@ impl ILayerZeroComposer for Counter {
197
199
  _extra_data: &Bytes,
198
200
  value: i128,
199
201
  ) {
200
- executor.require_auth();
202
+ // Clear compose message, transfer value, and require executor auth
203
+ clear_compose_and_transfer::<Self>(env, executor, from, guid, index, message, value);
201
204
 
202
205
  let msg_type = codec::msg_type(message);
203
206
  if msg_type != MsgType::Composed && msg_type != MsgType::ComposedABA {
204
207
  panic_with_error!(env, CounterError::InvalidMsgType);
205
208
  }
206
209
 
207
- let curr_address = env.current_contract_address();
208
- let endpoint_address = Self::endpoint(env);
209
-
210
- // Transfer value from executor to current contract
211
- if value > 0 {
212
- let native_token = LayerZeroEndpointV2Client::new(env, &endpoint_address).native_token();
213
- TokenClient::new(env, &native_token).transfer_from(executor, executor, &curr_address, &value);
214
- }
215
210
  // Assert the value is sufficient
216
211
  let expected_msg_value = codec::value(env, message);
217
212
  assert_with_error!(env, value >= expected_msg_value, CounterError::InsufficientValue);
218
213
 
219
- // Clear the compose message
220
- MessagingComposerClient::new(env, &endpoint_address).clear_compose(&curr_address, from, guid, &index, message);
221
-
222
214
  // Increment the composed count
223
215
  CounterStorage::set_composed_count(env, &(Self::composed_count(env) + 1));
224
216
 
@@ -230,15 +222,46 @@ impl ILayerZeroComposer for Counter {
230
222
  CounterStorage::set_outbound_count(env, src_eid, &(Self::outbound_count(env, src_eid) + 1));
231
223
 
232
224
  // Send the response message
233
- Self::lz_send(
225
+ let curr_address = env.current_contract_address();
226
+ Self::__lz_send(
234
227
  env,
235
- &curr_address,
236
228
  src_eid,
237
229
  &codec::encode(env, MsgType::Vanilla, Self::eid(env)),
238
230
  &options::executor_lz_receive_option(env, 200000, 0),
231
+ &curr_address,
239
232
  &MessagingFee { native_fee: value, zro_fee: 0 },
240
233
  &curr_address,
241
234
  );
242
235
  }
243
236
  }
244
237
  }
238
+
239
+ /// Clears a compose message and transfers native token value from executor to the OApp.
240
+ ///
241
+ /// This helper handles the common pattern in `lz_compose` implementations:
242
+ /// 1. Requires executor authorization
243
+ /// 2. Clears the compose message from the endpoint
244
+ /// 3. Transfers native token from executor to OApp if value > 0
245
+ pub fn clear_compose_and_transfer<T: OAppCore>(
246
+ env: &Env,
247
+ executor: &Address,
248
+ from: &Address,
249
+ guid: &BytesN<32>,
250
+ index: u32,
251
+ message: &Bytes,
252
+ value: i128,
253
+ ) {
254
+ executor.require_auth();
255
+
256
+ let curr_address = env.current_contract_address();
257
+ let endpoint = T::endpoint(env);
258
+
259
+ // Clear the compose message
260
+ MessagingComposerClient::new(env, &endpoint).clear_compose(&curr_address, from, guid, &index, message);
261
+
262
+ // Transfer value from executor to current contract
263
+ if value > 0 {
264
+ let native_token = LayerZeroEndpointV2Client::new(env, &endpoint).native_token();
265
+ TokenClient::new(env, &native_token).transfer(executor, &curr_address, &value);
266
+ }
267
+ }
@@ -22,16 +22,3 @@ pub fn mint_to(env: &Env, owner: &Address, native_token: &Address, to: &Address,
22
22
  sac.mint(to, &amount);
23
23
  }
24
24
 
25
- pub fn approve(env: &Env, from: &Address, native_token: &Address, amount: i128) {
26
- env.mock_auths(&[MockAuth {
27
- address: from,
28
- invoke: &MockAuthInvoke {
29
- contract: native_token,
30
- fn_name: "approve",
31
- args: (from, from, amount, 10_u32).into_val(env),
32
- sub_invokes: &[],
33
- },
34
- }]);
35
- let sac = StellarAssetClient::new(env, native_token);
36
- sac.approve(from, from, &amount, &10_u32);
37
- }
@@ -11,7 +11,7 @@ use crate::{
11
11
  codec::{self, MsgType},
12
12
  counter::{Counter, CounterClient},
13
13
  errors::CounterError,
14
- tests::{approve, mint_to},
14
+ tests::mint_to,
15
15
  };
16
16
 
17
17
  struct TestSetup<'a> {
@@ -252,11 +252,10 @@ fn test_lz_compose() {
252
252
  let extra_data = Bytes::new(&env);
253
253
 
254
254
  mint_to(&env, &owner, &native_token, &executor, value as i128);
255
- approve(&env, &executor, &native_token, value as i128);
256
255
  let sub_invokes_with_transfer = MockAuthInvoke {
257
256
  contract: &native_token,
258
- fn_name: "transfer_from",
259
- args: (&executor, &executor, &counter.address, &(value as i128)).into_val(&env),
257
+ fn_name: "transfer",
258
+ args: (&executor, &counter.address, &(value as i128)).into_val(&env),
260
259
  sub_invokes: &[],
261
260
  };
262
261
  env.mock_auths(&[MockAuth {
@@ -304,11 +303,10 @@ fn test_lz_compose_aba() {
304
303
 
305
304
  setup_mock_peer(&env, &owner, &counter, origin.src_eid);
306
305
  mint_to(&env, &owner, &native_token, &executor, value as i128);
307
- approve(&env, &executor, &native_token, value as i128);
308
306
  let sub_invokes_with_transfer = MockAuthInvoke {
309
307
  contract: &native_token,
310
- fn_name: "transfer_from",
311
- args: (&executor, &executor, &counter.address, &(value as i128)).into_val(&env),
308
+ fn_name: "transfer",
309
+ args: (&executor, &counter.address, &(value as i128)).into_val(&env),
312
310
  sub_invokes: &[],
313
311
  };
314
312
  env.mock_auths(&[MockAuth {
@@ -1,9 +1,13 @@
1
1
  use common_macros::contract_error;
2
2
 
3
+ // OApp library error codes: 2000-2099
4
+ // See ERROR_SPEC.md for allocation rules
5
+
6
+ /// OAppError: 2000-2099
3
7
  #[contract_error]
4
8
  pub enum OAppError {
5
9
  InvalidOptions = 2000,
6
10
  NoPeer,
7
11
  OnlyPeer,
8
- ZROTokenUnavailable,
12
+ ZroTokenUnavailable,
9
13
  }