@layerzerolabs/protocol-stellar-v2 0.2.22 → 0.2.23

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 (328) hide show
  1. package/.turbo/turbo-build.log +347 -271
  2. package/.turbo/turbo-lint.log +277 -208
  3. package/.turbo/turbo-test.log +1700 -1370
  4. package/Cargo.lock +22 -51
  5. package/Cargo.toml +6 -1
  6. package/contracts/common-macros/src/auth.rs +10 -9
  7. package/contracts/common-macros/src/contract_ttl.rs +1 -4
  8. package/contracts/common-macros/src/error.rs +1 -3
  9. package/contracts/common-macros/src/lib.rs +65 -61
  10. package/contracts/common-macros/src/storage.rs +212 -65
  11. package/contracts/common-macros/src/tests/auth.rs +75 -6
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
  13. package/contracts/common-macros/src/tests/error.rs +9 -21
  14. package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
  15. package/contracts/common-macros/src/tests/mod.rs +2 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  22. package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
  23. package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
  24. package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
  25. package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
  26. package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
  27. package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
  28. package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
  29. package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
  30. package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
  31. package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
  32. package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
  33. package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  34. package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
  35. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  36. package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
  37. package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
  38. package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
  39. package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
  40. package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
  41. package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
  42. package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
  43. package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
  44. package/contracts/common-macros/src/ttl_configurable.rs +1 -4
  45. package/contracts/common-macros/src/upgradeable.rs +21 -3
  46. package/contracts/endpoint-v2/Cargo.toml +0 -4
  47. package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
  48. package/contracts/endpoint-v2/src/errors.rs +26 -1
  49. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
  50. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
  51. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  52. package/contracts/endpoint-v2/src/lib.rs +0 -1
  53. package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
  54. package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
  55. package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
  56. package/contracts/endpoint-v2/src/storage.rs +9 -1
  57. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  58. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
  59. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
  65. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
  66. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
  67. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
  68. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
  70. package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
  71. package/contracts/layerzero-views/src/tests/mod.rs +1 -0
  72. package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
  73. package/contracts/layerzero-views/src/types.rs +2 -3
  74. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
  75. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
  76. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
  77. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
  78. package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
  79. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
  80. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
  81. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
  82. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
  83. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
  84. package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
  85. package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
  86. package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
  87. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
  88. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
  89. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
  90. package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
  91. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
  92. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
  93. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
  94. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
  95. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
  96. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
  97. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
  98. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
  99. package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
  100. package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
  101. package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
  102. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  103. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
  104. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
  105. package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
  106. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
  107. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
  108. package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
  109. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
  110. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
  111. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
  112. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
  113. package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
  114. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
  115. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
  117. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
  118. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
  119. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
  121. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
  124. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
  125. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
  126. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
  127. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
  128. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
  129. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
  130. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
  131. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
  132. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
  133. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
  134. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
  135. package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
  136. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
  137. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
  141. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
  158. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
  159. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
  160. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
  161. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
  163. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
  164. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
  165. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
  166. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
  167. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
  168. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
  169. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
  170. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
  171. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
  172. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
  173. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
  174. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
  175. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
  176. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
  177. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
  178. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
  179. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
  180. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
  181. package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
  182. package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
  183. package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
  184. package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
  185. package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
  186. package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
  187. package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
  188. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
  189. package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
  190. package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
  191. package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
  192. package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
  193. package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
  194. package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
  195. package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
  196. package/contracts/message-libs/uln-302/src/errors.rs +21 -0
  197. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
  198. package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
  199. package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
  200. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  201. package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
  202. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
  203. package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
  204. package/contracts/oapps/counter/Cargo.toml +2 -0
  205. package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
  206. package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
  207. package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
  208. package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
  209. package/contracts/oapps/counter/src/tests/mod.rs +1 -0
  210. package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
  211. package/contracts/oapps/oapp/src/lib.rs +0 -3
  212. package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
  213. package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
  214. package/contracts/oapps/oft/src/lib.rs +3 -0
  215. package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
  216. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
  217. package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
  218. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
  219. package/contracts/oapps/oft/src/tests/mod.rs +2 -0
  220. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
  221. package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
  222. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
  223. package/contracts/oapps/oft-core/src/lib.rs +2 -2
  224. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
  225. package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
  226. package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
  227. package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
  228. package/contracts/utils/src/auth.rs +2 -2
  229. package/contracts/utils/src/buffer_reader.rs +61 -10
  230. package/contracts/utils/src/buffer_writer.rs +35 -20
  231. package/contracts/utils/src/bytes_ext.rs +1 -2
  232. package/contracts/utils/src/errors.rs +5 -3
  233. package/contracts/utils/src/multisig.rs +59 -36
  234. package/contracts/utils/src/option_ext.rs +3 -3
  235. package/contracts/utils/src/ownable.rs +12 -6
  236. package/contracts/utils/src/tests/auth.rs +179 -0
  237. package/contracts/utils/src/tests/buffer_reader.rs +203 -1
  238. package/contracts/utils/src/tests/buffer_writer.rs +176 -5
  239. package/contracts/utils/src/tests/mod.rs +2 -0
  240. package/contracts/utils/src/tests/multisig.rs +170 -141
  241. package/contracts/utils/src/tests/option_ext.rs +1 -1
  242. package/contracts/utils/src/tests/ownable.rs +156 -161
  243. package/contracts/utils/src/tests/test_helper.rs +21 -1
  244. package/contracts/utils/src/tests/testing_utils.rs +84 -2
  245. package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
  246. package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
  247. package/contracts/utils/src/tests/upgradeable.rs +115 -6
  248. package/contracts/utils/src/ttl_configurable.rs +22 -12
  249. package/contracts/utils/src/ttl_extendable.rs +1 -3
  250. package/contracts/utils/src/upgradeable.rs +21 -24
  251. package/contracts/workers/dvn/src/auth.rs +1 -1
  252. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  253. package/contracts/workers/dvn/src/storage.rs +1 -1
  254. package/contracts/workers/dvn/src/tests/auth.rs +136 -3
  255. package/contracts/workers/dvn/src/tests/mod.rs +0 -1
  256. package/contracts/workers/dvn/src/tests/setup.rs +4 -10
  257. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
  258. package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
  259. package/contracts/workers/worker/src/worker.rs +1 -1
  260. package/docs/oft-guide.md +5 -5
  261. package/package.json +5 -7
  262. package/sdk/.turbo/turbo-test.log +662 -466
  263. package/sdk/LICENSE +23 -0
  264. package/sdk/dist/generated/bml.d.ts +101 -106
  265. package/sdk/dist/generated/bml.js +108 -26
  266. package/sdk/dist/generated/counter.d.ts +123 -484
  267. package/sdk/dist/generated/counter.js +103 -25
  268. package/sdk/dist/generated/dvn.d.ts +141 -699
  269. package/sdk/dist/generated/dvn.js +106 -28
  270. package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
  271. package/sdk/dist/generated/dvn_fee_lib.js +27 -24
  272. package/sdk/dist/generated/endpoint.d.ts +158 -836
  273. package/sdk/dist/generated/endpoint.js +107 -29
  274. package/sdk/dist/generated/executor.d.ts +139 -671
  275. package/sdk/dist/generated/executor.js +106 -28
  276. package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
  277. package/sdk/dist/generated/executor_fee_lib.js +106 -28
  278. package/sdk/dist/generated/executor_helper.d.ts +95 -92
  279. package/sdk/dist/generated/executor_helper.js +103 -25
  280. package/sdk/dist/generated/layerzero_view.d.ts +178 -335
  281. package/sdk/dist/generated/layerzero_view.js +172 -33
  282. package/sdk/dist/generated/oft.d.ts +137 -680
  283. package/sdk/dist/generated/oft.js +103 -25
  284. package/sdk/dist/generated/price_feed.d.ts +45 -444
  285. package/sdk/dist/generated/price_feed.js +27 -24
  286. package/sdk/dist/generated/sml.d.ts +119 -428
  287. package/sdk/dist/generated/sml.js +103 -25
  288. package/sdk/dist/generated/treasury.d.ts +109 -288
  289. package/sdk/dist/generated/treasury.js +103 -25
  290. package/sdk/dist/generated/uln302.d.ts +190 -527
  291. package/sdk/dist/generated/uln302.js +170 -31
  292. package/sdk/dist/generated/upgrader.d.ts +14 -34
  293. package/sdk/dist/generated/upgrader.js +24 -21
  294. package/sdk/package.json +3 -4
  295. package/sdk/test/counter-sml.test.ts +218 -142
  296. package/sdk/test/counter-uln.test.ts +189 -145
  297. package/sdk/test/oft-sml.test.ts +173 -156
  298. package/sdk/test/suites/constants.ts +7 -1
  299. package/sdk/test/suites/globalSetup.ts +140 -74
  300. package/sdk/turbo.json +1 -1
  301. package/tools/ts-bindings-gen/Cargo.toml +4 -4
  302. package/tools/ts-bindings-gen/src/main.rs +4 -0
  303. package/turbo.json +3 -0
  304. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
  305. package/contracts/endpoint-v2/src/constants.rs +0 -52
  306. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
  307. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
  308. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
  309. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
  310. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
  311. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
  312. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
  313. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
  314. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
  315. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
  316. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
  317. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
  318. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
  319. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
  320. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
  321. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
  322. package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
  323. package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
  324. package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
  325. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
  326. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
  327. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
  328. /package/contracts/oapps/oapp/src/{macro_tests → tests}/test_macros.rs +0 -0
