@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.15

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 (319) hide show
  1. package/.turbo/turbo-build.log +384 -278
  2. package/.turbo/turbo-lint.log +110 -78
  3. package/.turbo/turbo-test.log +1248 -1014
  4. package/Cargo.lock +130 -3
  5. package/Cargo.toml +2 -1
  6. package/contracts/common-macros/src/contract_impl.rs +6 -1
  7. package/contracts/common-macros/src/lib.rs +47 -8
  8. package/contracts/common-macros/src/ownable.rs +7 -25
  9. package/contracts/common-macros/src/storage.rs +1 -1
  10. package/contracts/common-macros/src/tests/contract_impl.rs +5 -0
  11. package/contracts/common-macros/src/tests/mod.rs +1 -0
  12. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +23 -7
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +5 -25
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +5 -25
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  17. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  18. package/contracts/common-macros/src/ttl_configurable.rs +14 -44
  19. package/contracts/common-macros/src/upgradeable.rs +76 -0
  20. package/contracts/endpoint-v2/src/endpoint_v2.rs +25 -1
  21. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  22. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  23. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  30. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  31. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  32. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +61 -9
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  42. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  43. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  44. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  45. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  46. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  47. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  48. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  49. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  50. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  51. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  52. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  53. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  54. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  55. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +3 -5
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +15 -1
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  78. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  80. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  83. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  84. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  85. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  86. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  87. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  88. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  89. package/contracts/layerzero-views/Cargo.toml +35 -0
  90. package/contracts/layerzero-views/src/errors.rs +10 -0
  91. package/contracts/layerzero-views/src/layerzero_view.rs +229 -0
  92. package/contracts/layerzero-views/src/lib.rs +38 -0
  93. package/contracts/layerzero-views/src/storage.rs +18 -0
  94. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  95. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  96. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  97. package/contracts/layerzero-views/src/types.rs +50 -0
  98. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  99. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  100. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  101. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  102. package/contracts/macro-integration-tests/tests/runtime/ownable/only_owner_guard.rs +97 -0
  103. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  104. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  105. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  106. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  107. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  108. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  109. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  110. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +50 -0
  111. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  112. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +3 -0
  113. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  114. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  115. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  117. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  118. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  119. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  121. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  124. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  125. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.rs +22 -0
  126. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.stderr +16 -0
  127. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  128. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +22 -0
  129. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_owner_env_param_variants.rs +46 -0
  130. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  131. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  133. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  135. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  137. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  139. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  140. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  141. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  142. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  143. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  155. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  156. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  157. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  158. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  159. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  160. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  161. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  162. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  163. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  164. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  165. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  166. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  167. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  168. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  169. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +50 -0
  170. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +74 -0
  171. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  172. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  173. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  174. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  175. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  176. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  177. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +2 -2
  178. package/contracts/message-libs/treasury/src/errors.rs +0 -1
  179. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  180. package/contracts/message-libs/treasury/src/storage.rs +2 -0
  181. package/contracts/message-libs/treasury/src/treasury.rs +12 -13
  182. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  183. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  184. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  185. package/contracts/message-libs/uln-302/src/receive_uln.rs +24 -54
  186. package/contracts/message-libs/uln-302/src/send_uln.rs +89 -135
  187. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  188. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  189. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  190. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  191. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  192. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  193. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  194. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  195. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  196. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  197. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  198. package/contracts/message-libs/uln-302/src/uln302.rs +8 -5
  199. package/contracts/oapps/counter/src/counter.rs +0 -1
  200. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +306 -224
  201. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -1
  202. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -1
  203. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -1
  204. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -1
  205. package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_core.rs +1 -0
  206. package/contracts/oapps/oft/integration-tests/setup.rs +10 -3
  207. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  208. package/contracts/oapps/oft/src/default_oft_impl.rs +9 -3
  209. package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -5
  210. package/contracts/oapps/oft/src/extensions/pausable.rs +1 -1
  211. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +18 -18
  212. package/contracts/oapps/oft/src/oft.rs +9 -9
  213. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  214. package/contracts/oapps/oft/src/tests/extensions/setup.rs +26 -11
  215. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +1 -1
  216. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  217. package/contracts/oapps/oft/src/tests/test_utils.rs +93 -74
  218. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  219. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  220. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  221. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  222. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  223. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  224. package/contracts/oapps/oft-std/integration-tests/setup.rs +245 -0
  225. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  226. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  227. package/contracts/oapps/oft-std/src/oft.rs +122 -25
  228. package/contracts/upgrader/Cargo.toml +19 -0
  229. package/contracts/upgrader/src/lib.rs +96 -0
  230. package/contracts/upgrader/src/tests/mod.rs +1 -0
  231. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  232. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  233. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  234. package/contracts/utils/src/errors.rs +6 -1
  235. package/contracts/utils/src/lib.rs +2 -1
  236. package/contracts/utils/src/ownable.rs +49 -61
  237. package/contracts/utils/src/tests/mod.rs +3 -1
  238. package/contracts/utils/src/tests/option_ext.rs +21 -0
  239. package/contracts/utils/src/tests/ownable.rs +10 -69
  240. package/contracts/utils/src/tests/ttl_configurable.rs +596 -0
  241. package/contracts/utils/src/tests/upgradeable.rs +288 -0
  242. package/contracts/utils/src/{ttl.rs → ttl_configurable.rs} +67 -52
  243. package/contracts/utils/src/upgradeable.rs +54 -0
  244. package/contracts/workers/dvn/Cargo.toml +1 -1
  245. package/contracts/workers/dvn/src/auth.rs +21 -32
  246. package/contracts/workers/dvn/src/dvn.rs +40 -3
  247. package/contracts/workers/dvn/src/errors.rs +1 -0
  248. package/contracts/workers/dvn/src/multisig.rs +10 -6
  249. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -2
  250. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +4 -4
  251. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -2
  252. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +46 -14
  253. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  254. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  255. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  256. package/contracts/workers/executor/src/executor.rs +16 -2
  257. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  258. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +154 -119
  259. package/contracts/workers/executor-helper/Cargo.toml +0 -5
  260. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  261. package/contracts/workers/price-feed/Cargo.toml +0 -1
  262. package/contracts/workers/price-feed/src/errors.rs +3 -2
  263. package/contracts/workers/price-feed/src/lib.rs +5 -6
  264. package/contracts/workers/price-feed/src/price_feed.rs +39 -17
  265. package/contracts/workers/worker/Cargo.toml +4 -0
  266. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  267. package/contracts/workers/worker/src/lib.rs +2 -2
  268. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  269. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  270. package/contracts/workers/worker/src/tests/worker.rs +501 -0
  271. package/contracts/workers/worker/src/worker.rs +10 -16
  272. package/package.json +3 -3
  273. package/sdk/dist/generated/bml.d.ts +40 -30
  274. package/sdk/dist/generated/bml.js +16 -11
  275. package/sdk/dist/generated/counter.d.ts +168 -134
  276. package/sdk/dist/generated/counter.js +26 -21
  277. package/sdk/dist/generated/dvn.d.ts +1932 -0
  278. package/sdk/dist/generated/dvn.js +288 -0
  279. package/sdk/dist/generated/dvn_fee_lib.d.ts +615 -0
  280. package/sdk/dist/generated/dvn_fee_lib.js +123 -0
  281. package/sdk/dist/generated/endpoint.d.ts +75 -41
  282. package/sdk/dist/generated/endpoint.js +22 -17
  283. package/sdk/dist/generated/executor.d.ts +1809 -0
  284. package/sdk/dist/generated/executor.js +269 -0
  285. package/sdk/dist/generated/executor_fee_lib.d.ts +999 -0
  286. package/sdk/dist/generated/executor_fee_lib.js +208 -0
  287. package/sdk/dist/generated/executor_helper.d.ts +869 -0
  288. package/sdk/dist/generated/executor_helper.js +187 -0
  289. package/sdk/dist/generated/oft_std.d.ts +1544 -0
  290. package/sdk/dist/generated/oft_std.js +271 -0
  291. package/sdk/dist/generated/price_feed.d.ts +1002 -0
  292. package/sdk/dist/generated/price_feed.js +170 -0
  293. package/sdk/dist/generated/sml.d.ts +75 -41
  294. package/sdk/dist/generated/sml.js +22 -17
  295. package/sdk/dist/generated/uln302.d.ts +79 -60
  296. package/sdk/dist/generated/uln302.js +37 -37
  297. package/sdk/dist/generated/upgrader.d.ts +70 -0
  298. package/sdk/dist/generated/upgrader.js +19 -0
  299. package/sdk/dist/index.d.ts +8 -0
  300. package/sdk/dist/index.js +11 -0
  301. package/sdk/package.json +4 -3
  302. package/sdk/src/index.ts +13 -0
  303. package/sdk/test/index.test.ts +0 -1
  304. package/sdk/test/oft.test.ts +12 -23
  305. package/sdk/test/suites/testUpgradeable.ts +169 -0
  306. package/sdk/test/upgrader.test.ts +309 -0
  307. package/tools/ts-bindings-gen/src/main.rs +11 -1
  308. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  309. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  310. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  311. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  312. package/contracts/utils/src/tests/ttl.rs +0 -421
  313. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
  314. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/lib.rs +0 -0
  315. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_full.rs +0 -0
  316. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_options_type3.rs +0 -0
  317. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_receiver.rs +0 -0
  318. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_sender.rs +0 -0
  319. /package/contracts/{oapp-macros → oapps/oapp-macros}/src/util.rs +0 -0
