@layerzerolabs/protocol-stellar-v2 0.2.21 → 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
@@ -0,0 +1,108 @@
1
+ //! Unit tests for BlockedMessageLib.
2
+
3
+ use endpoint_v2::{MessageLibType, MessageLibVersion, SetConfigParam};
4
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, Vec};
5
+
6
+ use super::setup::{create_packet, setup};
7
+ use crate::BlockedMessageLibError;
8
+
9
+ // ============================================================================
10
+ // IMessageLib Tests
11
+ // ============================================================================
12
+
13
+ #[test]
14
+ fn is_supported_eid_returns_true_for_any_eid() {
15
+ let test = setup();
16
+
17
+ assert!(test.client.is_supported_eid(&0u32));
18
+ assert!(test.client.is_supported_eid(&12345u32));
19
+ assert!(test.client.is_supported_eid(&u32::MAX));
20
+ }
21
+
22
+ #[test]
23
+ fn version_returns_max_values() {
24
+ let test = setup();
25
+
26
+ assert_eq!(
27
+ test.client.version(),
28
+ MessageLibVersion { major: u64::MAX, minor: u8::MAX as u32, endpoint_version: 2 }
29
+ );
30
+ }
31
+
32
+ #[test]
33
+ fn message_lib_type_returns_send_and_receive() {
34
+ let test = setup();
35
+
36
+ let lib_type = test.client.message_lib_type();
37
+
38
+ assert_eq!(lib_type, MessageLibType::SendAndReceive);
39
+ }
40
+
41
+ #[test]
42
+ fn set_config_panics() {
43
+ let test = setup();
44
+ let oapp = Address::generate(&test.env);
45
+ let params: Vec<SetConfigParam> = Vec::new(&test.env);
46
+
47
+ let result = test.client.try_set_config(&oapp, &params);
48
+
49
+ assert_eq!(result.unwrap_err().unwrap(), BlockedMessageLibError::NotImplemented.into());
50
+ }
51
+
52
+ #[test]
53
+ fn get_config_panics() {
54
+ let test = setup();
55
+ let oapp = Address::generate(&test.env);
56
+
57
+ let result = test.client.try_get_config(&1u32, &oapp, &0u32);
58
+
59
+ assert_eq!(result.unwrap_err().unwrap(), BlockedMessageLibError::NotImplemented.into());
60
+ }
61
+
62
+ // ============================================================================
63
+ // ISendLib Tests
64
+ // ============================================================================
65
+
66
+ #[test]
67
+ fn quote_panics() {
68
+ let test = setup();
69
+ let packet = create_packet(&test.env);
70
+ let options = Bytes::new(&test.env);
71
+
72
+ let result = test.client.try_quote(&packet, &options, &false);
73
+
74
+ assert_eq!(result.unwrap_err().unwrap(), BlockedMessageLibError::NotImplemented.into());
75
+ }
76
+
77
+ #[test]
78
+ fn quote_panics_with_zro() {
79
+ let test = setup();
80
+ let packet = create_packet(&test.env);
81
+ let options = Bytes::new(&test.env);
82
+
83
+ let result = test.client.try_quote(&packet, &options, &true);
84
+
85
+ assert_eq!(result.unwrap_err().unwrap(), BlockedMessageLibError::NotImplemented.into());
86
+ }
87
+
88
+ #[test]
89
+ fn send_panics() {
90
+ let test = setup();
91
+ let packet = create_packet(&test.env);
92
+ let options = Bytes::new(&test.env);
93
+
94
+ let result = test.client.try_send(&packet, &options, &false);
95
+
96
+ assert_eq!(result.unwrap_err().unwrap(), BlockedMessageLibError::NotImplemented.into());
97
+ }
98
+
99
+ #[test]
100
+ fn send_panics_with_zro() {
101
+ let test = setup();
102
+ let packet = create_packet(&test.env);
103
+ let options = Bytes::new(&test.env);
104
+
105
+ let result = test.client.try_send(&packet, &options, &true);
106
+
107
+ assert_eq!(result.unwrap_err().unwrap(), BlockedMessageLibError::NotImplemented.into());
108
+ }
@@ -0,0 +1,4 @@
1
+ //! Tests for BlockedMessageLib contract.
2
+
3
+ mod blocked_message_lib_tests;
4
+ mod setup;
@@ -0,0 +1,40 @@
1
+ //! Test setup for BlockedMessageLib tests.
2
+
3
+ use endpoint_v2::OutboundPacket;
4
+ use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN, Env};
5
+
6
+ use crate::{BlockedMessageLib, BlockedMessageLibClient};
7
+
8
+ // ============================================================================
9
+ // Test Setup
10
+ // ============================================================================
11
+
12
+ pub struct TestSetup<'a> {
13
+ pub env: Env,
14
+ pub client: BlockedMessageLibClient<'a>,
15
+ }
16
+
17
+ /// Creates a test setup with the BlockedMessageLib contract.
18
+ pub fn setup<'a>() -> TestSetup<'a> {
19
+ let env = Env::default();
20
+ let contract_id = env.register(BlockedMessageLib, ());
21
+ let client = BlockedMessageLibClient::new(&env, &contract_id);
22
+ TestSetup { env, client }
23
+ }
24
+
25
+ // ============================================================================
26
+ // Helper Functions
27
+ // ============================================================================
28
+
29
+ /// Creates a test outbound packet.
30
+ pub fn create_packet(env: &Env) -> OutboundPacket {
31
+ OutboundPacket {
32
+ nonce: 1,
33
+ src_eid: 1,
34
+ sender: Address::generate(env),
35
+ dst_eid: 2,
36
+ receiver: BytesN::from_array(env, &[0u8; 32]),
37
+ guid: BytesN::from_array(env, &[0u8; 32]),
38
+ message: Bytes::from_array(env, b"test"),
39
+ }
40
+ }
@@ -11,4 +11,4 @@ cfg_if::cfg_if! {
11
11
  }