@@ -1,33 +1,29 @@
1
- use crate::{
2
- self as utils,
3
- auth::{self, Auth},
4
- errors::UpgradeableError,
5
- option_ext::OptionExt,
6
- };
7
- use common_macros::{contract_trait, storage};
1
+ use crate::{self as utils, auth::Auth, errors::UpgradeableError, option_ext::OptionExt};
2
+ use common_macros::{contract_trait, only_auth, storage};
8
3
  use soroban_sdk::{assert_with_error, xdr::FromXdr, Env};
9
4
 
10
- // ============================================
11
- // Upgradeable Interface
12
- // ============================================
13
-
14
5
  /// Trait for contracts with upgrade and migration support.
6
+ ///
7
+ /// Implements a two-phase upgrade pattern:
8
+ /// 1. `upgrade` - Updates WASM bytecode and sets migration flag
9
+ /// 2. `migrate` - Runs state migration and clears the flag
10
+ ///
11
+ /// Requires implementing [`UpgradeableInternal`] and [`Auth`].
15
12
  #[contract_trait]
16
13
  pub trait Upgradeable: UpgradeableInternal + Auth {
17
- /// The type of data required for migration.
18
14
  /// Upgrades the contract to new WASM bytecode.
19
15
  /// Sets a migration flag that must be cleared by calling `migrate`.
16
+ #[only_auth]
20
17
  fn upgrade(env: &soroban_sdk::Env, new_wasm_hash: &soroban_sdk::BytesN<32>) {
21
- auth::require_auth::<Self>(env);
22
18
  assert_with_error!(env, !Self::is_frozen(env), UpgradeableError::UpgradesFrozen);
23
19
  UpgradeableStorage::set_migrating(env, &true);
24
20
  env.deployer().update_current_contract_wasm(new_wasm_hash.clone());
25
21
  }
26
22
 
27
23
  /// Runs migration logic after an upgrade.
28
- /// Can only be called when the migration flag is set by a previous `upgrade` call.
24
+ /// Parses XDR-encoded `migration_data` and calls `__migrate`. Clears the migration flag on success.
25
+ #[only_auth]
29
26
  fn migrate(env: &soroban_sdk::Env, migration_data: &soroban_sdk::Bytes) {
30
- auth::require_auth::<Self>(env);
31
27
  assert_with_error!(env, UpgradeableStorage::migrating(env), UpgradeableError::MigrationNotAllowed);
32
28
 
33
29
  // Parse the migration data and call the internal migration logic
@@ -40,10 +36,10 @@ pub trait Upgradeable: UpgradeableInternal + Auth {
40
36
  UpgradeableStorage::set_migrating(env, &false);
41
37
  }
42
38
 
43
- /// Permanently freezes the contract, preventing any future upgrades.
44
- /// This action is irreversible.
39
+ /// Permanently freezes the contract, preventing any future upgrades. Irreversible.
40
+ #[only_auth]
45
41
  fn freeze(env: &soroban_sdk::Env) {
46
- auth::require_auth::<Self>(env);
42
+ assert_with_error!(env, !Self::is_frozen(env), UpgradeableError::UpgradesFrozen);
47
43
  UpgradeableStorage::set_frozen(env, &true);
48
44
  }
49
45
 
@@ -54,27 +50,28 @@ pub trait Upgradeable: UpgradeableInternal + Auth {
54
50
  }
55
51
 
56
52
  /// Trait for defining contract-specific migration logic.
57
- /// Contracts using `#[upgradeable]` must implement this trait.
53
+ /// Must be implemented by contracts using [`Upgradeable`].
58
54
  pub trait UpgradeableInternal {
59
- /// The type of data required for migration.
60
- /// This is the type used as the `migration_data` parameter in `Upgradeable::migrate` for this contract.
55
+ /// The XDR-decodable type for migration data. Use `()` if not needed.
61
56
  type MigrationData: FromXdr;
62
57
 
63
- /// Internal migration logic to be implemented by the contract.
58
+ /// Migration logic called by `migrate`. Implement state transformations here.
64
59
  fn __migrate(env: &Env, migration_data: &Self::MigrationData);
65
60
  }
66
61
 
67
62
  // ============================================
68
- // Storage and Helper Functions
63
+ // Storage
69
64
  // ============================================
70
65
 
71
- /// Storage keys for upgrade migration state.
66
+ /// Storage for upgrade state.
72
67
  #[storage]
73
68
  pub enum UpgradeableStorage {
69
+ /// Whether upgrades are permanently disabled.
74
70
  #[instance(bool)]
75
71
  #[default(false)]
76
72
  Frozen,
77
73
 
74
+ /// Whether a migration is pending.
78
75
  #[instance(bool)]
79
76
  #[default(false)]
80
77
  Migrating,
@@ -47,7 +47,7 @@ impl CustomAccountInterface for LzDVN {
47
47
  }
48
48
  DvnStorage::set_used_hash(&env, &hash, &true);
49
49
 
50
- // 4. Multisig verification (most expensive - do last)
50
+ // 4. MultiSig verification (most expensive - do last)
51
51
  Self::verify_signatures(&env, &hash, &signatures);
52
52
 
53
53
  Ok(())
@@ -1,6 +1,6 @@
1
1
  use message_lib_common::interfaces::ILayerZeroDVN;
2
2
  use soroban_sdk::{contractclient, contracttype, Address, BytesN, Env, Symbol, Val, Vec};
3
- use utils::multisig::Multisig;
3
+ use utils::multisig::MultiSig;
4
4
  use worker::Worker;
5
5
 
6
6
  // ============================================================================
@@ -82,7 +82,7 @@ pub struct Call {
82
82
  /// Extends the LayerZero DVN interface with destination configuration management
83
83
  /// and multisig capabilities for secure cross-chain message verification.
84
84
  #[contractclient(name = "DVNClient")]
85
- pub trait IDVN: ILayerZeroDVN + Worker + Multisig {
85
+ pub trait IDVN: ILayerZeroDVN + Worker + MultiSig {
86
86
  /// Sets the configuration for one or more destination chains.
87
87
  ///
88
88
  /// # Arguments
@@ -4,7 +4,7 @@ use soroban_sdk::BytesN;
4
4
 
5
5
  /// DVN contract storage keys.
6
6
  ///
7
- /// Note: Multisig storage (Signers, Threshold) is provided by `utils::multisig::MultisigStorage`.
7
+ /// Note: MultiSig storage (Signers, Threshold) is provided by `utils::multisig::MultiSigStorage`.
8
8
  #[storage]
9
9
  pub enum DvnStorage {
10
10
  /// Verifier ID - unique identifier for this DVN instance.
@@ -134,15 +134,15 @@ fn test_check_auth_wrong_signer_fails() {
134
134
  sender: Sender::Admin(public_key, signature),
135
135
  };
136
136
 
137
- // verify_signatures panics with MultisigError::SignerNotFound when signer is not found
138
- let res = env.try_invoke_contract_check_auth::<utils::errors::MultisigError>(
137
+ // verify_signatures panics with MultiSigError::SignerNotFound when signer is not found
138
+ let res = env.try_invoke_contract_check_auth::<utils::errors::MultiSigError>(
139
139
  &setup.contract_id,
140
140
  &payload,
141
141
  tx_auth.into_val(&env),
142
142
  &auth_contexts,
143
143
  );
144
144
 
145
- assert_eq!(res, Err(Ok(utils::errors::MultisigError::SignerNotFound)));
145
+ assert_eq!(res, Err(Ok(utils::errors::MultiSigError::SignerNotFound)));
146
146
  }
147
147
 
148
148
  #[test]
@@ -265,3 +265,136 @@ fn test_check_auth_hash_already_used_fails() {
265
265
 
266
266
  assert_eq!(res2, Err(Ok(DvnError::HashAlreadyUsed)));
267
267
  }
268
+
269
+ #[test]
270
+ fn test_check_auth_sender_none_fails_when_admin_required() {
271
+ extern crate std;
272
+ use crate::Sender;
273
+
274
+ let setup = TestSetup::new(1);
275
+ let env = setup.env.clone();
276
+ let expiration = env.ledger().timestamp() + 1000;
277
+ let auth_contexts: Vec<Context> = Vec::new(&env);
278
+
279
+ let payload = BytesN::from_array(&env, &[0u8; 32]);
280
+
281
+ let hash = hash_auth_data(&env, VID, expiration, &auth_contexts);
282
+ let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
283
+
284
+ // Use Sender::None which should fail when admin is required
285
+ let tx_auth = TransactionAuthData {
286
+ vid: VID,
287
+ expiration,
288
+ signatures: vec![&env, sig],
289
+ sender: Sender::None,
290
+ };
291
+
292
+ let res = env.try_invoke_contract_check_auth::<DvnError>(
293
+ &setup.contract_id,
294
+ &payload,
295
+ tx_auth.into_val(&env),
296
+ &auth_contexts,
297
+ );
298
+
299
+ assert_eq!(res, Err(Ok(DvnError::OnlyAdmin)));
300
+ }
301
+
302
+ #[test]
303
+ fn test_check_auth_set_admin_bypasses_admin_verification() {
304
+ extern crate std;
305
+ use crate::{Call, LzDVNClient, Sender};
306
+ use soroban_sdk::{auth::ContractContext, Symbol};
307
+
308
+ let setup = TestSetup::new(1);
309
+ let env = setup.env.clone();
310
+ let expiration = env.ledger().timestamp() + 1000;
311
+
312
+ // Create a context for set_admin call on the DVN contract
313
+ let set_admin_context = Context::Contract(ContractContext {
314
+ contract: setup.contract_id.clone(),
315
+ fn_name: Symbol::new(&env, "set_admin"),
316
+ args: Vec::new(&env),
317
+ });
318
+ let auth_contexts: Vec<Context> = vec![&env, set_admin_context.clone()];
319
+
320
+ let payload = BytesN::from_array(&env, &[0u8; 32]);
321
+
322
+ // Create Call structs matching what extract_contract_calls would produce
323
+ let calls: Vec<Call> = vec![
324
+ &env,
325
+ Call {
326
+ to: setup.contract_id.clone(),
327
+ func: Symbol::new(&env, "set_admin"),
328
+ args: Vec::new(&env),
329
+ }
330
+ ];
331
+
332
+ // Use the contract's hash_call_data function directly
333
+ let dvn_client = LzDVNClient::new(&env, &setup.contract_id);
334
+ let hash = dvn_client.hash_call_data(&VID, &expiration, &calls);
335
+ let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
336
+
337
+ // Use Sender::None - should succeed for set_admin since it bypasses admin verification
338
+ let tx_auth = TransactionAuthData {
339
+ vid: VID,
340
+ expiration,
341
+ signatures: vec![&env, sig],
342
+ sender: Sender::None,
343
+ };
344
+
345
+ let res = env.try_invoke_contract_check_auth::<DvnError>(
346
+ &setup.contract_id,
347
+ &payload,
348
+ tx_auth.into_val(&env),
349
+ &auth_contexts,
350
+ );
351
+
352
+ // Should succeed because set_admin bypasses admin verification
353
+ assert!(res.is_ok(), "Expected success for set_admin call, got {:?}", res);
354
+ }
355
+
356
+ #[test]
357
+ fn test_check_auth_non_contract_context_fails() {
358
+ extern crate std;
359
+ use crate::Sender;
360
+ use soroban_sdk::auth::{ContractExecutable, CreateContractHostFnContext};
361
+
362
+ let admin_kp = Ed25519KeyPair::generate();
363
+ let admin_bytes = admin_kp.public_key_bytes();
364
+
365
+ let setup = TestSetup::with_admin_bytes(1, std::vec![admin_bytes]);
366
+ let env = setup.env.clone();
367
+ let expiration = env.ledger().timestamp() + 1000;
368
+
369
+ // Create a non-Contract context (CreateContractHostFn)
370
+ let non_contract_context = Context::CreateContractHostFn(CreateContractHostFnContext {
371
+ executable: ContractExecutable::Wasm(BytesN::from_array(&env, &[0; 32])),
372
+ salt: BytesN::from_array(&env, &[0; 32]),
373
+ });
374
+ let auth_contexts: Vec<Context> = vec![&env, non_contract_context];
375
+
376
+ let payload = BytesN::from_array(&env, &[0u8; 32]);
377
+ let public_key = admin_kp.public_key(&env);
378
+ let signature = admin_kp.sign(&env, &payload.to_array());
379
+
380
+ // Use empty hash for signatures since we expect early error
381
+ let hash = hash_auth_data(&env, VID, expiration, &auth_contexts);
382
+ let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
383
+
384
+ let tx_auth = TransactionAuthData {
385
+ vid: VID,
386
+ expiration,
387
+ signatures: vec![&env, sig],
388
+ sender: Sender::Admin(public_key, signature),
389
+ };
390
+
391
+ let res = env.try_invoke_contract_check_auth::<DvnError>(
392
+ &setup.contract_id,
393
+ &payload,
394
+ tx_auth.into_val(&env),
395
+ &auth_contexts,
396
+ );
397
+
398
+ // Should fail with NonContractInvoke error
399
+ assert_eq!(res, Err(Ok(DvnError::NonContractInvoke)));
400
+ }
@@ -1,5 +1,4 @@
1
1
  pub mod auth;
2
2
  pub mod dvn;
3
3
  pub mod key_pair;
4
- pub mod multisig;
5
4
  pub mod setup;
@@ -5,20 +5,18 @@ extern crate std;
5
5
  use crate::{dvn::LzDVN, tests::key_pair::KeyPair};
6
6
  use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, vec, Address, BytesN, Env, Vec};
7
7
  use std::vec::Vec as StdVec;
8
- use utils::multisig::MultisigClient;
9
8
 
10
9
  pub const VID: u32 = 1;
11
10
  pub const DEFAULT_MULTIPLIER_BPS: u32 = 10000;
12
11
 
13
- pub struct TestSetup<'a> {
12
+ pub struct TestSetup {
14
13
  pub env: Env,
15
14
  pub contract_id: Address,
16
- pub multisig_client: MultisigClient<'a>,
17
15
  pub key_pairs: StdVec<KeyPair>,
18
16
  pub admins: Vec<Address>,
19
17
  }
20
18
 
21
- impl<'a> TestSetup<'a> {
19
+ impl TestSetup {
22
20
  /// Create a new test setup with the specified number of signers
23
21
  /// Threshold defaults to signer_count
24
22
  pub fn new(signer_count: u32) -> Self {
@@ -56,9 +54,7 @@ impl<'a> TestSetup<'a> {
56
54
  ),
57
55
  );
58
56
 
59
- let multisig_client = MultisigClient::new(&env, &contract_id);
60
-
61
- Self { env, contract_id, multisig_client, key_pairs, admins }
57
+ Self { env, contract_id, key_pairs, admins }
62
58
  }
63
59
 
64
60
  /// Create a new test setup with additional admins (as Ed25519 public key bytes)
@@ -98,8 +94,6 @@ impl<'a> TestSetup<'a> {
98
94
  ),
99
95
  );
100
96
 
101
- let multisig_client = MultisigClient::new(&env, &contract_id);
102
-
103
- Self { env, contract_id, multisig_client, key_pairs, admins }
97
+ Self { env, contract_id, key_pairs, admins }
104
98
  }
105
99
  }
@@ -182,3 +182,282 @@ fn test_native_drop_with_empty_params() {
182
182
  assert!(record.is_some());
183
183
  assert_eq!(record.unwrap().params.len(), 0);
184
184
  }
185
+
186
+ // =============================================================================
187
+ // execute() with value tests
188
+ // =============================================================================
189
+
190
+ #[test]
191
+ fn test_execute_with_value_transfers_tokens() {
192
+ let setup = TestSetup::new();
193
+ let mut params = setup.default_execution_params();
194
+ params.value = 50;
195
+
196
+ // Mint tokens to admin (value payer)
197
+ setup.mint_native(&setup.admin, 100);
198
+
199
+ let admin_before = setup.balance_native(&setup.admin);
200
+ let executor_before = setup.balance_native(&setup.executor);
201
+
202
+ setup.mock_all_auths();
203
+ setup.executor_helper_client.execute(&setup.executor, &params, &setup.admin);
204
+
205
+ // Verify token transfer occurred
206
+ assert_eq!(setup.balance_native(&setup.admin), admin_before - 50);
207
+ assert_eq!(setup.balance_native(&setup.executor), executor_before + 50);
208
+
209
+ // Verify lz_receive was called with correct value
210
+ let record = setup.receiver_client().get_lz_receive();
211
+ assert!(record.is_some());
212
+ assert_eq!(record.unwrap().value, 50);
213
+ }
214
+
215
+ #[test]
216
+ fn test_execute_with_exact_balance_value() {
217
+ let setup = TestSetup::new();
218
+ let mut params = setup.default_execution_params();
219
+ params.value = 100;
220
+
221
+ // Mint exactly the amount needed
222
+ setup.mint_native(&setup.admin, 100);
223
+
224
+ setup.mock_all_auths();
225
+ setup.executor_helper_client.execute(&setup.executor, &params, &setup.admin);
226
+
227
+ // Verify all tokens transferred
228
+ assert_eq!(setup.balance_native(&setup.admin), 0);
229
+ assert_eq!(setup.balance_native(&setup.executor), 100);
230
+ }
231
+
232
+ // =============================================================================
233
+ // compose() with value tests
234
+ // =============================================================================
235
+
236
+ #[test]
237
+ fn test_compose_with_value_transfers_tokens() {
238
+ let setup = TestSetup::new();
239
+ let mut params = setup.default_compose_params();
240
+ params.value = 75;
241
+
242
+ // Mint tokens to admin (value payer)
243
+ setup.mint_native(&setup.admin, 100);
244
+
245
+ let admin_before = setup.balance_native(&setup.admin);
246
+ let executor_before = setup.balance_native(&setup.executor);
247
+
248
+ setup.mock_all_auths();
249
+ setup.executor_helper_client.compose(&setup.executor, &params, &setup.admin);
250
+
251
+ // Verify token transfer occurred
252
+ assert_eq!(setup.balance_native(&setup.admin), admin_before - 75);
253
+ assert_eq!(setup.balance_native(&setup.executor), executor_before + 75);
254
+
255
+ // Verify lz_compose was called with correct value
256
+ let record = setup.composer_client().get_lz_compose();
257
+ assert!(record.is_some());
258
+ assert_eq!(record.unwrap().value, 75);
259
+ }
260
+
261
+ // =============================================================================
262
+ // lz_receive_alert() tests
263
+ // =============================================================================
264
+
265
+ #[test]
266
+ fn test_lz_receive_alert_records_failure() {
267
+ let setup = TestSetup::new();
268
+ let params = setup.default_execution_params();
269
+ let reason = Bytes::from_slice(&setup.env, b"execution failed: out of gas");
270
+
271
+ setup.executor_helper_client.lz_receive_alert(&setup.executor, &params, &reason);
272
+
273
+ // Verify lz_receive_alert was called on endpoint with correct params
274
+ let record = setup.endpoint_client().get_lz_receive_alert();
275
+ assert!(record.is_some());
276
+ let record = record.unwrap();
277
+ assert_eq!(record.executor, setup.executor);
278
+ assert_eq!(record.origin, params.origin);
279
+ assert_eq!(record.receiver, params.receiver);
280
+ assert_eq!(record.guid, params.guid);
281
+ assert_eq!(record.gas_limit, params.gas_limit);
282
+ assert_eq!(record.value, params.value);
283
+ assert_eq!(record.message, params.message);
284
+ assert_eq!(record.extra_data, params.extra_data);
285
+ assert_eq!(record.reason, reason);
286
+ }
287
+
288
+ #[test]
289
+ fn test_lz_receive_alert_with_empty_reason() {
290
+ let setup = TestSetup::new();
291
+ let params = setup.default_execution_params();
292
+ let reason = Bytes::new(&setup.env);
293
+
294
+ setup.executor_helper_client.lz_receive_alert(&setup.executor, &params, &reason);
295
+
296
+ let record = setup.endpoint_client().get_lz_receive_alert();
297
+ assert!(record.is_some());
298
+ assert_eq!(record.unwrap().reason.len(), 0);
299
+ }
300
+
301
+ // =============================================================================
302
+ // lz_compose_alert() tests
303
+ // =============================================================================
304
+
305
+ #[test]
306
+ fn test_lz_compose_alert_records_failure() {
307
+ let setup = TestSetup::new();
308
+ let params = setup.default_compose_params();
309
+ let reason = Bytes::from_slice(&setup.env, b"compose failed: invalid state");
310
+
311
+ setup.executor_helper_client.lz_compose_alert(&setup.executor, &params, &reason);
312
+
313
+ // Verify lz_compose_alert was called on endpoint with correct params
314
+ let record = setup.endpoint_client().get_lz_compose_alert();
315
+ assert!(record.is_some());
316
+ let record = record.unwrap();
317
+ assert_eq!(record.executor, setup.executor);
318
+ assert_eq!(record.from, params.from);
319
+ assert_eq!(record.to, params.to);
320
+ assert_eq!(record.guid, params.guid);
321
+ assert_eq!(record.index, params.index);
322
+ assert_eq!(record.gas_limit, params.gas_limit);
323
+ assert_eq!(record.value, params.value);
324
+ assert_eq!(record.message, params.message);
325
+ assert_eq!(record.extra_data, params.extra_data);
326
+ assert_eq!(record.reason, reason);
327
+ }
328
+
329
+ #[test]
330
+ fn test_lz_compose_alert_with_empty_reason() {
331
+ let setup = TestSetup::new();
332
+ let params = setup.default_compose_params();
333
+ let reason = Bytes::new(&setup.env);
334
+
335
+ setup.executor_helper_client.lz_compose_alert(&setup.executor, &params, &reason);
336
+
337
+ let record = setup.endpoint_client().get_lz_compose_alert();
338
+ assert!(record.is_some());
339
+ assert_eq!(record.unwrap().reason.len(), 0);
340
+ }
341
+
342
+ // =============================================================================
343
+ // native_drop_and_execute() tests
344
+ // =============================================================================
345
+
346
+ #[test]
347
+ fn test_native_drop_and_execute_calls_both() {
348
+ let setup = TestSetup::new();
349
+ let origin = setup.default_origin();
350
+ let dst_eid = 2u32;
351
+ let oapp = Address::generate(&setup.env);
352
+
353
+ let receiver1 = Address::generate(&setup.env);
354
+ let native_drop_params: Vec<NativeDropParams> =
355
+ vec![&setup.env, NativeDropParams { receiver: receiver1.clone(), amount: 10 }];
356
+
357
+ let execute_params = setup.default_execution_params();
358
+
359
+ setup.mock_all_auths();
360
+ setup.executor_helper_client.native_drop_and_execute(
361
+ &setup.executor,
362
+ &setup.admin,
363
+ &origin,
364
+ &dst_eid,
365
+ &oapp,
366
+ &native_drop_params,
367
+ &execute_params,
368
+ );
369
+
370
+ // Verify native_drop was called
371
+ let drop_record = setup.executor_client().get_native_drop();
372
+ assert!(drop_record.is_some());
373
+ let drop_record = drop_record.unwrap();
374
+ assert_eq!(drop_record.admin, setup.admin);
375
+ assert_eq!(drop_record.origin, origin);
376
+ assert_eq!(drop_record.dst_eid, dst_eid);
377
+ assert_eq!(drop_record.oapp, oapp);
378
+ assert_eq!(drop_record.params.len(), 1);
379
+ assert_eq!(drop_record.params.get(0).unwrap().receiver, receiver1);
380
+ assert_eq!(drop_record.params.get(0).unwrap().amount, 10);
381
+
382
+ // Verify lz_receive was also called
383
+ let receive_record = setup.receiver_client().get_lz_receive();
384
+ assert!(receive_record.is_some());
385
+ let receive_record = receive_record.unwrap();
386
+ assert_eq!(receive_record.executor, setup.executor);
387
+ assert_eq!(receive_record.origin, execute_params.origin);
388
+ assert_eq!(receive_record.guid, execute_params.guid);
389
+ }
390
+
391
+ #[test]
392
+ fn test_native_drop_and_execute_with_empty_drop_params() {
393
+ let setup = TestSetup::new();
394
+ let origin = setup.default_origin();
395
+ let dst_eid = 1u32;
396
+ let oapp = Address::generate(&setup.env);
397
+ let native_drop_params: Vec<NativeDropParams> = vec![&setup.env];
398
+ let execute_params = setup.default_execution_params();
399
+
400
+ setup.mock_all_auths();
401
+ setup.executor_helper_client.native_drop_and_execute(
402
+ &setup.executor,
403
+ &setup.admin,
404
+ &origin,
405
+ &dst_eid,
406
+ &oapp,
407
+ &native_drop_params,
408
+ &execute_params,
409
+ );
410
+
411
+ // Verify native_drop was called with empty params
412
+ let drop_record = setup.executor_client().get_native_drop();
413
+ assert!(drop_record.is_some());
414
+ assert_eq!(drop_record.unwrap().params.len(), 0);
415
+
416
+ // Verify lz_receive was still called
417
+ let receive_record = setup.receiver_client().get_lz_receive();
418
+ assert!(receive_record.is_some());
419
+ }
420
+
421
+ #[test]
422
+ fn test_native_drop_and_execute_with_value_transfer() {
423
+ let setup = TestSetup::new();
424
+ let origin = setup.default_origin();
425
+ let dst_eid = 2u32;
426
+ let oapp = Address::generate(&setup.env);
427
+
428
+ let receiver1 = Address::generate(&setup.env);
429
+ let native_drop_params: Vec<NativeDropParams> =
430
+ vec![&setup.env, NativeDropParams { receiver: receiver1.clone(), amount: 10 }];
431
+
432
+ let mut execute_params = setup.default_execution_params();
433
+ execute_params.value = 25; // Add value to trigger token transfer
434
+
435
+ // Mint tokens to admin (value payer)
436
+ setup.mint_native(&setup.admin, 100);
437
+ let admin_before = setup.balance_native(&setup.admin);
438
+ let executor_before = setup.balance_native(&setup.executor);
439
+
440
+ setup.mock_all_auths();
441
+ setup.executor_helper_client.native_drop_and_execute(
442
+ &setup.executor,
443
+ &setup.admin,
444
+ &origin,
445
+ &dst_eid,
446
+ &oapp,
447
+ &native_drop_params,
448
+ &execute_params,
449
+ );
450
+
451
+ // Verify token transfer occurred
452
+ assert_eq!(setup.balance_native(&setup.admin), admin_before - 25);
453
+ assert_eq!(setup.balance_native(&setup.executor), executor_before + 25);
454
+
455
+ // Verify both operations occurred
456
+ let drop_record = setup.executor_client().get_native_drop();
457
+ assert!(drop_record.is_some());
458
+ assert_eq!(drop_record.unwrap().params.len(), 1);
459
+
460
+ let receive_record = setup.receiver_client().get_lz_receive();
461
+ assert!(receive_record.is_some());
462
+ assert_eq!(receive_record.unwrap().value, 25);
463
+ }