@@ -0,0 +1,157 @@
1
+ //! OFT Fee extension e2e tests for OFT-STD.
2
+ //!
3
+ //! Tests verify that the OFTFee extension properly collects fees on cross-chain transfers.
4
+ //! Key behavior: at debit_view, apply fee first then remove dust.
5
+ //! - If fee is zero: amount_sent_ld == amount_received_ld
6
+ //! - If fee is non-zero: amount_sent_ld is unchanged (original amount)
7
+
8
+ use crate::integration_tests::{
9
+ setup::{create_recipient_address, decode_packet, setup, wire_endpoint, wire_oft, TestSetup},
10
+ utils::{
11
+ address_to_peer_bytes32, create_send_param, lz_receive, mint_to,
12
+ quote_oft, quote_send, scan_packet_sent_event, send, send_with_fee,
13
+ set_default_fee_bps, set_fee_bps, set_fee_deposit_address, token_balance,
14
+ transfer_sac_admin, validate_packet,
15
+ },
16
+ };
17
+ use soroban_sdk::{testutils::Address as _, token::TokenClient, Address};
18
+
19
+ /// Test e2e cross-chain transfer with zero fee (default)
20
+ #[test]
21
+ fn test_cross_chain_with_zero_fee() {
22
+ let TestSetup { env, chain_a, chain_b } = setup();
23
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
24
+ wire_oft(&env, &[&chain_a, &chain_b]);
25
+
26
+ let sender = Address::generate(&env);
27
+ let receiver = create_recipient_address(&env);
28
+ let executor = Address::generate(&env);
29
+
30
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
31
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
32
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
33
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
34
+
35
+ let to = address_to_peer_bytes32(&receiver);
36
+ let send_param = create_send_param(&env, chain_b.eid, 1_000_000, 0, &to);
37
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
38
+
39
+ // With zero fee, amount_sent_ld == amount_received_ld (after dust removal)
40
+ assert_eq!(oft_receipt.amount_sent_ld, oft_receipt.amount_received_ld);
41
+
42
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
43
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
44
+
45
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
46
+ validate_packet(&env, &chain_b, &packet_event);
47
+ let packet = decode_packet(&env, &packet_event.0);
48
+
49
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
50
+
51
+ // Verify receiver got full amount (no fee)
52
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
53
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
54
+ }
55
+
56
+ /// Test e2e cross-chain transfer with fee enabled
57
+ #[test]
58
+ fn test_cross_chain_with_fee() {
59
+ let TestSetup { env, chain_a, chain_b } = setup();
60
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
61
+ wire_oft(&env, &[&chain_a, &chain_b]);
62
+
63
+ let sender = Address::generate(&env);
64
+ let receiver = create_recipient_address(&env);
65
+ let executor = Address::generate(&env);
66
+
67
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
68
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
69
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
70
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
71
+
72
+ // Enable 1% fee (100 bps)
73
+ set_fee_deposit_address(&env, &chain_a, &chain_a.fee_collector);
74
+ set_default_fee_bps(&env, &chain_a, 100);
75
+
76
+ let to = address_to_peer_bytes32(&receiver);
77
+ let amount_ld = 1_000_000i128;
78
+ let send_param = create_send_param(&env, chain_b.eid, amount_ld, 0, &to);
79
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
80
+
81
+ // With fee, amount_sent_ld stays original, amount_received_ld is reduced
82
+ assert_eq!(oft_receipt.amount_sent_ld, amount_ld);
83
+ assert!(oft_receipt.amount_received_ld < amount_ld);
84
+
85
+ // Expected fee: 1% of 1,000,000 = 10,000
86
+ let expected_fee = 10_000i128;
87
+ let actual_fee = oft_receipt.amount_sent_ld - oft_receipt.amount_received_ld;
88
+ assert_eq!(actual_fee, expected_fee);
89
+
90
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
91
+ send_with_fee(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt, &chain_a.fee_collector);
92
+
93
+ // IMPORTANT: Scan events immediately after send, before any other operations
94
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
95
+ validate_packet(&env, &chain_b, &packet_event);
96
+ let packet = decode_packet(&env, &packet_event.0);
97
+
98
+ // Verify fee was collected on source chain
99
+ let fee_collector_balance = token_balance(&env, &chain_a.oft_token, &chain_a.fee_collector);
100
+ assert_eq!(fee_collector_balance, expected_fee);
101
+
102
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
103
+
104
+ // Verify receiver got amount after fee
105
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
106
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
107
+ }
108
+
109
+ /// Test e2e cross-chain transfer with destination-specific fee
110
+ #[test]
111
+ fn test_cross_chain_with_destination_specific_fee() {
112
+ let TestSetup { env, chain_a, chain_b } = setup();
113
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
114
+ wire_oft(&env, &[&chain_a, &chain_b]);
115
+
116
+ let sender = Address::generate(&env);
117
+ let receiver = create_recipient_address(&env);
118
+ let executor = Address::generate(&env);
119
+
120
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
121
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
122
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
123
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
124
+
125
+ // Set default fee 1% and destination-specific fee 2% for chain_b
126
+ set_fee_deposit_address(&env, &chain_a, &chain_a.fee_collector);
127
+ set_default_fee_bps(&env, &chain_a, 100); // 1%
128
+ set_fee_bps(&env, &chain_a, chain_b.eid, 200); // 2% for chain_b
129
+
130
+ let to = address_to_peer_bytes32(&receiver);
131
+ let amount_ld = 1_000_000i128;
132
+ let send_param = create_send_param(&env, chain_b.eid, amount_ld, 0, &to);
133
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
134
+
135
+ // 2% fee on 1,000,000 = 20,000
136
+ let expected_fee = 20_000i128;
137
+ let actual_fee = oft_receipt.amount_sent_ld - oft_receipt.amount_received_ld;
138
+ assert_eq!(actual_fee, expected_fee);
139
+
140
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
141
+ send_with_fee(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt, &chain_a.fee_collector);
142
+
143
+ // IMPORTANT: Scan events immediately after send, before any other operations
144
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
145
+ validate_packet(&env, &chain_b, &packet_event);
146
+ let packet = decode_packet(&env, &packet_event.0);
147
+
148
+ // Verify fee was collected
149
+ let fee_collector_balance = token_balance(&env, &chain_a.oft_token, &chain_a.fee_collector);
150
+ assert_eq!(fee_collector_balance, expected_fee);
151
+
152
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
153
+
154
+ // Verify receiver got correct amount
155
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
156
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
157
+ }
@@ -0,0 +1,162 @@
1
+ //! Pausable extension e2e tests for OFT-STD.
2
+ //!
3
+ //! Tests verify that the Pausable extension properly blocks/allows send and receive
4
+ //! operations when the OFT is paused/unpaused. Uses real EndpointV2 and SimpleMessageLib.
5
+
6
+ use crate::integration_tests::{
7
+ setup::{create_recipient_address, decode_packet, setup, wire_endpoint, wire_oft, TestSetup},
8
+ utils::{
9
+ address_to_peer_bytes32, create_send_param, is_paused, lz_receive, mint_to,
10
+ quote_oft, quote_send, scan_packet_sent_event, send, set_paused, transfer_sac_admin,
11
+ try_lz_receive, try_send, validate_packet,
12
+ },
13
+ };
14
+ use soroban_sdk::{testutils::Address as _, token::TokenClient, Address};
15
+
16
+ /// Test e2e send succeeds when unpaused (default state)
17
+ #[test]
18
+ fn test_send_succeeds_when_unpaused() {
19
+ let TestSetup { env, chain_a, chain_b } = setup();
20
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
21
+ wire_oft(&env, &[&chain_a, &chain_b]);
22
+
23
+ let sender = Address::generate(&env);
24
+ let receiver = create_recipient_address(&env);
25
+
26
+ // Mint tokens and transfer admin rights
27
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
28
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
29
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
30
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
31
+
32
+ // Default state should be unpaused
33
+ assert!(!is_paused(&chain_a));
34
+
35
+ let to = address_to_peer_bytes32(&receiver);
36
+ let send_param = create_send_param(&env, chain_b.eid, 1_000_000, 0, &to);
37
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
38
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
39
+
40
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
41
+
42
+ // Validate packet and deliver on chain B
43
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
44
+ validate_packet(&env, &chain_b, &packet_event);
45
+ let packet = decode_packet(&env, &packet_event.0);
46
+
47
+ let executor = Address::generate(&env);
48
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
49
+
50
+ // Verify balances
51
+ let sender_balance = TokenClient::new(&env, &chain_a.oft_token).balance(&sender);
52
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
53
+ assert_eq!(sender_balance, 10_000_000 - oft_receipt.amount_sent_ld);
54
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
55
+ }
56
+
57
+ /// Test e2e send fails when paused
58
+ #[test]
59
+ fn test_send_fails_when_paused() {
60
+ let TestSetup { env, chain_a, chain_b } = setup();
61
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
62
+ wire_oft(&env, &[&chain_a, &chain_b]);
63
+
64
+ let sender = Address::generate(&env);
65
+ let receiver = create_recipient_address(&env);
66
+
67
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
68
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
69
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
70
+
71
+ let to = address_to_peer_bytes32(&receiver);
72
+ let send_param = create_send_param(&env, chain_b.eid, 1_000_000, 0, &to);
73
+
74
+ // Get quote BEFORE pausing (since quote_oft also checks pause state)
75
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
76
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
77
+
78
+ // Pause the OFT
79
+ set_paused(&env, &chain_a, true);
80
+ assert!(is_paused(&chain_a));
81
+
82
+ // Send should fail when paused
83
+ let success = try_send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
84
+ assert!(!success);
85
+ }
86
+
87
+ /// Test e2e receive fails when destination is paused
88
+ #[test]
89
+ fn test_receive_fails_when_paused() {
90
+ let TestSetup { env, chain_a, chain_b } = setup();
91
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
92
+ wire_oft(&env, &[&chain_a, &chain_b]);
93
+
94
+ let sender = Address::generate(&env);
95
+ let receiver = create_recipient_address(&env);
96
+ let executor = Address::generate(&env);
97
+
98
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
99
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
100
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
101
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
102
+
103
+ // Send from chain_a to chain_b
104
+ let to = address_to_peer_bytes32(&receiver);
105
+ let send_param = create_send_param(&env, chain_b.eid, 1_000_000, 0, &to);
106
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
107
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
108
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
109
+
110
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
111
+ validate_packet(&env, &chain_b, &packet_event);
112
+ let packet = decode_packet(&env, &packet_event.0);
113
+
114
+ // Pause chain_b's OFT before receiving
115
+ set_paused(&env, &chain_b, true);
116
+ assert!(is_paused(&chain_b));
117
+
118
+ // Receive should fail on paused destination
119
+ let success = try_lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
120
+ assert!(!success);
121
+ }
122
+
123
+ /// Test e2e cross-chain flow works after unpause
124
+ #[test]
125
+ fn test_cross_chain_succeeds_after_unpause() {
126
+ let TestSetup { env, chain_a, chain_b } = setup();
127
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
128
+ wire_oft(&env, &[&chain_a, &chain_b]);
129
+
130
+ let sender = Address::generate(&env);
131
+ let receiver = create_recipient_address(&env);
132
+ let executor = Address::generate(&env);
133
+
134
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10_000_000);
135
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
136
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
137
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
138
+
139
+ // Pause and then unpause
140
+ set_paused(&env, &chain_a, true);
141
+ assert!(is_paused(&chain_a));
142
+ set_paused(&env, &chain_a, false);
143
+ assert!(!is_paused(&chain_a));
144
+
145
+ // Send should work after unpause
146
+ let to = address_to_peer_bytes32(&receiver);
147
+ let send_param = create_send_param(&env, chain_b.eid, 1_000_000, 0, &to);
148
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
149
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
150
+
151
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
152
+
153
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
154
+ validate_packet(&env, &chain_b, &packet_event);
155
+ let packet = decode_packet(&env, &packet_event.0);
156
+
157
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
158
+
159
+ // Verify successful transfer
160
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
161
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
162
+ }
@@ -0,0 +1,186 @@
1
+ //! Rate Limiter extension e2e tests for OFT-STD.
2
+ //!
3
+ //! Tests verify that the RateLimiter extension properly enforces rate limits
4
+ //! on cross-chain transfers. Uses real EndpointV2 and SimpleMessageLib.
5
+
6
+ use crate::integration_tests::{
7
+ setup::{create_recipient_address, decode_packet, setup, wire_endpoint, wire_oft, TestSetup},
8
+ utils::{
9
+ address_to_peer_bytes32, advance_time, create_send_param, lz_receive, mint_to, quote_oft, quote_send,
10
+ rate_limit_capacity, rate_limit_in_flight, scan_packet_sent_event, send, set_rate_limit, transfer_sac_admin,
11
+ try_send, validate_packet,
12
+ },
13
+ };
14
+ use oft::extensions::rate_limiter::Direction;
15
+ use soroban_sdk::{testutils::Address as _, token::TokenClient, Address};
16
+
17
+ /// Test e2e send without rate limit (default - unlimited)
18
+ #[test]
19
+ fn test_send_without_rate_limit() {
20
+ let TestSetup { env, chain_a, chain_b } = setup();
21
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
22
+ wire_oft(&env, &[&chain_a, &chain_b]);
23
+
24
+ let sender = Address::generate(&env);
25
+ let receiver = create_recipient_address(&env);
26
+ let executor = Address::generate(&env);
27
+
28
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 100_000_000);
29
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
30
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
31
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
32
+
33
+ // Default capacity should be i128::MAX (unlimited)
34
+ let capacity = rate_limit_capacity(&chain_a, &Direction::Outbound, chain_b.eid);
35
+ assert_eq!(capacity, i128::MAX);
36
+
37
+ let to = address_to_peer_bytes32(&receiver);
38
+ let send_param = create_send_param(&env, chain_b.eid, 50_000_000, 0, &to);
39
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
40
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
41
+
42
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
43
+
44
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
45
+ validate_packet(&env, &chain_b, &packet_event);
46
+ let packet = decode_packet(&env, &packet_event.0);
47
+
48
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
49
+
50
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
51
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
52
+ }
53
+
54
+ /// Test e2e send within rate limit succeeds
55
+ #[test]
56
+ fn test_send_within_rate_limit() {
57
+ let TestSetup { env, chain_a, chain_b } = setup();
58
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
59
+ wire_oft(&env, &[&chain_a, &chain_b]);
60
+
61
+ let sender = Address::generate(&env);
62
+ let receiver = create_recipient_address(&env);
63
+ let executor = Address::generate(&env);
64
+
65
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 100_000_000);
66
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
67
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
68
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
69
+
70
+ // Set rate limit: 10M per 3600 seconds (1 hour)
71
+ set_rate_limit(&env, &chain_a, &Direction::Outbound, chain_b.eid, 10_000_000, 3600);
72
+
73
+ let capacity = rate_limit_capacity(&chain_a, &Direction::Outbound, chain_b.eid);
74
+ assert_eq!(capacity, 10_000_000);
75
+
76
+ // Send 5M (within limit)
77
+ let to = address_to_peer_bytes32(&receiver);
78
+ let send_param = create_send_param(&env, chain_b.eid, 5_000_000, 0, &to);
79
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
80
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
81
+
82
+ // Check in_flight BEFORE send
83
+ let in_flight_before = rate_limit_in_flight(&chain_a, &Direction::Outbound, chain_b.eid);
84
+ assert_eq!(in_flight_before, 0, "in_flight should be 0 before send");
85
+
86
+ // Send within rate limit
87
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
88
+
89
+ // IMPORTANT: Scan events immediately after send, before any other operations
90
+ let packet_event =
91
+ scan_packet_sent_event(&env, &chain_a.endpoint.address).expect("packet_sent event should be emitted");
92
+
93
+ // Verify capacity reduced
94
+ let in_flight = rate_limit_in_flight(&chain_a, &Direction::Outbound, chain_b.eid);
95
+ assert_eq!(in_flight, oft_receipt.amount_received_ld, "in_flight should match amount sent");
96
+ validate_packet(&env, &chain_b, &packet_event);
97
+ let packet = decode_packet(&env, &packet_event.0);
98
+
99
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
100
+
101
+ let receiver_balance = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
102
+ assert_eq!(receiver_balance, oft_receipt.amount_received_ld);
103
+ }
104
+
105
+ /// Test e2e send exceeding rate limit fails
106
+ #[test]
107
+ fn test_send_exceeds_rate_limit() {
108
+ let TestSetup { env, chain_a, chain_b } = setup();
109
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
110
+ wire_oft(&env, &[&chain_a, &chain_b]);
111
+
112
+ let sender = Address::generate(&env);
113
+ let receiver = create_recipient_address(&env);
114
+
115
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 100_000_000);
116
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
117
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
118
+
119
+ // Set rate limit: 1M per 3600 seconds
120
+ set_rate_limit(&env, &chain_a, &Direction::Outbound, chain_b.eid, 1_000_000, 3600);
121
+
122
+ // Try to send 5M (exceeds limit)
123
+ let to = address_to_peer_bytes32(&receiver);
124
+ let send_param = create_send_param(&env, chain_b.eid, 5_000_000, 0, &to);
125
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
126
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
127
+
128
+ let success = try_send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
129
+ assert!(!success);
130
+ }
131
+
132
+ /// Test rate limit decay over time
133
+ #[test]
134
+ fn test_rate_limit_decay() {
135
+ let TestSetup { env, chain_a, chain_b } = setup();
136
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
137
+ wire_oft(&env, &[&chain_a, &chain_b]);
138
+
139
+ let sender = Address::generate(&env);
140
+ let receiver = create_recipient_address(&env);
141
+ let executor = Address::generate(&env);
142
+
143
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 100_000_000);
144
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10_000_000_000);
145
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
146
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
147
+
148
+ // Set rate limit: 10M per 1000 seconds
149
+ set_rate_limit(&env, &chain_a, &Direction::Outbound, chain_b.eid, 10_000_000, 1000);
150
+
151
+ let to = address_to_peer_bytes32(&receiver);
152
+
153
+ // Send 8M
154
+ let send_param1 = create_send_param(&env, chain_b.eid, 8_000_000, 0, &to);
155
+ let (_, _, oft_receipt1) = quote_oft(&chain_a, &send_param1);
156
+ let fee1 = quote_send(&env, &chain_a, &sender, &send_param1, false);
157
+ send(&env, &chain_a, &sender, &send_param1, &fee1, &sender, &oft_receipt1);
158
+
159
+ let packet_event1 = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
160
+ validate_packet(&env, &chain_b, &packet_event1);
161
+ let packet1 = decode_packet(&env, &packet_event1.0);
162
+ lz_receive(&env, &chain_b, &executor, &packet1, &receiver, 0);
163
+
164
+ // Only ~2M capacity remaining
165
+ let capacity_before = rate_limit_capacity(&chain_a, &Direction::Outbound, chain_b.eid);
166
+ assert!(capacity_before < 3_000_000);
167
+
168
+ // Advance time by 500 seconds (50% of window) - should recover ~5M
169
+ advance_time(&env, 500);
170
+
171
+ let capacity_after = rate_limit_capacity(&chain_a, &Direction::Outbound, chain_b.eid);
172
+ // Capacity should have increased due to decay
173
+ assert!(capacity_after > capacity_before);
174
+
175
+ // Now we should be able to send more
176
+ let send_param2 = create_send_param(&env, chain_b.eid, 4_000_000, 0, &to);
177
+ let (_, _, oft_receipt2) = quote_oft(&chain_a, &send_param2);
178
+ let fee2 = quote_send(&env, &chain_a, &sender, &send_param2, false);
179
+ send(&env, &chain_a, &sender, &send_param2, &fee2, &sender, &oft_receipt2);
180
+
181
+ // Verify second send succeeded
182
+ let packet_event2 = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
183
+ validate_packet(&env, &chain_b, &packet_event2);
184
+ let packet2 = decode_packet(&env, &packet_event2.0);
185
+ lz_receive(&env, &chain_b, &executor, &packet2, &receiver, 0);
186
+ }
@@ -0,0 +1,3 @@
1
+ pub mod extensions;
2
+ pub mod setup;
3
+ pub mod utils;