12
12
 
13
13
  #[cfg(test)]
14
- mod test;
14
+ mod tests;
@@ -0,0 +1,2 @@
1
+ mod setup;
2
+ mod simple_message_lib_tests;
@@ -0,0 +1,124 @@
1
+ //! Test setup for SimpleMessageLib tests.
2
+
3
+ use endpoint_v2::{LayerZeroEndpointV2Client, Origin, OutboundPacket};
4
+ use soroban_sdk::{contract, contractimpl, symbol_short, testutils::Address as _, Address, Bytes, BytesN, Env};
5
+
6
+ use crate::simple_message_lib::{SimpleMessageLib, SimpleMessageLibClient};
7
+
8
+ // ============================================================================
9
+ // Mock Contracts
10
+ // ============================================================================
11
+
12
+ #[contract]
13
+ pub struct MockEndpoint;
14
+
15
+ #[contractimpl]
16
+ impl MockEndpoint {
17
+ pub fn __constructor(env: Env, native_token: Address) {
18
+ env.storage().instance().set(&symbol_short!("ntk"), &native_token);
19
+ }
20
+
21
+ pub fn eid(_env: Env) -> u32 {
22
+ 1
23
+ }
24
+
25
+ pub fn native_token(env: Env) -> Address {
26
+ env.storage().instance().get(&symbol_short!("ntk")).unwrap()
27
+ }
28
+
29
+ pub fn zro(env: Env) -> Option<Address> {
30
+ env.storage().instance().get(&symbol_short!("zro")).unwrap_or(None)
31
+ }
32
+
33
+ pub fn set_zro(env: Env, zro: Address) {
34
+ env.storage().instance().set(&symbol_short!("zro"), &zro);
35
+ }
36
+
37
+ // Minimal `verify` implementation so `SimpleMessageLib::validate_packet` can be unit-tested.
38
+ // Stores the last arguments for assertions.
39
+ pub fn verify(env: Env, receive_lib: Address, origin: Origin, receiver: Address, payload_hash: BytesN<32>) {
40
+ receive_lib.require_auth();
41
+
42
+ env.storage().instance().set(&symbol_short!("v_rl"), &receive_lib);
43
+ env.storage().instance().set(&symbol_short!("v_or"), &origin);
44
+ env.storage().instance().set(&symbol_short!("v_rc"), &receiver);
45
+ env.storage().instance().set(&symbol_short!("v_ph"), &payload_hash);
46
+ }
47
+
48
+ pub fn last_verify(env: Env) -> (Address, Origin, Address, BytesN<32>) {
49
+ let receive_lib: Address = env.storage().instance().get(&symbol_short!("v_rl")).unwrap();
50
+ let origin: Origin = env.storage().instance().get(&symbol_short!("v_or")).unwrap();
51
+ let receiver: Address = env.storage().instance().get(&symbol_short!("v_rc")).unwrap();
52
+ let payload_hash: BytesN<32> = env.storage().instance().get(&symbol_short!("v_ph")).unwrap();
53
+ (receive_lib, origin, receiver, payload_hash)
54
+ }
55
+ }
56
+
57
+ #[contract]
58
+ pub struct DummyReceiver;
59
+
60
+ #[contractimpl]
61
+ impl DummyReceiver {
62
+ pub fn __constructor(_env: Env) {}
63
+ }
64
+
65
+ // ============================================================================
66
+ // Test Setup
67
+ // ============================================================================
68
+
69
+ pub struct TestSetup<'a> {
70
+ pub env: Env,
71
+ pub owner: Address,
72
+ pub fee_recipient: Address,
73
+ pub endpoint: LayerZeroEndpointV2Client<'a>,
74
+ pub sml: SimpleMessageLibClient<'a>,
75
+ }
76
+
77
+ /// Creates a test setup with the SimpleMessageLib contract and MockEndpoint.
78
+ pub fn setup<'a>() -> TestSetup<'a> {
79
+ let env = Env::default();
80
+ let owner = Address::generate(&env);
81
+ let fee_recipient = Address::generate(&env);
82
+
83
+ let native_token = env.register_stellar_asset_contract_v2(owner.clone());
84
+
85
+ let endpoint = env.register(MockEndpoint, (&native_token.address(),));
86
+ let endpoint_client = LayerZeroEndpointV2Client::new(&env, &endpoint);
87
+ let sml_address = env.register(SimpleMessageLib, (&owner, &endpoint, &fee_recipient));
88
+ let sml = SimpleMessageLibClient::new(&env, &sml_address);
89
+ TestSetup { env, owner, fee_recipient, endpoint: endpoint_client, sml }
90
+ }
91
+
92
+ // ============================================================================
93
+ // Helper Functions
94
+ // ============================================================================
95
+
96
+ /// Creates a test outbound packet.
97
+ pub fn create_packet(env: &Env) -> OutboundPacket {
98
+ create_packet_with_contract_receiver(env, BytesN::from_array(env, &[0u8; 32]))
99
+ }
100
+
101
+ /// Creates a contract receiver and returns both the address and its bytes representation.
102
+ pub fn create_contract_receiver(env: &Env) -> (Address, BytesN<32>) {
103
+ use soroban_sdk::address_payload::AddressPayload;
104
+
105
+ let receiver_addr = env.register(DummyReceiver, ());
106
+ let receiver_bytes = match receiver_addr.to_payload().unwrap() {
107
+ AddressPayload::ContractIdHash(b) => b,
108
+ AddressPayload::AccountIdPublicKeyEd25519(_) => panic!("receiver must be a contract"),
109
+ };
110
+ (receiver_addr, receiver_bytes)
111
+ }
112
+
113
+ /// Creates a test outbound packet with a custom contract receiver.
114
+ pub fn create_packet_with_contract_receiver(env: &Env, receiver: BytesN<32>) -> OutboundPacket {
115
+ OutboundPacket {
116
+ nonce: 1,
117
+ src_eid: 2,
118
+ sender: Address::generate(env),
119
+ dst_eid: 3,
120
+ receiver,
121
+ guid: BytesN::from_array(env, &[0u8; 32]),
122
+ message: Bytes::from_array(env, b"test"),
123
+ }
124
+ }
@@ -0,0 +1,309 @@
1
+ use endpoint_v2::{MessageLibType, MessageLibVersion, SetConfigParam};
2
+ use message_lib_common::packet_codec_v1;
3
+ use soroban_sdk::{
4
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
5
+ Address, Bytes, BytesN, IntoVal, Vec,
6
+ };
7
+
8
+ use crate::errors::SimpleMessageLibError;
9
+
10
+ use super::setup::{
11
+ create_contract_receiver, create_packet, create_packet_with_contract_receiver, setup, MockEndpointClient, TestSetup,
12
+ };
13
+
14
+ // ============================================================================
15
+ // Quote Tests
16
+ // ============================================================================
17
+
18
+ #[test]
19
+ fn test_quote() {
20
+ let TestSetup { env, sml, endpoint, .. } = setup();
21
+
22
+ let packet = create_packet(&env);
23
+ let options = Bytes::new(&env);
24
+ let pay_in_zro = false;
25
+
26
+ env.mock_auths(&[MockAuth {
27
+ address: &endpoint.address,
28
+ invoke: &MockAuthInvoke {
29
+ contract: &sml.address,
30
+ fn_name: "quote",
31
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
32
+ sub_invokes: &[],
33
+ },
34
+ }]);
35
+
36
+ let fee = sml.quote(&packet, &options, &pay_in_zro);
37
+ assert_eq!(fee.native_fee, 100);
38
+ assert_eq!(fee.zro_fee, 0);
39
+ }
40
+
41
+ #[test]
42
+ fn test_quote_with_zro_fee() {
43
+ let TestSetup { env, sml, endpoint, .. } = setup();
44
+
45
+ let packet = create_packet(&env);
46
+ let options = Bytes::new(&env);
47
+ let pay_in_zro = true;
48
+
49
+ env.mock_auths(&[MockAuth {
50
+ address: &endpoint.address,
51
+ invoke: &MockAuthInvoke {
52
+ contract: &sml.address,
53
+ fn_name: "quote",
54
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
55
+ sub_invokes: &[],
56
+ },
57
+ }]);
58
+
59
+ let fee = sml.quote(&packet, &options, &pay_in_zro);
60
+ assert_eq!(fee.native_fee, 100);
61
+ assert_eq!(fee.zro_fee, 99);
62
+ }
63
+
64
+ // ============================================================================
65
+ // Send Tests
66
+ // ============================================================================
67
+
68
+ #[test]
69
+ fn test_send() {
70
+ let TestSetup { env, sml, endpoint, fee_recipient, .. } = setup();
71
+
72
+ let packet = create_packet(&env);
73
+ let options = Bytes::new(&env);
74
+ let pay_in_zro = false;
75
+
76
+ env.mock_auths(&[MockAuth {
77
+ address: &endpoint.address,
78
+ invoke: &MockAuthInvoke {
79
+ contract: &sml.address,
80
+ fn_name: "send",
81
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
82
+ sub_invokes: &[],
83
+ },
84
+ }]);
85
+
86
+ let send_result = sml.send(&packet, &options, &pay_in_zro);
87
+
88
+ // Verify encoded packet
89
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&env, &packet));
90
+
91
+ // Verify native fee recipient
92
+ assert_eq!(send_result.native_fee_recipients.len(), 1);
93
+ assert_eq!(send_result.zro_fee_recipients.len(), 0);
94
+
95
+ let native_recipient = send_result.native_fee_recipients.get(0).unwrap();
96
+ assert_eq!(native_recipient.to, fee_recipient);
97
+ assert_eq!(native_recipient.amount, 100);
98
+ }
99
+
100
+ #[test]
101
+ fn test_send_returns_both_fee_recipients_with_zro() {
102
+ let TestSetup { env, sml, endpoint, owner, fee_recipient } = setup();
103
+
104
+ // Set up ZRO token
105
+ let zro = env.register_stellar_asset_contract_v2(owner.clone());
106
+ let zro_address = zro.address();
107
+ env.mock_auths(&[MockAuth {
108
+ address: &owner,
109
+ invoke: &MockAuthInvoke {
110
+ contract: &endpoint.address,
111
+ fn_name: "set_zro",
112
+ args: (&zro_address,).into_val(&env),
113
+ sub_invokes: &[],
114
+ },
115
+ }]);
116
+ endpoint.set_zro(&zro_address);
117
+
118
+ let packet = create_packet(&env);
119
+ let options = Bytes::new(&env);
120
+ let pay_in_zro = true;
121
+
122
+ env.mock_auths(&[MockAuth {
123
+ address: &endpoint.address,
124
+ invoke: &MockAuthInvoke {
125
+ contract: &sml.address,
126
+ fn_name: "send",
127
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
128
+ sub_invokes: &[],
129
+ },
130
+ }]);
131
+
132
+ let send_result = sml.send(&packet, &options, &pay_in_zro);
133
+
134
+ assert_eq!(send_result.native_fee_recipients.len(), 1);
135
+ assert_eq!(send_result.zro_fee_recipients.len(), 1);
136
+
137
+ let native_recipient = send_result.native_fee_recipients.get(0).unwrap();
138
+ assert_eq!(native_recipient.to, fee_recipient);
139
+ assert_eq!(native_recipient.amount, 100);
140
+
141
+ let zro_recipient = send_result.zro_fee_recipients.get(0).unwrap();
142
+ assert_eq!(zro_recipient.to, fee_recipient);
143
+ assert_eq!(zro_recipient.amount, 99);
144
+ }
145
+
146
+ #[test]
147
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
148
+ fn test_send_requires_endpoint_auth() {
149
+ let TestSetup { env, sml, .. } = setup();
150
+
151
+ let packet = create_packet(&env);
152
+ let options = Bytes::new(&env);
153
+ let pay_in_zro = false;
154
+
155
+ // `send` requires endpoint auth; without mocks it should panic.
156
+ sml.send(&packet, &options, &pay_in_zro);
157
+ }
158
+
159
+ // ============================================================================
160
+ // Admin Setter Tests
161
+ // ============================================================================
162
+
163
+ #[test]
164
+ fn test_admin_setters_update_storage() {
165
+ let TestSetup { env, sml, owner, .. } = setup();
166
+
167
+ let new_fee_recipient = Address::generate(&env);
168
+ let new_native_fee = 1234i128;
169
+ let new_zro_fee = 5678i128;
170
+ let new_whitelisted = Address::generate(&env);
171
+
172
+ env.mock_auths(&[
173
+ MockAuth {
174
+ address: &owner,
175
+ invoke: &MockAuthInvoke {
176
+ contract: &sml.address,
177
+ fn_name: "set_fee_recipient",
178
+ args: (&new_fee_recipient,).into_val(&env),
179
+ sub_invokes: &[],
180
+ },
181
+ },
182
+ MockAuth {
183
+ address: &owner,
184
+ invoke: &MockAuthInvoke {
185
+ contract: &sml.address,
186
+ fn_name: "set_native_fee",
187
+ args: (&new_native_fee,).into_val(&env),
188
+ sub_invokes: &[],
189
+ },
190
+ },
191
+ MockAuth {
192
+ address: &owner,
193
+ invoke: &MockAuthInvoke {
194
+ contract: &sml.address,
195
+ fn_name: "set_zro_fee",
196
+ args: (&new_zro_fee,).into_val(&env),
197
+ sub_invokes: &[],
198
+ },
199
+ },
200
+ MockAuth {
201
+ address: &owner,
202
+ invoke: &MockAuthInvoke {
203
+ contract: &sml.address,
204
+ fn_name: "set_whitelisted_caller",
205
+ args: (&new_whitelisted,).into_val(&env),
206
+ sub_invokes: &[],
207
+ },
208
+ },
209
+ ]);
210
+
211
+ sml.set_fee_recipient(&new_fee_recipient);
212
+ sml.set_native_fee(&new_native_fee);
213
+ sml.set_zro_fee(&new_zro_fee);
214
+ sml.set_whitelisted_caller(&new_whitelisted);
215
+
216
+ assert_eq!(sml.fee_recipient(), new_fee_recipient);
217
+ assert_eq!(sml.native_fee(), new_native_fee);
218
+ assert_eq!(sml.zro_fee(), new_zro_fee);
219
+ assert_eq!(sml.whitelisted_caller(), new_whitelisted);
220
+ }
221
+
222
+ // ============================================================================
223
+ // Metadata Tests
224
+ // ============================================================================
225
+
226
+ #[test]
227
+ fn test_message_lib_metadata() {
228
+ let TestSetup { sml, fee_recipient, .. } = setup();
229
+
230
+ assert!(sml.is_supported_eid(&123u32));
231
+ assert_eq!(sml.message_lib_type(), MessageLibType::SendAndReceive);
232
+ assert_eq!(sml.version(), MessageLibVersion { major: 0, minor: 0, endpoint_version: 2 });
233
+
234
+ assert_eq!(sml.fee_recipient(), fee_recipient);
235
+ assert_eq!(sml.native_fee(), 100);
236
+ assert_eq!(sml.zro_fee(), 99);
237
+ }
238
+
239
+ #[test]
240
+ fn test_get_config_not_implemented() {
241
+ let TestSetup { env, sml, .. } = setup();
242
+
243
+ let oapp = Address::generate(&env);
244
+ let res = sml.try_get_config(&1u32, &oapp, &0u32);
245
+ assert_eq!(res.unwrap_err().unwrap(), SimpleMessageLibError::NotImplemented.into());
246
+ }
247
+
248
+ #[test]
249
+ fn test_set_config_not_implemented() {
250
+ let TestSetup { env, sml, .. } = setup();
251
+
252
+ let oapp = Address::generate(&env);
253
+ let empty: Vec<SetConfigParam> = Vec::new(&env);
254
+ let res = sml.try_set_config(&oapp, &empty);
255
+ assert_eq!(res.unwrap_err().unwrap(), SimpleMessageLibError::NotImplemented.into());
256
+ }
257
+
258
+ // ============================================================================
259
+ // Validate Packet Tests
260
+ // ============================================================================
261
+
262
+ #[test]
263
+ fn test_validate_packet_calls_endpoint_verify() {
264
+ let TestSetup { env, sml, owner, endpoint, .. } = setup();
265
+
266
+ env.mock_all_auths_allowing_non_root_auth();
267
+
268
+ let (receiver_addr, receiver_bytes) = create_contract_receiver(&env);
269
+ let packet = create_packet_with_contract_receiver(&env, receiver_bytes);
270
+
271
+ let header_bytes = packet_codec_v1::encode_packet_header(&env, &packet);
272
+ let payload_hash = BytesN::from_array(&env, &[2u8; 32]);
273
+
274
+ env.mock_auths(&[MockAuth {
275
+ address: &owner,
276
+ invoke: &MockAuthInvoke {
277
+ contract: &sml.address,
278
+ fn_name: "validate_packet",
279
+ args: (&header_bytes, &payload_hash).into_val(&env),
280
+ sub_invokes: &[],
281
+ },
282
+ }]);
283
+
284
+ sml.validate_packet(&header_bytes, &payload_hash);
285
+
286
+ let (last_rl, last_origin, last_receiver, last_hash) =
287
+ MockEndpointClient::new(&env, &endpoint.address).last_verify();
288
+
289
+ assert_eq!(last_rl, sml.address);
290
+ assert_eq!(last_origin.src_eid, packet.src_eid);
291
+ assert_eq!(last_origin.nonce, packet.nonce);
292
+ assert_eq!(last_receiver, receiver_addr);
293
+ assert_eq!(last_hash, payload_hash);
294
+ }
295
+
296
+ #[test]
297
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
298
+ fn test_validate_packet_requires_whitelisted_caller_auth() {
299
+ let TestSetup { env, sml, .. } = setup();
300
+
301
+ let (_, receiver_bytes) = create_contract_receiver(&env);
302
+ let packet = create_packet_with_contract_receiver(&env, receiver_bytes);
303
+
304
+ let header_bytes = packet_codec_v1::encode_packet_header(&env, &packet);
305
+ let payload_hash = BytesN::from_array(&env, &[3u8; 32]);
306
+
307
+ // No auth mocked => should panic at whitelisted_caller.require_auth().
308
+ sml.validate_packet(&header_bytes, &payload_hash);
309
+ }
@@ -2,23 +2,44 @@ use common_macros::contract_error;
2
2
 
