@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/.turbo/turbo-build.log +484 -337
  2. package/.turbo/turbo-lint.log +126 -56
  3. package/.turbo/turbo-test.log +1403 -984
  4. package/Cargo.lock +142 -3
  5. package/Cargo.toml +5 -1
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +219 -29
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/storage.rs +1 -1
  12. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  13. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  14. package/contracts/common-macros/src/tests/mod.rs +3 -2
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  18. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +26 -10
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -41
  22. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  23. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  24. package/contracts/common-macros/src/ttl_configurable.rs +21 -66
  25. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  26. package/contracts/common-macros/src/upgradeable.rs +76 -0
  27. package/contracts/common-macros/src/utils.rs +9 -0
  28. package/contracts/endpoint-v2/src/constants.rs +4 -4
  29. package/contracts/endpoint-v2/src/endpoint_v2.rs +58 -36
  30. package/contracts/endpoint-v2/src/errors.rs +4 -3
  31. package/contracts/endpoint-v2/src/events.rs +1 -1
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  35. package/contracts/endpoint-v2/src/storage.rs +1 -1
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +62 -10
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  56. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  69. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  70. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  71. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  72. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  73. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +4 -6
  74. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  75. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +16 -2
  76. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  77. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  78. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  79. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  80. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  81. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  82. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  83. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  84. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  85. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  86. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  87. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  88. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  89. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  90. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  91. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  92. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  93. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  94. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  95. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  96. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  97. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  98. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  99. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  100. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  101. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  102. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  103. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  104. package/contracts/layerzero-views/Cargo.toml +35 -0
  105. package/contracts/layerzero-views/src/errors.rs +10 -0
  106. package/contracts/layerzero-views/src/layerzero_view.rs +226 -0
  107. package/contracts/layerzero-views/src/lib.rs +38 -0
  108. package/contracts/layerzero-views/src/storage.rs +18 -0
  109. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  110. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  111. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  112. package/contracts/layerzero-views/src/types.rs +50 -0
  113. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  114. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  115. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  116. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  117. package/contracts/macro-integration-tests/tests/runtime/ownable/only_auth_guard.rs +97 -0
  118. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  119. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  120. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  121. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  122. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  123. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  124. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  125. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  126. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +2 -0
  127. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  128. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  129. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  130. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  131. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  133. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  135. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  137. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  138. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +22 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +16 -0
  141. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +21 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +46 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  158. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  159. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  160. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  161. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  163. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  164. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  165. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  166. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  167. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  168. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  169. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  170. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  171. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  172. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  173. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  174. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  175. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  176. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  177. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  178. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  179. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  180. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  181. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  182. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  183. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  184. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +49 -0
  185. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +73 -0
  186. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  187. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  188. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  189. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  190. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  191. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  192. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  193. package/contracts/message-libs/treasury/src/errors.rs +2 -3
  194. package/contracts/message-libs/treasury/src/events.rs +1 -1
  195. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  196. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  197. package/contracts/message-libs/treasury/src/storage.rs +3 -1
  198. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  199. package/contracts/message-libs/treasury/src/treasury.rs +23 -26
  200. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  201. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  202. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  203. package/contracts/message-libs/uln-302/src/receive_uln.rs +37 -56
  204. package/contracts/message-libs/uln-302/src/send_uln.rs +112 -138
  205. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  206. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  207. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  208. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  209. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  210. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  211. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  212. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  213. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  214. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  215. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  216. package/contracts/message-libs/uln-302/src/uln302.rs +10 -25
  217. package/contracts/oapps/counter/Cargo.toml +14 -1
  218. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  219. package/contracts/oapps/counter/integration_tests/setup_sml.rs +169 -0
  220. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  221. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  222. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  223. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  224. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  225. package/contracts/oapps/counter/src/counter.rs +67 -44
  226. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  227. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  228. package/contracts/oapps/oapp/src/errors.rs +5 -1
  229. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +318 -221
  230. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  231. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  232. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  233. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  234. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -9
  235. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -18
  236. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -8
  237. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -16
  238. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  239. package/contracts/oapps/oapp-macros/src/lib.rs +211 -0
  240. package/contracts/oapps/oft/integration-tests/setup.rs +34 -9
  241. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  242. package/contracts/oapps/oft/src/errors.rs +6 -1
  243. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -13
  244. package/contracts/oapps/oft/src/extensions/pausable.rs +5 -5
  245. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +23 -23
  246. package/contracts/oapps/oft/src/lib.rs +4 -2
  247. package/contracts/oapps/oft/src/oft.rs +31 -71
  248. package/contracts/oapps/oft/src/oft_impl.rs +201 -0
  249. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +2 -4
  250. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
  251. package/contracts/oapps/oft/src/storage.rs +2 -0
  252. package/contracts/oapps/oft/src/tests/extensions/setup.rs +60 -31
  253. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
  254. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
  255. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +6 -4
  256. package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
  257. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
  258. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  259. package/contracts/oapps/oft/src/tests/test_utils.rs +122 -81
  260. package/contracts/oapps/oft/src/types.rs +20 -0
  261. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  262. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  263. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  264. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  265. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  266. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  267. package/contracts/oapps/{counter/integration_tests → oft-std/integration-tests}/setup.rs +76 -30
  268. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  269. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  270. package/contracts/oapps/oft-std/src/oft.rs +141 -26
  271. package/contracts/upgrader/Cargo.toml +19 -0
  272. package/contracts/upgrader/src/lib.rs +96 -0
  273. package/contracts/upgrader/src/tests/mod.rs +1 -0
  274. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  275. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  276. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  277. package/contracts/utils/src/auth.rs +44 -0
  278. package/contracts/utils/src/errors.rs +32 -5
  279. package/contracts/utils/src/lib.rs +5 -1
  280. package/contracts/utils/src/multisig.rs +211 -0
  281. package/contracts/utils/src/ownable.rs +50 -60
  282. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  283. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  284. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  285. package/contracts/utils/src/tests/mod.rs +4 -1
  286. package/contracts/utils/src/tests/multisig.rs +731 -0
  287. package/contracts/utils/src/tests/option_ext.rs +18 -0
  288. package/contracts/utils/src/tests/ownable.rs +22 -70
  289. package/contracts/utils/src/tests/ttl_configurable.rs +607 -0
  290. package/contracts/utils/src/tests/upgradeable.rs +290 -0
  291. package/contracts/utils/src/ttl_configurable.rs +153 -0
  292. package/contracts/utils/src/ttl_extendable.rs +27 -0
  293. package/contracts/utils/src/upgradeable.rs +56 -0
  294. package/contracts/workers/dvn/Cargo.toml +2 -2
  295. package/contracts/workers/dvn/src/auth.rs +24 -35
  296. package/contracts/workers/dvn/src/dvn.rs +23 -14
  297. package/contracts/workers/dvn/src/errors.rs +1 -7
  298. package/contracts/workers/dvn/src/events.rs +1 -14
  299. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  300. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  301. package/contracts/workers/dvn/src/storage.rs +3 -13
  302. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  303. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  304. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  305. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  306. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  307. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  308. package/contracts/workers/dvn-fee-lib/Cargo.toml +0 -1
  309. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +45 -16
  310. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  311. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  312. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  313. package/contracts/workers/executor/src/auth.rs +80 -16
  314. package/contracts/workers/executor/src/executor.rs +17 -29
  315. package/contracts/workers/executor/src/storage.rs +2 -9
  316. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  317. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  318. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +153 -121
  319. package/contracts/workers/executor-helper/Cargo.toml +1 -6
  320. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  321. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  322. package/contracts/workers/price-feed/Cargo.toml +1 -2
  323. package/contracts/workers/price-feed/src/errors.rs +3 -2
  324. package/contracts/workers/price-feed/src/lib.rs +5 -6
  325. package/contracts/workers/price-feed/src/price_feed.rs +42 -23
  326. package/contracts/workers/worker/Cargo.toml +4 -0
  327. package/contracts/workers/worker/src/errors.rs +4 -0
  328. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  329. package/contracts/workers/worker/src/lib.rs +2 -2
  330. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  331. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  332. package/contracts/workers/worker/src/tests/worker.rs +502 -0
  333. package/contracts/workers/worker/src/worker.rs +28 -30
  334. package/package.json +8 -5
  335. package/sdk/.turbo/turbo-build.log +1 -0
  336. package/sdk/.turbo/turbo-test.log +1009 -0
  337. package/sdk/dist/generated/bml.d.ts +104 -37
  338. package/sdk/dist/generated/bml.js +83 -42
  339. package/sdk/dist/generated/counter.d.ts +334 -175
  340. package/sdk/dist/generated/counter.js +109 -63
  341. package/sdk/dist/generated/dvn.d.ts +1985 -0
  342. package/sdk/dist/generated/dvn.js +326 -0
  343. package/sdk/dist/generated/dvn_fee_lib.d.ts +690 -0
  344. package/sdk/dist/generated/dvn_fee_lib.js +163 -0
  345. package/sdk/dist/generated/endpoint.d.ts +155 -46
  346. package/sdk/dist/generated/endpoint.js +93 -50
  347. package/sdk/dist/generated/executor.d.ts +1841 -0
  348. package/sdk/dist/generated/executor.js +312 -0
  349. package/sdk/dist/generated/executor_fee_lib.d.ts +1083 -0
  350. package/sdk/dist/generated/executor_fee_lib.js +255 -0
  351. package/sdk/dist/generated/executor_helper.d.ts +981 -0
  352. package/sdk/dist/generated/executor_helper.js +236 -0
  353. package/sdk/dist/generated/oft_std.d.ts +1722 -0
  354. package/sdk/dist/generated/oft_std.js +316 -0
  355. package/sdk/dist/generated/price_feed.d.ts +1077 -0
  356. package/sdk/dist/generated/price_feed.js +210 -0
  357. package/sdk/dist/generated/sml.d.ts +171 -56
  358. package/sdk/dist/generated/sml.js +111 -62
  359. package/sdk/dist/generated/treasury.d.ts +896 -0
  360. package/sdk/dist/generated/treasury.js +219 -0
  361. package/sdk/dist/generated/uln302.d.ts +175 -75
  362. package/sdk/dist/generated/uln302.js +126 -82
  363. package/sdk/dist/generated/upgrader.d.ts +70 -0
  364. package/sdk/dist/generated/upgrader.js +19 -0
  365. package/sdk/dist/index.d.ts +10 -0
  366. package/sdk/dist/index.js +14 -0
  367. package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
  368. package/sdk/dist/wasm/blocked-message-lib.js +2 -0
  369. package/sdk/dist/wasm/counter.d.ts +1 -0
  370. package/sdk/dist/wasm/counter.js +2 -0
  371. package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
  372. package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
  373. package/sdk/dist/wasm/dvn.d.ts +1 -0
  374. package/sdk/dist/wasm/dvn.js +2 -0
  375. package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
  376. package/sdk/dist/wasm/endpoint-v2.js +2 -0
  377. package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
  378. package/sdk/dist/wasm/executor-fee-lib.js +2 -0
  379. package/sdk/dist/wasm/executor-helper.d.ts +1 -0
  380. package/sdk/dist/wasm/executor-helper.js +2 -0
  381. package/sdk/dist/wasm/executor.d.ts +1 -0
  382. package/sdk/dist/wasm/executor.js +2 -0
  383. package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
  384. package/sdk/dist/wasm/layerzero-views.js +2 -0
  385. package/sdk/dist/wasm/oft-std.d.ts +1 -0
  386. package/sdk/dist/wasm/oft-std.js +2 -0
  387. package/sdk/dist/wasm/price-feed.d.ts +1 -0
  388. package/sdk/dist/wasm/price-feed.js +2 -0
  389. package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
  390. package/sdk/dist/wasm/simple-message-lib.js +2 -0
  391. package/sdk/dist/wasm/treasury.d.ts +1 -0
  392. package/sdk/dist/wasm/treasury.js +2 -0
  393. package/sdk/dist/wasm/uln302.d.ts +1 -0
  394. package/sdk/dist/wasm/uln302.js +2 -0
  395. package/sdk/dist/wasm/upgrader.d.ts +1 -0
  396. package/sdk/dist/wasm/upgrader.js +2 -0
  397. package/sdk/dist/wasm.d.ts +15 -0
  398. package/sdk/dist/wasm.js +15 -0
  399. package/sdk/package.json +7 -4
  400. package/sdk/src/index.ts +17 -0
  401. package/sdk/test/counter-sml.test.ts +376 -0
  402. package/sdk/test/counter-uln.test.ts +493 -0
  403. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +187 -323
  404. package/sdk/test/suites/constants.ts +22 -2
  405. package/sdk/test/suites/dummyContractClient.ts +169 -0
  406. package/sdk/test/suites/globalSetup.ts +450 -0
  407. package/sdk/test/suites/localnet.ts +23 -6
  408. package/sdk/test/upgrader.test.ts +300 -0
  409. package/sdk/test/utils.ts +558 -85
  410. package/sdk/vitest.config.ts +21 -0
  411. package/tools/ts-bindings-gen/src/main.rs +12 -1
  412. package/turbo.json +2 -0
  413. package/contracts/common-macros/src/contract_impl.rs +0 -47
  414. package/contracts/common-macros/src/ownable.rs +0 -59
  415. package/contracts/common-macros/src/tests/contract_impl.rs +0 -381
  416. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -32
  417. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  418. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  419. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  420. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  421. package/contracts/oapp-macros/src/lib.rs +0 -154
  422. package/contracts/oapp-macros/src/oapp_core.rs +0 -40
  423. package/contracts/oapp-macros/src/oapp_full.rs +0 -21
  424. package/contracts/oapp-macros/src/oapp_options_type3.rs +0 -31
  425. package/contracts/oapp-macros/src/oapp_receiver.rs +0 -48
  426. package/contracts/oapp-macros/src/oapp_sender.rs +0 -21
  427. package/contracts/oapp-macros/src/util.rs +0 -107
  428. package/contracts/oapps/oft/src/constants.rs +0 -5
  429. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -146
  430. package/contracts/utils/src/tests/ttl.rs +0 -421
  431. package/contracts/utils/src/ttl.rs +0 -123
  432. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  433. package/contracts/workers/dvn/src/multisig.rs +0 -153
  434. package/sdk/test/index.test.ts +0 -376
  435. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
