@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,4 +1,24 @@
1
- use super::*;
1
+ use super::{Uln302, Uln302Args, Uln302Client};
2
+ use crate::{
3
+ errors::Uln302Error,
4
+ events::{
5
+ DVNFeePaid, DefaultExecutorConfigsSet, DefaultSendUlnConfigsSet, ExecutorConfigSet, ExecutorFeePaid,
6
+ SendUlnConfigSet,
7
+ },
8
+ interfaces::{
9
+ ExecutorConfig, ISendUln302, OAppExecutorConfig, OAppUlnConfig, SetDefaultExecutorConfigParam,
10
+ SetDefaultUlnConfigParam, UlnConfig,
11
+ },
12
+ storage::UlnStorage,
13
+ };
14
+ use common_macros::{contract_impl, only_auth};
15
+ use endpoint_v2::{FeeRecipient, FeesAndPacket, ISendLib, MessagingFee, OutboundPacket};
16
+ use message_lib_common::{
17
+ interfaces::{LayerZeroDVNClient, LayerZeroExecutorClient, LayerZeroTreasuryClient},
18
+ packet_codec_v1, worker_options,
19
+ };
20
+ use soroban_sdk::{assert_with_error, bytes, vec, Address, Bytes, BytesN, Env, Map, Vec};
21
+ use utils::option_ext::OptionExt;
2
22
 
3
23
  // ==============================================================================
4
24
  // ISendLib Contract Implementation