3
3
  #[contract_error]
4
4
  pub enum Uln302Error {
5
+ /// Default executor configuration is not set for the destination endpoint
5
6
  DefaultExecutorConfigNotFound,
7
+ /// Default receive ULN configuration is not set for the source endpoint
6
8
  DefaultReceiveUlnConfigNotFound,
9
+ /// Default send ULN configuration is not set for the destination endpoint
7
10
  DefaultSendUlnConfigNotFound,
11
+ /// Optional DVNs list contains duplicate addresses
8
12
  DuplicateOptionalDVNs,
13
+ /// Required DVNs list contains duplicate addresses
9
14
  DuplicateRequiredDVNs,
15
+ /// Configuration bytes failed to parse as expected XDR type
10
16
  InvalidConfig,
17
+ /// Config type is not one of EXECUTOR, SEND_ULN, or RECEIVE_ULN
11
18
  InvalidConfigType,
19
+ /// Confirmations must be zero when using default confirmations
12
20
  InvalidConfirmations,
21
+ /// Packet header destination EID does not match this endpoint's EID
13
22
  InvalidEID,
23
+ /// Message size exceeds executor's configured maximum
14
24
  InvalidMessageSize,
25
+ /// Optional DVNs count exceeds maximum allowed (127)
15
26
  InvalidOptionalDVNCount,
27
+ /// Optional DVNs must be empty when using default optional DVNs
16
28
  InvalidOptionalDVNs,
29
+ /// Optional DVN threshold is invalid (must be 0 with no DVNs, or 1 to DVN count)
17
30
  InvalidOptionalDVNThreshold,
31
+ /// Required DVNs count exceeds maximum allowed (127)
18
32
  InvalidRequiredDVNCount,
33
+ /// Required DVNs must be empty when using default required DVNs
19
34
  InvalidRequiredDVNs,
35
+ /// Sender address must be a contract (C-address), not an account (G-address)
36
+ InvalidSenderAddress,
37
+ /// Configuration must have at least one DVN (required or optional with threshold > 0)
20
38
  UlnAtLeastOneDVN,
39
+ /// Endpoint ID is not supported (missing default configurations)
21
40
  UnsupportedEid,
41
+ /// Message has not been verified by enough DVNs yet
22
42
  Verifying,
43
+ /// Executor max message size cannot be zero
23
44
  ZeroMessageSize,
24
45
  }