@@ -1,40 +1,50 @@
1
- use crate::{tests::endpoint_setup::setup, EndpointV2, FeeRecipient, FeesAndPacket};
2
- use soroban_sdk::{testutils::Address as _, Address, Bytes, Vec};
1
+ use soroban_sdk::{testutils::Address as _, Address, Env, Vec};
2
+
3
+ use crate::{
4
+ tests::endpoint_setup::{setup, TestSetup},
5
+ EndpointV2, FeeRecipient,
6
+ };
7
+
8
+ fn fee_recipients(env: &Env, recipients: &[(&Address, i128)]) -> Vec<FeeRecipient> {
9
+ let mut v = Vec::new(env);
10
+ for (to, amount) in recipients {
11
+ v.push_back(FeeRecipient { to: (*to).clone(), amount: *amount });
12
+ }
13
+ v
14
+ }
15
+
16
+ fn pay_messaging_fees(
17
+ context: &TestSetup,
18
+ pay_in_zro: bool,
19
+ native_fee_recipients: &Vec<FeeRecipient>,
20
+ zro_fee_recipients: &Vec<FeeRecipient>,
21
+ refund_address: &Address,
22
+ ) -> crate::MessagingFee {
23
+ let env = &context.env;
24
+ let endpoint_addr = &context.endpoint_client.address;
25
+ env.as_contract(endpoint_addr, || {
26
+ EndpointV2::pay_messaging_fees(env, pay_in_zro, native_fee_recipients, zro_fee_recipients, refund_address)
27
+ })
28
+ }
3
29
 