@@ -10,22 +30,21 @@ impl ISendLib for Uln302 {
10
30
  ///
11
31
  /// Calculates fees from: executor (message execution), DVNs (verification), and treasury (protocol fee).
12
32
  fn quote(env: &Env, packet: &OutboundPacket, options: &Bytes, pay_in_zro: bool) -> MessagingFee {
13
- let (executor_options, dvn_options) = worker_options::split_worker_options(env, options);
33
+ let (executor_options, dvn_options, packet_header, payload_hash) =
34
+ prepare_packet_and_options(env, packet, options);
14
35
 
15
36
  // Executor fee
16
37
  let executor_fee =
17
38
  Self::quote_executor(env, &packet.sender, packet.dst_eid, packet.message.len(), &executor_options);
18
39
 
19
40
  // DVNs fees
20
- let packet_header = packet_codec_v1::encode_packet_header(env, packet);
21
- let payload_hash = packet_codec_v1::payload_hash(env, packet);
22
41
  let dvns_fee =
23
42
  Self::quote_dvns(env, &packet.sender, packet.dst_eid, &packet_header, &payload_hash, &dvn_options);
24
43
 
25
44
  // Treasury fee
26
45
  let workers_fee = executor_fee + dvns_fee;
27
- let treasury_fee =
28
- Self::get_treasury_client(env).get_fee(&packet.sender, &packet.dst_eid, &workers_fee, &pay_in_zro);
46
+ let treasury_client = LayerZeroTreasuryClient::new(env, &Self::treasury(env));
47
+ let treasury_fee = treasury_client.get_fee(&packet.sender, &packet.dst_eid, &workers_fee, &pay_in_zro);
29
48
 
30
49
  if pay_in_zro {
31
50
  MessagingFee { native_fee: workers_fee, zro_fee: treasury_fee }
@@ -40,28 +59,41 @@ impl ISendLib for Uln302 {
40
59
  fn send(env: &Env, packet: &OutboundPacket, options: &Bytes, pay_in_zro: bool) -> FeesAndPacket {
41
60
  Self::endpoint(env).require_auth();
42
61
 
43
- let mut native_fee_recipients = vec![env];
44
- let mut zro_fee_recipients = vec![env];
45
- let (executor_options, dvn_options) = worker_options::split_worker_options(env, options);
62
+ let (executor_options, dvn_options, packet_header, payload_hash) =
63
+ prepare_packet_and_options(env, packet, options);
46
64
 
47
65
  // Executor fee
48
66
  let executor_fee_recipient =
49
67
  Self::assign_executor(env, &packet.sender, packet.dst_eid, packet.message.len(), &executor_options);
50
- native_fee_recipients.push_back(executor_fee_recipient);
51
68
 
52
69
  // DVNs fees
53
- let packet_header = packet_codec_v1::encode_packet_header(env, packet);
54
- let payload_hash = packet_codec_v1::payload_hash(env, packet);
55
70
  let dvns_fee_recipients =
56
71
  Self::assign_dvns(env, &packet.sender, packet.dst_eid, &packet_header, &payload_hash, &dvn_options);
72
+
73
+ // Collect all worker fees
74
+ let mut native_fee_recipients = vec![env, executor_fee_recipient];
57
75
  native_fee_recipients.extend(dvns_fee_recipients.iter());
58
76
 
59
77
  // Treasury fee
60
- let workers_fee = native_fee_recipients.iter().map(|fee| fee.amount).sum();
61
- let treasury_fee =
62
- Self::get_treasury_client(env).get_fee(&packet.sender, &packet.dst_eid, &workers_fee, &pay_in_zro);
78
+ let total_worker_fee = native_fee_recipients.iter().map(|fee| fee.amount).sum();
79
+ let treasury_addr = Self::treasury(env);
80
+ let treasury_fee = LayerZeroTreasuryClient::new(env, &treasury_addr).get_fee(
81
+ &packet.sender,
82
+ &packet.dst_eid,
83
+ &total_worker_fee,
84
+ &pay_in_zro,
85
+ );
86
+
87
+ // Handle ZRO fee recipients
88
+ let mut zro_fee_recipients = vec![env];
63
89
  if treasury_fee > 0 {
64
- let treasury_fee_recipient = FeeRecipient { to: Self::treasury(env), amount: treasury_fee };
90
+ // The treasury contract address is used as the fixed fee recipient (rather than allowing
91
+ // the treasury admin to configure a custom receiver). This is because ZRO may be issued
92
+ // as a Stellar Classic Asset, which requires the recipient to have an established trustline.
93
+ // If an arbitrary receiver could be configured, a malicious treasury admin could set it to
94
+ // an address without a trustline, causing all token transfers to fail and effectively
95
+ // DOSing the OApp. Using the contract address ensures the recipient is always valid.
96
+ let treasury_fee_recipient = FeeRecipient { to: treasury_addr, amount: treasury_fee };
65
97
  if pay_in_zro {
66
98
  zro_fee_recipients.push_back(treasury_fee_recipient);
67
99
  } else {
@@ -84,23 +116,23 @@ impl ISendLib for Uln302 {
84
116
  #[contract_impl]
85
117
  impl ISendUln302 for Uln302 {
86
118
  /// Sets default executor configurations for multiple destination endpoints.
87
- #[only_owner]
119
+ #[only_auth]
88
120
  fn set_default_executor_configs(env: &Env, params: &Vec<SetDefaultExecutorConfigParam>) {
89
121
  for param in params {
90
122
  param.config.validate_default_config(env);
91
123
  UlnStorage::set_default_executor_configs(env, param.dst_eid, &param.config);
92
124
  }
93
- DefaultExecutorConfigSet { params: params.clone() }.publish(env);
125
+ DefaultExecutorConfigsSet { params: params.clone() }.publish(env);
94
126
  }
95
127
 
96
128
  /// Sets default send ULN configurations for multiple destination endpoints.
97
- #[only_owner]
129
+ #[only_auth]
98
130
  fn set_default_send_uln_configs(env: &Env, params: &Vec<SetDefaultUlnConfigParam>) {
99
131
  for param in params {
100
132
  param.config.validate_default_config(env);
101
133
  UlnStorage::set_default_send_uln_configs(env, param.eid, &param.config);
102
134
  }
103
- DefaultUlnSendConfigSet { params: params.clone() }.publish(env);
135
+ DefaultSendUlnConfigsSet { params: params.clone() }.publish(env);
104
136
  }
105
137
 
106
138
  // ============================================================================================
@@ -109,6 +141,7 @@ impl ISendUln302 for Uln302 {
109
141
 
110
142
  /// Returns the treasury address for fee collection.
111
143
  fn treasury(env: &Env) -> Address {
144
+ // This is safe because the treasury is set in the constructor.
112
145
  UlnStorage::treasury(env).unwrap()
113
146
  }
114
147
 
@@ -124,7 +157,8 @@ impl ISendUln302 for Uln302 {
124
157
 
125
158
  /// Returns the effective executor configuration by merging OApp config with default.
126
159
  fn effective_executor_config(env: &Env, sender: &Address, dst_eid: u32) -> ExecutorConfig {
127
- let default_config = Self::expect_default_executor_config(env, dst_eid);
160
+ let default_config = Self::default_executor_config(env, dst_eid)
161
+ .unwrap_or_panic(env, Uln302Error::DefaultExecutorConfigNotFound);
128
162
  let oapp_config = Self::oapp_executor_config(env, sender, dst_eid).unwrap_or_default();
129
163
 
130
164
  oapp_config.apply_default_config(&default_config)
@@ -142,13 +176,14 @@ impl ISendUln302 for Uln302 {
142
176
 
143
177
  /// Returns the effective send ULN configuration by merging OApp config with default.
144
178
  fn effective_send_uln_config(env: &Env, sender: &Address, dst_eid: u32) -> UlnConfig {
145
- let default_config = Self::expect_default_send_uln_config(env, dst_eid);
179
+ let default_config =
180
+ Self::default_send_uln_config(env, dst_eid).unwrap_or_panic(env, Uln302Error::DefaultSendUlnConfigNotFound);
146
181
  let oapp_config = Self::oapp_send_uln_config(env, sender, dst_eid).unwrap_or(OAppUlnConfig::default(env));
147
182
 
148
- let config = oapp_config.apply_default_config(&default_config);
149
- config.validate_at_least_one_dvn(env); // validate the final config
183
+ let effective_config = oapp_config.apply_default_config(&default_config);
184
+ effective_config.validate_at_least_one_dvn(env); // validate the final config
150
185
 
151
- config
186
+ effective_config
152
187
  }
153
188
  }
154
189
 
@@ -158,11 +193,6 @@ impl ISendUln302 for Uln302 {
158
193
 
159
194
  impl Uln302 {
160
195
  /// Sets OApp-specific executor configuration for a destination endpoint.
161
- ///
162
- /// # Arguments
163
- /// * `sender` - The sender OApp address
164
- /// * `dst_eid` - The destination endpoint ID
165
- /// * `config` - The OApp-specific executor configuration
166
196
  pub(super) fn set_executor_config(env: &Env, sender: &Address, dst_eid: u32, config: &OAppExecutorConfig) {
167
197
  UlnStorage::set_oapp_executor_configs(env, sender, dst_eid, config);
168
198
  ExecutorConfigSet { sender: sender.clone(), dst_eid, config: config.clone() }.publish(env);
@@ -170,12 +200,6 @@ impl Uln302 {
170
200
 
171
201
  /// Sets OApp-specific send ULN configuration for a destination endpoint.
172
202
  ///
173
- /// # Arguments
174
- /// * `sender` - The sender OApp address
175
- /// * `dst_eid` - The destination endpoint ID
176
- /// * `config` - The OApp-specific send ULN configuration
177
- ///
178
- /// # Panics
179
203
  /// Panics if the final effective config is invalid.
180
204
  pub(super) fn set_send_uln_config(env: &Env, sender: &Address, dst_eid: u32, config: &OAppUlnConfig) {
181
205
  config.validate_oapp_config(env);
@@ -184,7 +208,7 @@ impl Uln302 {
184
208
  // validate the config by getting the effective config
185
209
  let _ = Self::effective_send_uln_config(env, sender, dst_eid);
186
210
 
187
- UlnSendConfigSet { sender: sender.clone(), dst_eid, config: config.clone() }.publish(env);
211
+ SendUlnConfigSet { sender: sender.clone(), dst_eid, config: config.clone() }.publish(env);
188
212
  }
189
213
 
190
214
  // ============================================================================================
@@ -192,31 +216,16 @@ impl Uln302 {
192
216
  // ============================================================================================
193
217
 
194
218
  /// Quotes the executor fee for message execution.
195
- ///
196
- /// # Arguments
197
- /// * `sender` - The sender OApp address
198
- /// * `dst_eid` - The destination endpoint ID
199
- /// * `message_length` - The length of the message
200
- /// * `options` - The worker options
201
- ///
202
- /// # Returns
203
- /// The executor fee
204
219
  fn quote_executor(env: &Env, sender: &Address, dst_eid: u32, message_length: u32, options: &Bytes) -> i128 {
205
- let executor = Self::get_validated_executor_client(env, sender, dst_eid, message_length);
206
- executor.get_fee(&env.current_contract_address(), sender, &dst_eid, &message_length, options)
220
+ // Get the effective executor config and validate message size
221
+ let executor_config = Self::effective_executor_config(env, sender, dst_eid);
222
+ assert_with_error!(env, message_length <= executor_config.max_message_size, Uln302Error::InvalidMessageSize);
223
+
224
+ let executor_client = LayerZeroExecutorClient::new(env, &executor_config.executor);
225
+ executor_client.get_fee(&env.current_contract_address(), sender, &dst_eid, &message_length, options)
207
226
  }
208
227
 
209
228
  /// Quotes the total DVN fees for message verification.
210
- ///
211
- /// # Arguments
212
- /// * `sender` - The sender OApp address
213
- /// * `dst_eid` - The destination endpoint ID
214
- /// * `packet_header` - The raw packet header bytes
215
- /// * `payload_hash` - The hash of the message payload
216
- /// * `dvn_options` - The worker options for each DVN
217
- ///
218
- /// # Returns
219
- /// The total DVN fees
220
229
  fn quote_dvns(
221
230
  env: &Env,
222
231
  sender: &Address,
@@ -228,19 +237,17 @@ impl Uln302 {
228
237
  let uln_config = Self::effective_send_uln_config(env, sender, dst_eid);
229
238
  let send_lib = env.current_contract_address();
230
239
  let confirmations = uln_config.confirmations;
231
-
232
- let get_dvn_fee = |idx: usize, dvn_addr: Address| {
233
- let dvn_client = LayerZeroDVNClient::new(env, &dvn_addr);
234
- let dvn_opts = dvn_options.get(idx as u32).unwrap_or(bytes!(env));
235
- dvn_client.get_fee(&send_lib, sender, &dst_eid, packet_header, payload_hash, &confirmations, &dvn_opts)
236
- };
237
-
238
240
  uln_config
239
241
  .required_dvns
240
242
  .iter()
241
243
  .chain(uln_config.optional_dvns.iter())
242
244
  .enumerate()
243
- .fold(0_i128, |total_fee, (idx, dvn_addr)| total_fee + get_dvn_fee(idx, dvn_addr))
245
+ .map(|(idx, dvn_addr)| {
246
+ let dvn_client = LayerZeroDVNClient::new(env, &dvn_addr);
247
+ let dvn_opts = dvn_options.get(idx as u32).unwrap_or(bytes!(env));
248
+ dvn_client.get_fee(&send_lib, sender, &dst_eid, packet_header, payload_hash, &confirmations, &dvn_opts)
249
+ })
250
+ .sum()
244
251
  }
245
252
 
246
253
  // ============================================================================================
@@ -248,15 +255,6 @@ impl Uln302 {
248
255
  // ============================================================================================
249
256
 
250
257
  /// Assigns an executor job and returns the fee recipient.
251
- ///
252
- /// # Arguments
253
- /// * `sender` - The sender OApp address
254
- /// * `dst_eid` - The destination endpoint ID
255
- /// * `message_length` - The length of the message
256
- /// * `options` - The worker options
257
- ///
258
- /// # Returns
259
- /// The fee recipient
260
258
  fn assign_executor(
261
259
  env: &Env,
262
260
  sender: &Address,
@@ -264,25 +262,19 @@ impl Uln302 {
264
262
  message_length: u32,
265
263
  options: &Bytes,
266
264
  ) -> FeeRecipient {
267
- let executor = Self::get_validated_executor_client(env, sender, dst_eid, message_length);
265
+ // Get the effective executor config and validate message size
266
+ let executor_config = Self::effective_executor_config(env, sender, dst_eid);
267
+ assert_with_error!(env, message_length <= executor_config.max_message_size, Uln302Error::InvalidMessageSize);
268
+
269
+ let executor_client = LayerZeroExecutorClient::new(env, &executor_config.executor);
268
270
  let recipient =
269
- executor.assign_job(&env.current_contract_address(), sender, &dst_eid, &message_length, options);
271
+ executor_client.assign_job(&env.current_contract_address(), sender, &dst_eid, &message_length, options);
270
272
 
271
- ExecutorFeePaid { executor: executor.address.clone(), fee: recipient.clone() }.publish(env);
273
+ ExecutorFeePaid { executor: executor_client.address.clone(), fee: recipient.clone() }.publish(env);
272
274
  recipient
273
275
  }
274
276
 
275
277
  /// Assigns DVN jobs and returns fee recipients for all DVNs.
276
- ///
277
- /// # Arguments
278
- /// * `sender` - The sender OApp address
279
- /// * `dst_eid` - The destination endpoint ID
280
- /// * `packet_header` - The raw packet header bytes
281
- /// * `payload_hash` - The hash of the message payload
282
- /// * `dvn_options` - The worker options for each DVN
283
- ///
284
- /// # Returns
285
- /// The fee recipients for all DVNs
286
278
  fn assign_dvns(
287
279
  env: &Env,
288
280
  sender: &Address,
@@ -295,61 +287,43 @@ impl Uln302 {
295
287
  let send_lib = env.current_contract_address();
296
288
  let confirmations = uln_config.confirmations;
297
289
 
298
- let assign_dvn_job = |idx: usize, dvn_addr: &Address| -> FeeRecipient {
299
- let dvn_client = LayerZeroDVNClient::new(env, dvn_addr);
290
+ let mut dvns = vec![env];
291
+ let mut fees = vec![env];
292
+ for (idx, dvn_addr) in uln_config.required_dvns.iter().chain(uln_config.optional_dvns.iter()).enumerate() {
293
+ let dvn_client = LayerZeroDVNClient::new(env, &dvn_addr);
300
294
  let dvn_opts = dvn_options.get(idx as u32).unwrap_or(bytes!(env));
301
- dvn_client.assign_job(&send_lib, sender, &dst_eid, packet_header, payload_hash, &confirmations, &dvn_opts)
302
- };
303
-
304
- let (dvns, fees) = uln_config.required_dvns.iter().chain(uln_config.optional_dvns.iter()).enumerate().fold(
305
- (vec![env], vec![env]),
306
- |(mut dvns, mut fees), (idx, dvn_addr)| {
307
- fees.push_back(assign_dvn_job(idx, &dvn_addr));
308
- dvns.push_back(dvn_addr);
309
- (dvns, fees)
310
- },
311
- );
295
+ let dvn_fee_recipient = dvn_client.assign_job(
296
+ &send_lib,
297
+ sender,
298
+ &dst_eid,
299
+ packet_header,
300
+ payload_hash,
301
+ &confirmations,
302
+ &dvn_opts,
303
+ );
304
+ fees.push_back(dvn_fee_recipient);
305
+ dvns.push_back(dvn_addr);
306
+ }
312
307
 
313
308
  DVNFeePaid { dvns, fees: fees.clone() }.publish(env);
314
309
  fees
315
310
  }
311
+ }
316
312
 
317
- // ============================================================================================
318
- // Helper Functions
319
- // ============================================================================================
320
-
321
- /// Gets a validated executor client, ensuring message size is within limits.
322
- ///
323
- /// # Arguments
324
- /// * `sender` - The sender OApp address
325
- /// * `dst_eid` - The destination endpoint ID
326
- /// * `message_length` - The length of the message
327
- ///
328
- /// # Returns
329
- /// The executor client
330
- fn get_validated_executor_client(
331
- env: &Env,
332
- sender: &Address,
333
- dst_eid: u32,
334
- message_length: u32,
335
- ) -> LayerZeroExecutorClient<'static> {
336
- let executor_config = Self::effective_executor_config(env, sender, dst_eid);
337
- assert_with_error!(env, message_length <= executor_config.max_message_size, Uln302Error::InvalidMessageSize);
338
- LayerZeroExecutorClient::new(env, &executor_config.executor)
339
- }
340
-
341
- /// Returns the treasury client.
342
- fn get_treasury_client(env: &Env) -> LayerZeroTreasuryClient<'static> {
343
- LayerZeroTreasuryClient::new(env, &Self::treasury(env))
344
- }
345
-
346
- /// Returns the default executor config or panics if not found.
347
- fn expect_default_executor_config(env: &Env, dst_eid: u32) -> ExecutorConfig {
348
- Self::default_executor_config(env, dst_eid).unwrap_or_panic(env, Uln302Error::DefaultExecutorConfigNotFound)
349
- }
313
+ // ==============================================================================
314
+ // Helper Functions
315
+ // ==============================================================================
350
316
 
351
- /// Returns the default send ULN config or panics if not found.
352
- fn expect_default_send_uln_config(env: &Env, dst_eid: u32) -> UlnConfig {
353
- Self::default_send_uln_config(env, dst_eid).unwrap_or_panic(env, Uln302Error::DefaultSendUlnConfigNotFound)
354
- }
317
+ /// Prepares common packet and options needed for both quote and send flows.
318
+ ///
319
+ /// Returns a tuple of (executor_options, dvn_options, packet_header, payload_hash)
320
+ fn prepare_packet_and_options(
321
+ env: &Env,
322
+ packet: &OutboundPacket,
323
+ options: &Bytes,
324
+ ) -> (Bytes, Map<u32, Bytes>, Bytes, BytesN<32>) {
325
+ let (executor_options, dvn_options) = worker_options::split_worker_options(env, options);
326
+ let packet_header = packet_codec_v1::encode_packet_header(env, packet);
327
+ let payload_hash = packet_codec_v1::payload_hash(env, packet);
328
+ (executor_options, dvn_options, packet_header, payload_hash)
355
329
  }
@@ -25,6 +25,11 @@ pub enum UlnStorage {
25
25
  #[persistent(UlnConfig)]
26
26
  DefaultReceiveUlnConfigs { src_eid: u32 },
27
27
 
28
+ /// The OApp-specific executor configurations for a sender and destination endpoint
29
+ #[persistent(OAppExecutorConfig)]
30
+ #[name("oapp_executor_configs")]
31
+ OAppExecutorConfigs { sender: Address, dst_eid: u32 },
32
+
28
33
  /// The OApp-specific send ULN configurations for a sender and destination endpoint
29
34
  #[persistent(OAppUlnConfig)]
30
35
  #[name("oapp_send_uln_configs")]
@@ -35,11 +40,6 @@ pub enum UlnStorage {
35
40
  #[name("oapp_receive_uln_configs")]
36
41
  OAppReceiveUlnConfigs { receiver: Address, src_eid: u32 },
37
42
 
38
- /// The OApp-specific executor configurations for a sender and destination endpoint
39
- #[persistent(OAppExecutorConfig)]
40
- #[name("oapp_executor_configs")]
41
- OAppExecutorConfigs { sender: Address, dst_eid: u32 },
42
-
43
43
  /// The confirmations for a DVN for a given header hash and payload hash
44
44
  #[persistent(u64)]
45
45
  Confirmations { dvn: Address, header_hash: BytesN<32>, payload_hash: BytesN<32> },
@@ -1,7 +1,7 @@
1
1
  extern crate std;
2
2
  use crate::{
3
3
  errors::Uln302Error,
4
- events::UlnReceiveConfigSet,
4
+ events::ReceiveUlnConfigSet,
5
5
  interfaces::{OAppUlnConfig, UlnConfig},
6
6
  tests::setup::{setup, TestSetup},
7
7
  uln302::CONFIG_TYPE_RECEIVE_ULN,
@@ -35,8 +35,7 @@ fn test_effective_receive_uln_config_with_custom_config() {
35
35
  let default_config = UlnConfig::generate(&setup.env, 15, 1, 2, 1);
36
36
  let eid = 101;
37
37
 
38
- setup.set_default_send_uln_config(eid, default_config.clone());
39
- setup.set_default_receive_uln_config(eid, default_config.clone());
38
+ setup.set_default_configs(eid, default_config.clone());
40
39
 
41
40
  let TestSetup { env, uln302, endpoint, .. } = setup;
42
41
 
@@ -57,11 +56,11 @@ fn test_effective_receive_uln_config_with_custom_config() {
57
56
  let params = vec![&env, SetConfigParam { eid, config_type: CONFIG_TYPE_RECEIVE_ULN, config: config_bytes }];
58
57
  endpoint.set_config(&Address::generate(&env), &oapp, &uln302.address, &params);
59
58
 
60
- // Assert UlnReceiveConfigSet event was published immediately after the setter
59
+ // Assert ReceiveUlnConfigSet event was published immediately after the setter
61
60
  assert_event(
62
61
  &env,
63
62
  &uln302.address,
64
- UlnReceiveConfigSet { config: custom_config.clone(), receiver: oapp.clone(), src_eid: eid },
63
+ ReceiveUlnConfigSet { config: custom_config.clone(), receiver: oapp.clone(), src_eid: eid },
65
64
  );
66
65
 
67
66
  let config = uln302.effective_receive_uln_config(&oapp, &eid);
@@ -77,8 +76,7 @@ fn test_effective_receive_uln_config_must_have_at_least_one_dvn() {
77
76
  let default_config = UlnConfig::generate(&setup.env, 10, 1, 0, 0);
78
77
  let eid = 101;
79
78
 
80
- setup.set_default_receive_uln_config(eid, default_config.clone());
81
- setup.set_default_send_uln_config(eid, default_config);
79
+ setup.set_default_configs(eid, default_config.clone());
82
80
 
83
81
  let TestSetup { env, uln302, endpoint, .. } = setup;
84
82
 
@@ -1,7 +1,7 @@
1
1
  extern crate std;
2
2
  use crate::{
3
3
  errors::Uln302Error,
4
- events::DefaultUlnReceiveConfigSet,
4
+ events::DefaultReceiveUlnConfigsSet,
5
5
  interfaces::{ReceiveUln302Client, SetDefaultUlnConfigParam, UlnConfig},
6
6
  tests::setup::{setup, TestSetup},
7
7
  };
@@ -32,8 +32,8 @@ fn test_set_default_receive_uln_configs() {
32
32
  }]);
33
33
  uln302.set_default_receive_uln_configs(&oapp_receive_uln_configs);
34
34
 
35
- // Assert DefaultUlnReceiveConfigSet event was published with all params
36
- assert_event(&env, &uln302.address, DefaultUlnReceiveConfigSet { params: oapp_receive_uln_configs.clone() });
35
+ // Assert DefaultReceiveUlnConfigSet event was published with all params
36
+ assert_event(&env, &uln302.address, DefaultReceiveUlnConfigsSet { params: oapp_receive_uln_configs.clone() });
37
37
 
38
38
  let uln302_receive_client = ReceiveUln302Client::new(&env, &uln302.address);
39
39
  for config in oapp_receive_uln_configs.clone() {
@@ -2,7 +2,7 @@ extern crate std;
2
2
 
3
3
  use crate::{
4
4
  errors::Uln302Error,
5
- events::UlnSendConfigSet,
5
+ events::SendUlnConfigSet,
6
6
  interfaces::{OAppUlnConfig, UlnConfig},
7
7
  tests::setup::{setup, TestSetup},
8
8
  uln302::CONFIG_TYPE_SEND_ULN,
@@ -20,8 +20,7 @@ fn test_effective_send_uln_config_with_default_only() {
20
20
  let default_config = UlnConfig::generate(&setup.env, 10, 2, 3, 2);
21
21
  let eid = 100;
22
22
 
23
- setup.set_default_send_uln_config(eid, default_config.clone());
24
- setup.set_default_receive_uln_config(eid, default_config.clone());
23
+ setup.set_default_configs(eid, default_config.clone());
25
24
 
26
25
  let TestSetup { env, uln302, .. } = setup;
27
26
 
@@ -40,8 +39,7 @@ fn test_effective_send_uln_config_with_custom_config() {
40
39
  let default_config = UlnConfig::generate(&setup.env, 10, 2, 3, 2);
41
40
  let eid = 100;
42
41
 
43
- setup.set_default_send_uln_config(eid, default_config.clone());
44
- setup.set_default_receive_uln_config(eid, default_config.clone());
42
+ setup.set_default_configs(eid, default_config.clone());
45
43
 
46
44
  let TestSetup { env, uln302, endpoint, .. } = setup;
47
45
 
@@ -66,11 +64,11 @@ fn test_effective_send_uln_config_with_custom_config() {
66
64
  let params = vec![&env, SetConfigParam { eid, config_type: CONFIG_TYPE_SEND_ULN, config: config_bytes }];
67
65
  endpoint.set_config(&Address::generate(&env), &oapp, &uln302.address, &params);
68
66
 
69
- // Assert UlnSendConfigSet event was published immediately after the setter
67
+ // Assert SendUlnConfigSet event was published immediately after the setter
70
68
  assert_event(
71
69
  &env,
72
70
  &uln302.address,
73
- UlnSendConfigSet { config: custom_config.clone(), dst_eid: eid, sender: oapp.clone() },
71
+ SendUlnConfigSet { config: custom_config.clone(), dst_eid: eid, sender: oapp.clone() },
74
72
  );
75
73
 
76
74
  // Get aggregated config - should have custom confirmations but default DVNs
@@ -89,8 +87,7 @@ fn test_effective_send_uln_config_must_have_at_least_one_dvn() {
89
87
  let default_config = UlnConfig::generate(&setup.env, 10, 2, 0, 0);
90
88
  let eid = 100;
91
89
 
92
- setup.set_default_send_uln_config(eid, default_config.clone());
93
- setup.set_default_receive_uln_config(eid, default_config);
90
+ setup.set_default_configs(eid, default_config.clone());
94
91
 
95
92
  let TestSetup { env, uln302, endpoint, .. } = setup;
96
93
 
@@ -7,7 +7,7 @@ use utils::testing_utils::assert_event;
7
7
 
8
8
  use crate::{
9
9
  errors::Uln302Error,
10
- events::DefaultExecutorConfigSet,
10
+ events::DefaultExecutorConfigsSet,
11
11
  interfaces::{ExecutorConfig, SendUln302Client, SetDefaultExecutorConfigParam},
12
12
  tests::setup::{setup, TestSetup},
13
13
  };
@@ -44,7 +44,7 @@ fn test_set_default_executor_configs() {
44
44
  uln302.set_default_executor_configs(&executor_configs);
45
45
 
46
46
  // Assert DefaultExecutorConfigSet event was published with all params
47
- assert_event(&env, &uln302.address, DefaultExecutorConfigSet { params: executor_configs.clone() });
47
+ assert_event(&env, &uln302.address, DefaultExecutorConfigsSet { params: executor_configs.clone() });
48
48
 
49
49
  let uln302_send_client = SendUln302Client::new(&env, &uln302.address);
50
50
  for config_param in executor_configs.clone() {
@@ -7,7 +7,7 @@ use utils::testing_utils::assert_event;
7
7
 
8
8
  use crate::{
9
9
  errors::Uln302Error,
10
- events::DefaultUlnSendConfigSet,
10
+ events::DefaultSendUlnConfigsSet,
11
11
  interfaces::{SendUln302Client, SetDefaultUlnConfigParam, UlnConfig},
12
12
  tests::setup::{setup, TestSetup},
13
13
  };
@@ -33,8 +33,8 @@ fn test_set_default_send_uln_configs() {
33
33
  }]);
34
34
  uln302.set_default_send_uln_configs(&oapp_send_uln_configs);
35
35
 
36
- // Assert DefaultUlnSendConfigSet event was published with all params
37
- assert_event(&env, &uln302.address, DefaultUlnSendConfigSet { params: oapp_send_uln_configs.clone() });
36
+ // Assert DefaultSendUlnConfigSet event was published with all params
37
+ assert_event(&env, &uln302.address, DefaultSendUlnConfigsSet { params: oapp_send_uln_configs.clone() });
38
38
 
39
39
  let uln302_send_client = SendUln302Client::new(&env, &uln302.address);
40
40
  for config in oapp_send_uln_configs.clone() {
@@ -253,6 +253,15 @@ impl<'a> TestSetup<'a> {
253
253
  self.uln302.set_default_executor_configs(&params);
254
254
  }
255
255
 
256
+ /// Sets all three default configs (executor, send ULN, receive ULN) for an EID.
257
+ /// This is required for `is_supported_eid` to return true.
258
+ pub fn set_default_configs(&self, eid: u32, uln_config: UlnConfig) {
259
+ let executor_config = ExecutorConfig::generate(&self.env, 10000);
260
+ self.set_default_executor_config(eid, executor_config);
261
+ self.set_default_send_uln_config(eid, uln_config.clone());
262
+ self.set_default_receive_uln_config(eid, uln_config);
263
+ }
264
+
256
265
  pub fn register_executor(&mut self, fee: i128) -> Address {
257
266
  let executor = self.env.register(DummyExecutor, (fee,));
258
267
  self.executors.push_back(executor.clone());
@@ -44,4 +44,9 @@ impl ExecutorConfig {
44
44
  pub fn new(max_message_size: u32, executor: &Address) -> Self {
45
45
  ExecutorConfig { max_message_size, executor: executor.clone() }
46
46
  }
47
+
48
+ pub fn generate(env: &Env, max_message_size: u32) -> Self {
49
+ use soroban_sdk::testutils::Address as _;
50
+ ExecutorConfig { max_message_size, executor: Address::generate(env) }
51
+ }
47
52
  }
@@ -15,8 +15,7 @@ fn test_get_oapp_receive_uln_config() {
15
15
  let default_config = UlnConfig::generate(&setup.env, 15, 1, 2, 1);
16
16
  let eid = 101;
17
17
 
18
- setup.set_default_send_uln_config(eid, default_config.clone());
19
- setup.set_default_receive_uln_config(eid, default_config);
18
+ setup.set_default_configs(eid, default_config);
20
19
 
21
20
  let TestSetup { env, uln302, endpoint, .. } = setup;
22
21
 
@@ -15,8 +15,7 @@ fn test_get_oapp_send_uln_config() {
15
15
  let default_config = UlnConfig::generate(&setup.env, 10, 2, 3, 2);
16
16
  let eid = 100;
17
17
 
18
- setup.set_default_send_uln_config(eid, default_config.clone());
19
- setup.set_default_receive_uln_config(eid, default_config);
18
+ setup.set_default_configs(eid, default_config);
20
19
 
21
20
  let TestSetup { env, uln302, endpoint, .. } = setup;
22
21