@@ -36,7 +36,7 @@ pub trait IReceiveUln302 {
36
36
  /// True if the message has been verified by enough DVNs to be committed, false otherwise
37
37
  fn verifiable(env: &Env, packet_header: &Bytes, payload_hash: &BytesN<32>) -> bool;
38
38
 
39
- /// Permissonless to commit a verified message to the endpoint after sufficient DVN verification.
39
+ /// Permissionless function to commit a verified message to the endpoint after sufficient DVN verification.
40
40
  ///
41
41
  /// Checks that all required DVNs and the optional DVN threshold have verified
42
42
  /// the message, then calls `verify` on the endpoint to make the message executable.
@@ -35,7 +35,7 @@ impl IReceiveUln302 for Uln302 {
35
35
  .publish(env);
36
36
  }
37
37
 
38
- /// Permissonless to commit a verified message to the endpoint after sufficient DVN verification.
38
+ /// Permissionless function to commit a verified message to the endpoint after sufficient DVN verification.
39
39
  ///
40
40
  /// Validates the packet header and checks that enough DVNs have verified the message
41
41
  /// (all required DVNs + optional DVN threshold). Once verified, cleans up DVN confirmation
@@ -168,9 +168,11 @@ impl Uln302 {
168
168
  let threshold = uln_config.optional_dvn_threshold as usize;
169
169
  let is_verified = |dvn: &Address| Self::verified(env, dvn, header_hash, payload_hash, uln_config.confirmations);
170
170
 
171
- // check if all required DVNs are verified and the optional DVNs threshold is met
172
- uln_config.required_dvns.iter().all(|dvn| is_verified(&dvn))
173
- && uln_config.optional_dvns.iter().filter(is_verified).take(threshold).count() == threshold
171
+ // All required DVNs must be verified AND at least `threshold` optional DVNs must be verified
172
+ let all_required_verified = uln_config.required_dvns.iter().all(|dvn| is_verified(&dvn));
173
+ let optional_threshold_met =
174
+ uln_config.optional_dvns.iter().filter(is_verified).take(threshold).count() == threshold;
175
+ all_required_verified && optional_threshold_met
174
176
  }
175
177
 
176
178
  /// Checks if a DVN has submitted enough confirmations for the message.