30
+ // Native fee distribution (payments + refunds)
4
31
  #[test]
5
32
  fn test_pay_native_fees_exact_amount() {
6
33
  let context = setup();
7
34
  let env = &context.env;
8
- let endpoint_client = &context.endpoint_client;
9
35
  let recipient = Address::generate(env);
10
36
  let refund_address = Address::generate(env);
11
37
 
12
- // Setup: Mint native tokens to endpoint
13
- context.mint_native(&endpoint_client.address, 100);
14
-
15
- let mut native_fee_recipients = Vec::new(env);
16
- native_fee_recipients.push_back(FeeRecipient { to: recipient.clone(), amount: 100 });
17
- let send_result =
18
- FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
19
-
20
- let fee = env.as_contract(&endpoint_client.address, || {
21
- EndpointV2::pay_messaging_fees(
22
- env,
23
- false,
24
- &send_result.native_fee_recipients,
25
- &send_result.zro_fee_recipients,
26
- &refund_address,
27
- )
28
- });
29
-
30
- // Verify fee was calculated correctly
38
+ // Setup: Mint native tokens to the endpoint contract.
39
+ context.mint_native(&context.endpoint_client.address, 100);
40
+
41
+ let native_fee_recipients = fee_recipients(env, &[(&recipient, 100)]);
42
+ let zro_fee_recipients = Vec::new(env);
43
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
44
+
31
45
  assert_eq!(fee.native_fee, 100);
32
46
  assert_eq!(fee.zro_fee, 0);
33
-
34
- // Verify recipient received payment
35
47
  assert_eq!(context.native_token_client.balance(&recipient), 100);
36
-
37
- // Verify no refund
38
48
  assert_eq!(context.native_token_client.balance(&refund_address), 0);
39
49
  }
40
50
 
@@ -42,77 +52,143 @@ fn test_pay_native_fees_exact_amount() {
42
52
  fn test_pay_native_fees_with_refund() {
43
53
  let context = setup();
44
54
  let env = &context.env;
45
- let endpoint_client = &context.endpoint_client;
46
55
  let recipient = Address::generate(env);
47
56
  let refund_address = Address::generate(env);
48
57
 
49
- // Setup: Mint more native tokens than needed
50
- context.mint_native(&endpoint_client.address, 200);
51
-
52
- let mut native_fee_recipients = Vec::new(env);
53
- native_fee_recipients.push_back(FeeRecipient { to: recipient.clone(), amount: 100 });
54
- let send_result =
55
- FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
56
-
57
- let fee = env.as_contract(&endpoint_client.address, || {
58
- EndpointV2::pay_messaging_fees(
59
- env,
60
- false,
61
- &send_result.native_fee_recipients,
62
- &send_result.zro_fee_recipients,
63
- &refund_address,
64
- )
65
- });
66
-
67
- // Verify fee was calculated correctly
58
+ // Setup: Mint more native tokens than needed.
59
+ context.mint_native(&context.endpoint_client.address, 200);
60
+
61
+ let native_fee_recipients = fee_recipients(env, &[(&recipient, 100)]);
62
+ let zro_fee_recipients = Vec::new(env);
63
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
64
+
68
65
  assert_eq!(fee.native_fee, 100);
69
66
  assert_eq!(fee.zro_fee, 0);
70
-
71
- // Verify recipient received payment
72
67
  assert_eq!(context.native_token_client.balance(&recipient), 100);
68
+ assert_eq!(context.native_token_client.balance(&refund_address), 100);
69
+ }
70
+
71
+ #[test]
72
+ fn test_pay_multiple_recipients_same_token() {
73
+ let context = setup();
74
+ let env = &context.env;
75
+ let recipient1 = Address::generate(env);
76
+ let recipient2 = Address::generate(env);
77
+ let recipient3 = Address::generate(env);
78
+ let refund_address = Address::generate(env);
79
+
80
+ // Setup: Mint native tokens.
81
+ context.mint_native(&context.endpoint_client.address, 300);
82
+
83
+ let native_fee_recipients = fee_recipients(env, &[(&recipient1, 100), (&recipient2, 150), (&recipient3, 50)]);
84
+ let zro_fee_recipients = Vec::new(env);
85
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
86
+
87
+ assert_eq!(fee.native_fee, 300);
88
+ assert_eq!(fee.zro_fee, 0);
89
+ assert_eq!(context.native_token_client.balance(&recipient1), 100);
90
+ assert_eq!(context.native_token_client.balance(&recipient2), 150);
91
+ assert_eq!(context.native_token_client.balance(&recipient3), 50);
92
+ assert_eq!(context.native_token_client.balance(&refund_address), 0);
93
+ }
94
+
95
+ #[test]
96
+ fn test_pay_fees_with_zero_amounts_skipped() {
97
+ let context = setup();
98
+ let env = &context.env;
99
+ let recipient1 = Address::generate(env);
100
+ let recipient2 = Address::generate(env);
101
+ let refund_address = Address::generate(env);
102
+
103
+ // Setup: Mint native tokens.
104
+ context.mint_native(&context.endpoint_client.address, 100);
105
+
106
+ let native_fee_recipients = fee_recipients(env, &[(&recipient1, 100), (&recipient2, 0)]); // Zero amount.
107
+ let zro_fee_recipients = Vec::new(env);
108
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
109
+
110
+ assert_eq!(fee.native_fee, 100);
111
+ assert_eq!(fee.zro_fee, 0);
112
+ assert_eq!(context.native_token_client.balance(&recipient1), 100);
113
+ assert_eq!(context.native_token_client.balance(&recipient2), 0);
114
+ }
115
+
116
+ #[test]
117
+ fn test_pay_native_fees_all_zero_amounts_refunds_all_native() {
118
+ let context = setup();
119
+ let env = &context.env;
120
+ let recipient1 = Address::generate(env);
121
+ let recipient2 = Address::generate(env);
122
+ let refund_address = Address::generate(env);
123
+
124
+ // Setup: Mint native tokens to the endpoint contract.
125
+ context.mint_native(&context.endpoint_client.address, 100);
73
126
 
74
- // Verify refund (200 - 100 = 100)
127
+ // All recipients have amount=0, so no native fees are paid and all native balance is refunded.
128
+ let native_fee_recipients = fee_recipients(env, &[(&recipient1, 0), (&recipient2, 0)]);
129
+ let zro_fee_recipients = Vec::new(env);
130
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
131
+
132
+ assert_eq!(fee.native_fee, 0);
133
+ assert_eq!(fee.zro_fee, 0);
134
+ assert_eq!(context.native_token_client.balance(&recipient1), 0);
135
+ assert_eq!(context.native_token_client.balance(&recipient2), 0);
75
136
  assert_eq!(context.native_token_client.balance(&refund_address), 100);
76
137
  }
77
138
 
139
+ #[test]
140
+ fn test_pay_fees_with_empty_recipients() {
141
+ let context = setup();
142
+ let env = &context.env;
143
+ let refund_address = Address::generate(env);
144
+
145
+ // Setup: Mint tokens.
146
+ context.mint_native(&context.endpoint_client.address, 100);
147
+
148
+ let native_fee_recipients = Vec::new(env);
149
+ let zro_fee_recipients = Vec::new(env);
150
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
151
+
152
+ assert_eq!(fee.native_fee, 0);
153
+ assert_eq!(fee.zro_fee, 0);
154
+ assert_eq!(context.native_token_client.balance(&refund_address), 100);
155
+ }
156
+
157
+ #[test]
158
+ #[should_panic(expected = "Error(Contract, #6)")] // EndpointError::InsufficientNativeFee
159
+ fn test_panic_pay_native_fees_insufficient_balance() {
160
+ let context = setup();
161
+ let env = &context.env;
162
+ let recipient = Address::generate(env);
163
+ let refund_address = Address::generate(env);
164
+
165
+ // Setup: Mint less native balance than required by the recipients list.
166
+ context.mint_native(&context.endpoint_client.address, 50);
167
+
168
+ let native_fee_recipients = fee_recipients(env, &[(&recipient, 100)]);
169
+ let zro_fee_recipients = Vec::new(env);
170
+
171
+ pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
172
+ }
173
+
174
+ // ZRO fee distribution (payments + refunds)
78
175
  #[test]
79
176
  fn test_pay_zro_fees_exact_amount() {
80
177
  let context = setup();
81
178
  let env = &context.env;
82
- let endpoint_client = &context.endpoint_client;
83
179
  let recipient = Address::generate(env);
84
180
  let refund_address = Address::generate(env);
85
181
 
86
- // Setup: Set ZRO token
87
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
88
- endpoint_client.set_zro(&context.zro_token_client.address);
89
-
90
- // Mint ZRO tokens to endpoint
91
- context.mint_zro(&endpoint_client.address, 50);
92
-
93
- let mut zro_fee_recipients = Vec::new(env);
94
- zro_fee_recipients.push_back(FeeRecipient { to: recipient.clone(), amount: 50 });
95
- let send_result =
96
- FeesAndPacket { native_fee_recipients: Vec::new(env), zro_fee_recipients, encoded_packet: Bytes::new(env) };
97
-
98
- let fee = env.as_contract(&endpoint_client.address, || {
99
- EndpointV2::pay_messaging_fees(
100
- env,
101
- true,
102
- &send_result.native_fee_recipients,
103
- &send_result.zro_fee_recipients,
104
- &refund_address,
105
- )
106
- });
107
-
108
- // Verify fee was calculated correctly
182
+ context.setup_zro_with_auth();
183
+ context.mint_zro(&context.endpoint_client.address, 50);
184
+
185
+ let native_fee_recipients = Vec::new(env);
186
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient, 50)]);
187
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
188
+
109
189
  assert_eq!(fee.native_fee, 0);
110
190
  assert_eq!(fee.zro_fee, 50);
111
-
112
- // Verify recipient received payment
113
191
  assert_eq!(context.zro_token_client.balance(&recipient), 50);
114
-
115
- // Verify no refund
116
192
  assert_eq!(context.zro_token_client.balance(&refund_address), 0);
117
193
  }
118
194
 
@@ -120,305 +196,236 @@ fn test_pay_zro_fees_exact_amount() {
120
196
  fn test_pay_zro_fees_with_refund() {
121
197
  let context = setup();
122
198
  let env = &context.env;
123
- let endpoint_client = &context.endpoint_client;
124
199
  let recipient = Address::generate(env);
125
200
  let refund_address = Address::generate(env);
126
201
 
127
- // Setup: Set ZRO token
128
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
129
- endpoint_client.set_zro(&context.zro_token_client.address);
130
-
131
- // Mint more ZRO tokens than needed
132
- context.mint_zro(&endpoint_client.address, 100);
133
-
134
- let mut zro_fee_recipients = Vec::new(env);
135
- zro_fee_recipients.push_back(FeeRecipient { to: recipient.clone(), amount: 50 });
136
- let send_result =
137
- FeesAndPacket { native_fee_recipients: Vec::new(env), zro_fee_recipients, encoded_packet: Bytes::new(env) };
138
-
139
- let fee = env.as_contract(&endpoint_client.address, || {
140
- EndpointV2::pay_messaging_fees(
141
- env,
142
- true,
143
- &send_result.native_fee_recipients,
144
- &send_result.zro_fee_recipients,
145
- &refund_address,
146
- )
147
- });
148
-
149
- // Verify fee was calculated correctly
202
+ context.setup_zro_with_auth();
203
+ context.mint_zro(&context.endpoint_client.address, 100);
204
+
205
+ let native_fee_recipients = Vec::new(env);
206
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient, 50)]);
207
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
208
+
150
209
  assert_eq!(fee.native_fee, 0);
151
210
  assert_eq!(fee.zro_fee, 50);
152
-
153
- // Verify recipient received payment
154
211
  assert_eq!(context.zro_token_client.balance(&recipient), 50);
155
-
156
- // Verify refund (100 - 50 = 50)
157
212
  assert_eq!(context.zro_token_client.balance(&refund_address), 50);
158
213
  }
159
214
 
160
215
  #[test]
161
- fn test_pay_mixed_native_and_zro_fees() {
216
+ fn test_pay_zro_fees_multiple_recipients_zero_amounts_skipped_and_refunded() {
162
217
  let context = setup();
163
218
  let env = &context.env;
164
- let endpoint_client = &context.endpoint_client;
165
- let native_recipient = Address::generate(env);
166
- let zro_recipient = Address::generate(env);
219
+ let recipient1 = Address::generate(env);
220
+ let recipient2 = Address::generate(env);
221
+ let recipient3 = Address::generate(env);
167
222
  let refund_address = Address::generate(env);
168
223
 
169
- // Setup: Set ZRO token
170
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
171
- endpoint_client.set_zro(&context.zro_token_client.address);
172
-
173
- // Mint both types of tokens
174
- context.mint_native(&endpoint_client.address, 100);
175
- context.mint_zro(&endpoint_client.address, 50);
176
-
177
- let mut native_fee_recipients = Vec::new(env);
178
- native_fee_recipients.push_back(FeeRecipient { to: native_recipient.clone(), amount: 100 });
179
- let mut zro_fee_recipients = Vec::new(env);
180
- zro_fee_recipients.push_back(FeeRecipient { to: zro_recipient.clone(), amount: 50 });
181
- let send_result = FeesAndPacket { native_fee_recipients, zro_fee_recipients, encoded_packet: Bytes::new(env) };
182
-
183
- let fee = env.as_contract(&endpoint_client.address, || {
184
- EndpointV2::pay_messaging_fees(
185
- env,
186
- true,
187
- &send_result.native_fee_recipients,
188
- &send_result.zro_fee_recipients,
189
- &refund_address,
190
- )
191
- });
192
-
193
- // Verify fees were calculated correctly
194
- assert_eq!(fee.native_fee, 100);
195
- assert_eq!(fee.zro_fee, 50);
224
+ context.setup_zro_with_auth();
225
+ // Mint more ZRO than needed to ensure we exercise the refund path.
226
+ context.mint_zro(&context.endpoint_client.address, 100);
196
227
 
197
- // Verify recipients received payments
198
- assert_eq!(context.native_token_client.balance(&native_recipient), 100);
199
- assert_eq!(context.zro_token_client.balance(&zro_recipient), 50);
228
+ let native_fee_recipients = Vec::new(env);
229
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient1, 40), (&recipient2, 0), (&recipient3, 50)]);
230
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
200
231
 
201
- // Verify no refunds
202
- assert_eq!(context.native_token_client.balance(&refund_address), 0);
203
- assert_eq!(context.zro_token_client.balance(&refund_address), 0);
232
+ assert_eq!(fee.native_fee, 0);
233
+ assert_eq!(fee.zro_fee, 90);
234
+ assert_eq!(context.zro_token_client.balance(&recipient1), 40);
235
+ assert_eq!(context.zro_token_client.balance(&recipient2), 0);
236
+ assert_eq!(context.zro_token_client.balance(&recipient3), 50);
237
+ assert_eq!(context.zro_token_client.balance(&refund_address), 10); // 100 - 90
204
238
  }
205
239
 
240
+ // ZRO prerequisites / edge cases
206
241
  #[test]
207
- fn test_pay_multiple_recipients_same_token() {
242
+ #[should_panic(expected = "Error(Contract, #25)")] // EndpointError::ZROUnavailable
243
+ fn test_panic_pay_in_zro_without_zro_configured() {
208
244
  let context = setup();
209
245
  let env = &context.env;
210
- let endpoint_client = &context.endpoint_client;
211
- let recipient1 = Address::generate(env);
212
- let recipient2 = Address::generate(env);
213
- let recipient3 = Address::generate(env);
214
246
  let refund_address = Address::generate(env);
215
247
 
216
- // Setup: Mint native tokens
217
- context.mint_native(&endpoint_client.address, 300);
218
-
219
- let mut native_fee_recipients = Vec::new(env);
220
- native_fee_recipients.push_back(FeeRecipient { to: recipient1.clone(), amount: 100 });
221
- native_fee_recipients.push_back(FeeRecipient { to: recipient2.clone(), amount: 150 });
222
- native_fee_recipients.push_back(FeeRecipient { to: recipient3.clone(), amount: 50 });
223
- let send_result =
224
- FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
225
-
226
- let fee = env.as_contract(&endpoint_client.address, || {
227
- EndpointV2::pay_messaging_fees(
228
- env,
229
- false,
230
- &send_result.native_fee_recipients,
231
- &send_result.zro_fee_recipients,
232
- &refund_address,
233
- )
234
- });
235
-
236
- // Verify total fee
237
- assert_eq!(fee.native_fee, 300);
238
- assert_eq!(fee.zro_fee, 0);
248
+ // pay_in_zro=true without configuring the ZRO token must panic.
249
+ let native_fee_recipients = Vec::new(env);
250
+ let zro_fee_recipients = Vec::new(env);
251
+ pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
252
+ }
239
253
 
240
- // Verify each recipient received correct amount
241
- assert_eq!(context.native_token_client.balance(&recipient1), 100);
242
- assert_eq!(context.native_token_client.balance(&recipient2), 150);
243
- assert_eq!(context.native_token_client.balance(&recipient3), 50);
254
+ #[test]
255
+ #[should_panic(expected = "Error(Contract, #24)")] // EndpointError::ZeroZROFee
256
+ fn test_panic_pay_in_zro_with_zero_zro_balance() {
257
+ let context = setup();
258
+ let env = &context.env;
259
+ let refund_address = Address::generate(env);
244
260
 
245
- // Verify no refund
246
- assert_eq!(context.native_token_client.balance(&refund_address), 0);
261
+ context.setup_zro_with_auth();
262
+ // Note: no ZRO is minted to the endpoint contract, so its ZRO balance is 0.
263
+
264
+ let native_fee_recipients = Vec::new(env);
265
+ let recipient = Address::generate(env);
266
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient, 1)]);
267
+
268
+ pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
247
269
  }
248
270
 
249
271
  #[test]
250
- fn test_pay_fees_with_zero_amounts_skipped() {
272
+ fn test_pay_in_zro_with_empty_zro_recipients_refunds_all_zro() {
251
273
  let context = setup();
252
274
  let env = &context.env;
253
- let endpoint_client = &context.endpoint_client;
254
- let recipient1 = Address::generate(env);
255
- let recipient2 = Address::generate(env);
256
275
  let refund_address = Address::generate(env);
257
276
 
258
- // Setup: Mint native tokens
259
- context.mint_native(&endpoint_client.address, 100);
260
-
261
- let mut native_fee_recipients = Vec::new(env);
262
- native_fee_recipients.push_back(FeeRecipient { to: recipient1.clone(), amount: 100 });
263
- native_fee_recipients.push_back(FeeRecipient { to: recipient2.clone(), amount: 0 }); // Zero amount
264
- let send_result =
265
- FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
266
-
267
- let fee = env.as_contract(&endpoint_client.address, || {
268
- EndpointV2::pay_messaging_fees(
269
- env,
270
- false,
271
- &send_result.native_fee_recipients,
272
- &send_result.zro_fee_recipients,
273
- &refund_address,
274
- )
275
- });
276
-
277
- // Verify only non-zero fees were paid
278
- assert_eq!(fee.native_fee, 100);
279
- assert_eq!(context.native_token_client.balance(&recipient1), 100);
280
- assert_eq!(context.native_token_client.balance(&recipient2), 0);
277
+ context.setup_zro_with_auth();
278
+ context.mint_zro(&context.endpoint_client.address, 40);
279
+
280
+ // No ZRO recipients => no ZRO payments, but remaining ZRO must be refunded.
281
+ let native_fee_recipients = Vec::new(env);
282
+ let zro_fee_recipients = Vec::new(env);
283
+
284
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
285
+ assert_eq!(fee.native_fee, 0);
286
+ assert_eq!(fee.zro_fee, 0);
287
+ assert_eq!(context.zro_token_client.balance(&refund_address), 40);
281
288
  }
282
289
 
283
290
  #[test]
284
- #[should_panic(expected = "Error(Contract, #6)")]
285
- fn test_panic_pay_native_fees_insufficient_balance() {
291
+ fn test_pay_in_zro_with_all_zero_zro_recipients_refunds_all_zro() {
286
292
  let context = setup();
287
293
  let env = &context.env;
288
- let endpoint_client = &context.endpoint_client;
289
- let recipient = Address::generate(env);
294
+ let recipient1 = Address::generate(env);
295
+ let recipient2 = Address::generate(env);
290
296
  let refund_address = Address::generate(env);
291
297
 
292
- // Setup: Mint less than required
293
- context.mint_native(&endpoint_client.address, 50);
294
-
295
- let mut native_fee_recipients = Vec::new(env);
296
- native_fee_recipients.push_back(FeeRecipient { to: recipient.clone(), amount: 100 });
297
- let send_result =
298
- FeesAndPacket { native_fee_recipients, zro_fee_recipients: Vec::new(env), encoded_packet: Bytes::new(env) };
299
-
300
- // Should panic with InsufficientNativeFee error (code 27)
301
- env.as_contract(&endpoint_client.address, || {
302
- EndpointV2::pay_messaging_fees(
303
- env,
304
- false,
305
- &send_result.native_fee_recipients,
306
- &send_result.zro_fee_recipients,
307
- &refund_address,
308
- )
309
- });
298
+ context.setup_zro_with_auth();
299
+ context.mint_zro(&context.endpoint_client.address, 40);
300
+
301
+ // A non-empty recipients list with all amount=0 should behave like an empty list:
302
+ // no ZRO is paid, and all ZRO balance is refunded.
303
+ let native_fee_recipients = Vec::new(env);
304
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient1, 0), (&recipient2, 0)]);
305
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
306
+
307
+ assert_eq!(fee.native_fee, 0);
308
+ assert_eq!(fee.zro_fee, 0);
309
+ assert_eq!(context.zro_token_client.balance(&recipient1), 0);
310
+ assert_eq!(context.zro_token_client.balance(&recipient2), 0);
311
+ assert_eq!(context.zro_token_client.balance(&refund_address), 40);
310
312
  }
311
313
 
312
314
  #[test]
313
- #[should_panic(expected = "Error(Contract, #7)")]
315
+ #[should_panic(expected = "Error(Contract, #7)")] // EndpointError::InsufficientZroFee
314
316
  fn test_panic_pay_zro_fees_insufficient_balance() {
315
317
  let context = setup();
316
318
  let env = &context.env;
317
- let endpoint_client = &context.endpoint_client;
318
319
  let recipient = Address::generate(env);
319
320
  let refund_address = Address::generate(env);
320
321
 
321
- // Setup: Set ZRO token
322
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
323
- endpoint_client.set_zro(&context.zro_token_client.address);
324
-
325
- // Mint less ZRO than required
326
- context.mint_zro(&endpoint_client.address, 25);
327
-
328
- let mut zro_fee_recipients = Vec::new(env);
329
- zro_fee_recipients.push_back(FeeRecipient { to: recipient.clone(), amount: 50 });
330
- let send_result =
331
- FeesAndPacket { native_fee_recipients: Vec::new(env), zro_fee_recipients, encoded_packet: Bytes::new(env) };
332
-
333
- // Should panic with InsufficientZroFee error (code 28)
334
- env.as_contract(&endpoint_client.address, || {
335
- EndpointV2::pay_messaging_fees(
336
- env,
337
- true,
338
- &send_result.native_fee_recipients,
339
- &send_result.zro_fee_recipients,
340
- &refund_address,
341
- )
342
- });
322
+ context.setup_zro_with_auth();
323
+ context.mint_zro(&context.endpoint_client.address, 25);
324
+
325
+ let native_fee_recipients = Vec::new(env);
326
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient, 50)]);
327
+
328
+ pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
343
329
  }
344
330
 
331
+ // Mixed native + ZRO fee behavior
345
332
  #[test]
346
- fn test_pay_fees_with_empty_recipients() {
333
+ fn test_pay_mixed_native_and_zro_fees() {
347
334
  let context = setup();
348
335
  let env = &context.env;
349
- let endpoint_client = &context.endpoint_client;
336
+ let native_recipient = Address::generate(env);
337
+ let zro_recipient = Address::generate(env);
350
338
  let refund_address = Address::generate(env);
351
339
 
352
- // Setup: Mint tokens
353
- context.mint_native(&endpoint_client.address, 100);
354
-
355
- let send_result = FeesAndPacket {
356
- native_fee_recipients: Vec::new(env),
357
- zro_fee_recipients: Vec::new(env),
358
- encoded_packet: Bytes::new(env),
359
- };
360
-
361
- let fee = env.as_contract(&endpoint_client.address, || {
362
- EndpointV2::pay_messaging_fees(
363
- env,
364
- false,
365
- &send_result.native_fee_recipients,
366
- &send_result.zro_fee_recipients,
367
- &refund_address,
368
- )
369
- });
370
-
371
- // Verify no fees paid
372
- assert_eq!(fee.native_fee, 0);
373
- assert_eq!(fee.zro_fee, 0);
340
+ context.setup_zro_with_auth();
341
+ context.mint_native(&context.endpoint_client.address, 100);
342
+ context.mint_zro(&context.endpoint_client.address, 50);
374
343
 
375
- // Verify all balance refunded
376
- assert_eq!(context.native_token_client.balance(&refund_address), 100);
344
+ let native_fee_recipients = fee_recipients(env, &[(&native_recipient, 100)]);
345
+ let zro_fee_recipients = fee_recipients(env, &[(&zro_recipient, 50)]);
346
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
347
+
348
+ assert_eq!(fee.native_fee, 100);
349
+ assert_eq!(fee.zro_fee, 50);
350
+ assert_eq!(context.native_token_client.balance(&native_recipient), 100);
351
+ assert_eq!(context.zro_token_client.balance(&zro_recipient), 50);
352
+ assert_eq!(context.native_token_client.balance(&refund_address), 0);
353
+ assert_eq!(context.zro_token_client.balance(&refund_address), 0);
377
354
  }
378
355
 
379
356
  #[test]
380
357
  fn test_pay_fees_with_mixed_zero_and_nonzero_amounts() {
381
358
  let context = setup();
382
359
  let env = &context.env;
383
- let endpoint_client = &context.endpoint_client;
384
360
  let recipient1 = Address::generate(env);
385
361
  let recipient2 = Address::generate(env);
386
362
  let recipient3 = Address::generate(env);
387
363
  let refund_address = Address::generate(env);
388
364
 
389
- // Setup
390
- context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
391
- endpoint_client.set_zro(&context.zro_token_client.address);
392
- context.mint_native(&endpoint_client.address, 150);
393
- context.mint_zro(&endpoint_client.address, 75);
394
-
395
- let mut native_fee_recipients = Vec::new(env);
396
- native_fee_recipients.push_back(FeeRecipient { to: recipient1.clone(), amount: 100 });
397
- let mut zro_fee_recipients = Vec::new(env);
398
- zro_fee_recipients.push_back(FeeRecipient { to: recipient2.clone(), amount: 0 }); // Zero ZRO
399
- zro_fee_recipients.push_back(FeeRecipient { to: recipient3.clone(), amount: 50 });
400
- let send_result = FeesAndPacket { native_fee_recipients, zro_fee_recipients, encoded_packet: Bytes::new(env) };
401
-
402
- let fee = env.as_contract(&endpoint_client.address, || {
403
- EndpointV2::pay_messaging_fees(
404
- env,
405
- true,
406
- &send_result.native_fee_recipients,
407
- &send_result.zro_fee_recipients,
408
- &refund_address,
409
- )
410
- });
411
-
412
- // Verify fees
365
+ context.setup_zro_with_auth();
366
+ context.mint_native(&context.endpoint_client.address, 150);
367
+ context.mint_zro(&context.endpoint_client.address, 75);
368
+
369
+ let native_fee_recipients = fee_recipients(env, &[(&recipient1, 100)]);
370
+ let zro_fee_recipients = fee_recipients(env, &[(&recipient2, 0), (&recipient3, 50)]); // Zero ZRO.
371
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
372
+
413
373
  assert_eq!(fee.native_fee, 100);
414
374
  assert_eq!(fee.zro_fee, 50);
415
-
416
- // Verify payments
417
375
  assert_eq!(context.native_token_client.balance(&recipient1), 100);
418
376
  assert_eq!(context.zro_token_client.balance(&recipient2), 0);
419
377
  assert_eq!(context.zro_token_client.balance(&recipient3), 50);
420
-
421
- // Verify refunds (150-100=50 native, 75-50=25 zro)
422
378
  assert_eq!(context.native_token_client.balance(&refund_address), 50);
423
379
  assert_eq!(context.zro_token_client.balance(&refund_address), 25);
424
380
  }
381
+
382
+ #[test]
383
+ fn test_pay_in_zro_still_refunds_native_balance() {
384
+ let context = setup();
385
+ let env = &context.env;
386
+ let refund_address = Address::generate(env);
387
+
388
+ context.setup_zro_with_auth();
389
+
390
+ // Mint native to the endpoint but provide no native recipients => all native is refunded.
391
+ context.mint_native(&context.endpoint_client.address, 100);
392
+
393
+ // Also pay a ZRO fee to ensure the ZRO path executes normally.
394
+ context.mint_zro(&context.endpoint_client.address, 50);
395
+ let zro_recipient = Address::generate(env);
396
+
397
+ let native_fee_recipients = Vec::new(env);
398
+ let zro_fee_recipients = fee_recipients(env, &[(&zro_recipient, 50)]);
399
+
400
+ let fee = pay_messaging_fees(&context, true, &native_fee_recipients, &zro_fee_recipients, &refund_address);
401
+ assert_eq!(fee.native_fee, 0);
402
+ assert_eq!(fee.zro_fee, 50);
403
+
404
+ // Native refund happens even when pay_in_zro=true.
405
+ assert_eq!(context.native_token_client.balance(&refund_address), 100);
406
+ assert_eq!(context.zro_token_client.balance(&refund_address), 0);
407
+ }
408
+
409
+ // The pay_in_zro flag behavior
410
+ #[test]
411
+ fn test_pay_in_native_does_not_touch_zro_even_if_provided() {
412
+ let context = setup();
413
+ let env = &context.env;
414
+ let refund_address = Address::generate(env);
415
+
416
+ // Mint ZRO to endpoint, but pay_in_zro=false should ignore ZRO recipients/balances entirely.
417
+ context.mint_zro(&context.endpoint_client.address, 30);
418
+
419
+ let native_fee_recipients = Vec::new(env);
420
+ let zro_recipient = Address::generate(env);
421
+ let zro_fee_recipients = fee_recipients(env, &[(&zro_recipient, 10)]);
422
+
423
+ let fee = pay_messaging_fees(&context, false, &native_fee_recipients, &zro_fee_recipients, &refund_address);
424
+ assert_eq!(fee.native_fee, 0);
425
+ assert_eq!(fee.zro_fee, 0);
426
+
427
+ // No ZRO payments or refunds when pay_in_zro=false.
428
+ assert_eq!(context.zro_token_client.balance(&zro_recipient), 0);
429
+ assert_eq!(context.zro_token_client.balance(&refund_address), 0);
430
+ assert_eq!(context.zro_token_client.balance(&context.endpoint_client.address), 30);
431
+ }