@layerzerolabs/protocol-stellar-v2 0.2.21 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/.turbo/turbo-build.log +347 -271
  2. package/.turbo/turbo-lint.log +277 -208
  3. package/.turbo/turbo-test.log +1700 -1370
  4. package/Cargo.lock +22 -51
  5. package/Cargo.toml +6 -1
  6. package/contracts/common-macros/src/auth.rs +10 -9
  7. package/contracts/common-macros/src/contract_ttl.rs +1 -4
  8. package/contracts/common-macros/src/error.rs +1 -3
  9. package/contracts/common-macros/src/lib.rs +65 -61
  10. package/contracts/common-macros/src/storage.rs +212 -65
  11. package/contracts/common-macros/src/tests/auth.rs +75 -6
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +383 -350
  13. package/contracts/common-macros/src/tests/error.rs +9 -21
  14. package/contracts/common-macros/src/tests/lz_contract.rs +80 -0
  15. package/contracts/common-macros/src/tests/mod.rs +2 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -3
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +28 -1
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +8 -43
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +6 -29
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__lz_contract__snapshot_generated_lz_contract_code.snap +31 -0
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_extendable__snapshot_generated_ttl_extendable_code.snap +8 -0
  22. package/contracts/common-macros/src/tests/storage/extract_fields.rs +87 -0
  23. package/contracts/common-macros/src/tests/storage/gen_accessor_methods.rs +223 -0
  24. package/contracts/common-macros/src/tests/storage/gen_args.rs +65 -0
  25. package/contracts/common-macros/src/tests/storage/gen_enum_variant.rs +78 -0
  26. package/contracts/common-macros/src/tests/storage/gen_key.rs +108 -0
  27. package/contracts/common-macros/src/tests/storage/gen_params.rs +105 -0
  28. package/contracts/common-macros/src/tests/{storage.rs → storage/generate_storage.rs} +54 -129
  29. package/contracts/common-macros/src/tests/storage/is_primitive_type.rs +48 -0
  30. package/contracts/common-macros/src/tests/storage/mod.rs +16 -0
  31. package/contracts/common-macros/src/tests/storage/parse_default.rs +164 -0
  32. package/contracts/common-macros/src/tests/storage/parse_name.rs +159 -0
  33. package/contracts/common-macros/src/tests/storage/parse_no_ttl_extension.rs +124 -0
  34. package/contracts/common-macros/src/tests/storage/parse_storage_type.rs +174 -0
  35. package/contracts/common-macros/src/tests/storage/snapshots/common_macros__tests__storage__generate_storage__snapshot_generated_storage_code.snap +412 -0
  36. package/contracts/common-macros/src/tests/storage/storage_kind.rs +39 -0
  37. package/contracts/common-macros/src/tests/storage/test_setup.rs +25 -0
  38. package/contracts/common-macros/src/tests/storage/validate_attrs.rs +138 -0
  39. package/contracts/common-macros/src/tests/storage/variant_config.rs +226 -0
  40. package/contracts/common-macros/src/tests/test_helpers.rs +4 -10
  41. package/contracts/common-macros/src/tests/ttl_configurable.rs +2 -2
  42. package/contracts/common-macros/src/tests/ttl_extendable.rs +32 -0
  43. package/contracts/common-macros/src/tests/upgradeable.rs +118 -2
  44. package/contracts/common-macros/src/ttl_configurable.rs +1 -4
  45. package/contracts/common-macros/src/upgradeable.rs +21 -3
  46. package/contracts/endpoint-v2/Cargo.toml +0 -4
  47. package/contracts/endpoint-v2/src/endpoint_v2.rs +37 -17
  48. package/contracts/endpoint-v2/src/errors.rs +26 -1
  49. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +1 -1
  50. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +4 -4
  51. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  52. package/contracts/endpoint-v2/src/lib.rs +0 -1
  53. package/contracts/endpoint-v2/src/message_lib_manager.rs +39 -8
  54. package/contracts/endpoint-v2/src/messaging_channel.rs +36 -4
  55. package/contracts/endpoint-v2/src/messaging_composer.rs +18 -4
  56. package/contracts/endpoint-v2/src/storage.rs +9 -1
  57. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +2 -2
  58. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +1 -1
  59. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +3 -3
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +5 -5
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +2 -2
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +5 -5
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +3 -3
  65. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +1 -1
  66. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +4 -3
  67. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +7 -2
  68. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +7 -2
  70. package/contracts/layerzero-views/src/layerzero_view.rs +0 -1
  71. package/contracts/layerzero-views/src/tests/mod.rs +1 -0
  72. package/contracts/layerzero-views/src/tests/types_tests.rs +31 -0
  73. package/contracts/layerzero-views/src/types.rs +2 -3
  74. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/constructor.rs +61 -0
  75. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_impl_ttl_extension.rs +97 -0
  76. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/contract_trait_ttl_extension.rs +99 -0
  77. package/contracts/macro-integration-tests/tests/runtime/contract_ttl/mod.rs +3 -0
  78. package/contracts/macro-integration-tests/tests/runtime/lz_contract/mod.rs +5 -0
  79. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_default.rs +86 -0
  80. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig.rs +47 -0
  81. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_multisig_upgradeable.rs +77 -0
  82. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable.rs +114 -0
  83. package/contracts/macro-integration-tests/tests/runtime/lz_contract/wrapper_upgradeable_no_migration.rs +105 -0
  84. package/contracts/macro-integration-tests/tests/runtime/multisig/admin_entrypoints.rs +242 -0
  85. package/contracts/macro-integration-tests/tests/runtime/multisig/mod.rs +9 -0
  86. package/contracts/macro-integration-tests/tests/runtime/multisig/self_auth.rs +54 -0
  87. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +13 -0
  88. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -0
  89. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +70 -1
  90. package/contracts/macro-integration-tests/tests/runtime/ownable/two_step_transfer.rs +219 -0
  91. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +41 -0
  92. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +48 -16
  93. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +10 -0
  94. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +96 -3
  95. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +4 -0
  96. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/extend_instance_ttl.rs +64 -0
  97. package/contracts/macro-integration-tests/tests/runtime/ttl_extendable/mod.rs +16 -0
  98. package/contracts/macro-integration-tests/tests/runtime/upgradeable/migrate_guard_and_state.rs +305 -0
  99. package/contracts/macro-integration-tests/tests/runtime/upgradeable/mod.rs +3 -0
  100. package/contracts/macro-integration-tests/tests/runtime/upgradeable/no_migration.rs +59 -0
  101. package/contracts/macro-integration-tests/tests/runtime/upgradeable/upgrade_then_migrate.rs +88 -0
  102. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  103. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.rs +6 -0
  104. package/contracts/macro-integration-tests/tests/ui/contract_impl/fail/not_impl_item.stderr +7 -0
  105. package/contracts/macro-integration-tests/tests/ui/contract_impl/pass/basic.rs +102 -0
  106. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.rs +6 -0
  107. package/contracts/macro-integration-tests/tests/ui/contract_trait/fail/not_a_trait.stderr +7 -0
  108. package/contracts/macro-integration-tests/tests/ui/contract_trait/pass/basic.rs +83 -0
  109. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.rs +11 -0
  110. package/contracts/macro-integration-tests/tests/ui/error/fail/discriminant_too_large.stderr +7 -0
  111. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.rs +11 -0
  112. package/contracts/macro-integration-tests/tests/ui/error/fail/non_enum_input.stderr +7 -0
  113. package/contracts/macro-integration-tests/tests/ui/error/pass/basic.rs +22 -0
  114. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.rs +6 -0
  115. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/invalid_option.stderr +7 -0
  116. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.rs +20 -0
  117. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/multisig_rejects_ownable_api.stderr +20 -0
  118. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.rs +8 -0
  119. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/not_a_struct.stderr +7 -0
  120. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.rs +10 -0
  121. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_invalid_inner_option.stderr +7 -0
  122. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.rs +20 -0
  123. package/contracts/macro-integration-tests/tests/ui/lz_contract/fail/upgradeable_missing_internal.stderr +86 -0
  124. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/basic.rs +45 -0
  125. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig.rs +34 -0
  126. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/multisig_upgradeable.rs +30 -0
  127. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable.rs +39 -0
  128. package/contracts/macro-integration-tests/tests/ui/lz_contract/pass/upgradeable_no_migration.rs +28 -0
  129. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.rs +8 -0
  130. package/contracts/macro-integration-tests/tests/ui/multisig/fail/non_struct_input.stderr +7 -0
  131. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.rs +20 -0
  132. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_api.stderr +12 -0
  133. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.rs +20 -0
  134. package/contracts/macro-integration-tests/tests/ui/multisig/fail/rejects_ownable_trait.stderr +5 -0
  135. package/contracts/macro-integration-tests/tests/ui/multisig/pass/basic.rs +49 -0
  136. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.rs +8 -0
  137. package/contracts/macro-integration-tests/tests/ui/ownable/fail/non_struct_input.stderr +7 -0
  138. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.rs +19 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_auth.stderr +12 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +1 -1
  141. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +0 -8
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/basic.rs +39 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +7 -1
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +1 -1
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +1 -1
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.rs +11 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_default_values.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.rs +11 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_name_attrs.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.rs +11 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_no_ttl_extension.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +1 -1
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.rs +13 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_rejects_args.stderr +7 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/pass/api_surface.rs +102 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/pass/basic.rs +43 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/pass/multi_key.rs +38 -0
  158. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.rs +14 -0
  159. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/missing_auth_trait.stderr +71 -0
  160. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.rs +8 -0
  161. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/fail/non_struct_input.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/{minimal_contract.rs → basic.rs} +2 -0
  163. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/multisig_contract.rs +28 -0
  164. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/ownable_contract.rs +32 -0
  165. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.rs +8 -0
  166. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/fail/non_struct_input.stderr +7 -0
  167. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/basic.rs +23 -0
  168. package/contracts/macro-integration-tests/tests/ui/ttl_extendable/pass/no_user_contractimpl.rs +21 -0
  169. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.rs +11 -0
  170. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/attr_args.stderr +29 -0
  171. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.rs +20 -0
  172. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_auth_trait.stderr +71 -0
  173. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.rs +10 -0
  174. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/missing_upgradeable_internal.stderr +79 -0
  175. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.rs +8 -0
  176. package/contracts/macro-integration-tests/tests/ui/upgradeable/fail/non_struct_input.stderr +7 -0
  177. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/basic.rs +43 -0
  178. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/multisig_contract.rs +35 -0
  179. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_migration.rs +30 -0
  180. package/contracts/macro-integration-tests/tests/ui/upgradeable/pass/no_user_contractimpl.rs +29 -0
  181. package/contracts/macro-integration-tests/tests/ui_contract_impl.rs +12 -0
  182. package/contracts/macro-integration-tests/tests/ui_contract_trait.rs +12 -0
  183. package/contracts/macro-integration-tests/tests/ui_lz_contract.rs +11 -0
  184. package/contracts/macro-integration-tests/tests/ui_multisig.rs +11 -0
  185. package/contracts/macro-integration-tests/tests/ui_ttl_extendable.rs +12 -0
  186. package/contracts/macro-integration-tests/tests/ui_upgradeable.rs +11 -0
  187. package/contracts/message-libs/blocked-message-lib/Cargo.toml +1 -1
  188. package/contracts/message-libs/blocked-message-lib/src/lib.rs +4 -1
  189. package/contracts/message-libs/blocked-message-lib/src/tests/blocked_message_lib_tests.rs +108 -0
  190. package/contracts/message-libs/blocked-message-lib/src/tests/mod.rs +4 -0
  191. package/contracts/message-libs/blocked-message-lib/src/tests/setup.rs +40 -0
  192. package/contracts/message-libs/simple-message-lib/src/lib.rs +1 -1
  193. package/contracts/message-libs/simple-message-lib/src/tests/mod.rs +2 -0
  194. package/contracts/message-libs/simple-message-lib/src/tests/setup.rs +124 -0
  195. package/contracts/message-libs/simple-message-lib/src/tests/simple_message_lib_tests.rs +309 -0
  196. package/contracts/message-libs/uln-302/src/errors.rs +21 -0
  197. package/contracts/message-libs/uln-302/src/interfaces/receive_uln.rs +1 -1
  198. package/contracts/message-libs/uln-302/src/receive_uln.rs +6 -4
  199. package/contracts/message-libs/uln-302/src/send_uln.rs +15 -6
  200. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  201. package/contracts/message-libs/uln-302/src/tests/uln302/get_config.rs +71 -0
  202. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +1 -0
  203. package/contracts/message-libs/uln-302/src/uln302.rs +3 -0
  204. package/contracts/oapps/counter/Cargo.toml +2 -0
  205. package/contracts/oapps/counter/integration_tests/mod.rs +1 -0
  206. package/contracts/oapps/counter/integration_tests/setup_sml.rs +6 -4
  207. package/contracts/oapps/counter/integration_tests/setup_uln.rs +12 -5
  208. package/contracts/oapps/counter/integration_tests/test_with_blocked.rs +67 -0
  209. package/contracts/oapps/counter/src/tests/mod.rs +1 -0
  210. package/contracts/oapps/counter/src/tests/test_u256_ext.rs +48 -0
  211. package/contracts/oapps/oapp/src/lib.rs +0 -3
  212. package/contracts/oapps/oapp/src/tests/mod.rs +1 -0
  213. package/contracts/oapps/oft/integration-tests/setup.rs +2 -3
  214. package/contracts/oapps/oft/src/lib.rs +3 -0
  215. package/contracts/oapps/oft/src/tests/extensions/mod.rs +3 -0
  216. package/contracts/oapps/oft/src/tests/extensions/oft_fee.rs +240 -0
  217. package/contracts/oapps/oft/src/tests/extensions/pausable.rs +141 -0
  218. package/contracts/oapps/oft/src/tests/extensions/rate_limiter.rs +447 -0
  219. package/contracts/oapps/oft/src/tests/mod.rs +2 -0
  220. package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +180 -0
  221. package/contracts/oapps/oft/src/tests/oft_types/mod.rs +1 -0
  222. package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -3
  223. package/contracts/oapps/oft-core/src/lib.rs +2 -2
  224. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -1
  225. package/contracts/oapps/oft-core/src/tests/{test_oft_version.rs → test_oft_version_and_approval.rs} +9 -0
  226. package/contracts/oapps/oft-core/src/tests/test_utils.rs +0 -43
  227. package/contracts/upgrader/src/tests/test_upgrader.rs +18 -0
  228. package/contracts/utils/src/auth.rs +2 -2
  229. package/contracts/utils/src/buffer_reader.rs +61 -10
  230. package/contracts/utils/src/buffer_writer.rs +35 -20
  231. package/contracts/utils/src/bytes_ext.rs +1 -2
  232. package/contracts/utils/src/errors.rs +5 -3
  233. package/contracts/utils/src/multisig.rs +59 -36
  234. package/contracts/utils/src/option_ext.rs +3 -3
  235. package/contracts/utils/src/ownable.rs +12 -6
  236. package/contracts/utils/src/tests/auth.rs +179 -0
  237. package/contracts/utils/src/tests/buffer_reader.rs +203 -1
  238. package/contracts/utils/src/tests/buffer_writer.rs +176 -5
  239. package/contracts/utils/src/tests/mod.rs +2 -0
  240. package/contracts/utils/src/tests/multisig.rs +170 -141
  241. package/contracts/utils/src/tests/option_ext.rs +1 -1
  242. package/contracts/utils/src/tests/ownable.rs +156 -161
  243. package/contracts/utils/src/tests/test_helper.rs +21 -1
  244. package/contracts/utils/src/tests/testing_utils.rs +84 -2
  245. package/contracts/utils/src/tests/ttl_configurable.rs +66 -86
  246. package/contracts/utils/src/tests/ttl_extendable.rs +64 -0
  247. package/contracts/utils/src/tests/upgradeable.rs +115 -6
  248. package/contracts/utils/src/ttl_configurable.rs +22 -12
  249. package/contracts/utils/src/ttl_extendable.rs +1 -3
  250. package/contracts/utils/src/upgradeable.rs +21 -24
  251. package/contracts/workers/dvn/src/auth.rs +1 -1
  252. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  253. package/contracts/workers/dvn/src/storage.rs +1 -1
  254. package/contracts/workers/dvn/src/tests/auth.rs +136 -3
  255. package/contracts/workers/dvn/src/tests/mod.rs +0 -1
  256. package/contracts/workers/dvn/src/tests/setup.rs +4 -10
  257. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +279 -0
  258. package/contracts/workers/executor-helper/src/tests/setup.rs +106 -1
  259. package/contracts/workers/worker/src/worker.rs +1 -1
  260. package/docs/oft-guide.md +5 -5
  261. package/package.json +5 -7
  262. package/sdk/.turbo/turbo-test.log +662 -466
  263. package/sdk/LICENSE +23 -0
  264. package/sdk/dist/generated/bml.d.ts +101 -106
  265. package/sdk/dist/generated/bml.js +108 -26
  266. package/sdk/dist/generated/counter.d.ts +123 -484
  267. package/sdk/dist/generated/counter.js +103 -25
  268. package/sdk/dist/generated/dvn.d.ts +141 -699
  269. package/sdk/dist/generated/dvn.js +106 -28
  270. package/sdk/dist/generated/dvn_fee_lib.d.ts +31 -248
  271. package/sdk/dist/generated/dvn_fee_lib.js +27 -24
  272. package/sdk/dist/generated/endpoint.d.ts +158 -836
  273. package/sdk/dist/generated/endpoint.js +107 -29
  274. package/sdk/dist/generated/executor.d.ts +139 -671
  275. package/sdk/dist/generated/executor.js +106 -28
  276. package/sdk/dist/generated/executor_fee_lib.d.ts +109 -264
  277. package/sdk/dist/generated/executor_fee_lib.js +106 -28
  278. package/sdk/dist/generated/executor_helper.d.ts +95 -92
  279. package/sdk/dist/generated/executor_helper.js +103 -25
  280. package/sdk/dist/generated/layerzero_view.d.ts +178 -335
  281. package/sdk/dist/generated/layerzero_view.js +172 -33
  282. package/sdk/dist/generated/oft.d.ts +137 -680
  283. package/sdk/dist/generated/oft.js +103 -25
  284. package/sdk/dist/generated/price_feed.d.ts +45 -444
  285. package/sdk/dist/generated/price_feed.js +27 -24
  286. package/sdk/dist/generated/sml.d.ts +119 -428
  287. package/sdk/dist/generated/sml.js +103 -25
  288. package/sdk/dist/generated/treasury.d.ts +109 -288
  289. package/sdk/dist/generated/treasury.js +103 -25
  290. package/sdk/dist/generated/uln302.d.ts +190 -527
  291. package/sdk/dist/generated/uln302.js +170 -31
  292. package/sdk/dist/generated/upgrader.d.ts +14 -34
  293. package/sdk/dist/generated/upgrader.js +24 -21
  294. package/sdk/package.json +3 -4
  295. package/sdk/test/counter-sml.test.ts +218 -142
  296. package/sdk/test/counter-uln.test.ts +189 -145
  297. package/sdk/test/oft-sml.test.ts +173 -156
  298. package/sdk/test/suites/constants.ts +7 -1
  299. package/sdk/test/suites/globalSetup.ts +140 -74
  300. package/sdk/turbo.json +1 -1
  301. package/tools/ts-bindings-gen/Cargo.toml +4 -4
  302. package/tools/ts-bindings-gen/src/main.rs +4 -0
  303. package/turbo.json +3 -0
  304. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +0 -1072
  305. package/contracts/endpoint-v2/src/constants.rs +0 -52
  306. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +0 -12
  307. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +0 -7
  308. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +0 -20
  309. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +0 -15
  310. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +0 -16
  311. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +0 -26
  312. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +0 -21
  313. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +0 -12
  314. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +0 -7
  315. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +0 -14
  316. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +0 -14
  317. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +0 -16
  318. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +0 -15
  319. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +0 -14
  320. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +0 -19
  321. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +0 -15
  322. package/contracts/message-libs/simple-message-lib/src/test.rs +0 -280
  323. package/contracts/oapps/oapp/src/macro_tests/mod.rs +0 -1
  324. package/contracts/workers/dvn/src/tests/multisig/mod.rs +0 -3
  325. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +0 -132
  326. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +0 -109
  327. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +0 -106
  328. /package/contracts/oapps/oapp/src/{macro_tests → tests}/test_macros.rs +0 -0
@@ -0,0 +1,179 @@
1
+ extern crate std;
2
+
3
+ use crate::auth::{enforce_auth, require_auth, Auth};
4
+ use crate::tests::test_helper::mock_auth;
5
+ use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, Env, Symbol};
6
+
7
+ // ============================================
8
+ // Test Contract for auth helpers
9
+ // ============================================
10
+
11
+ #[contract]
12
+ pub struct AuthTestContract;
13
+
14
+ fn authorizer_key(env: &Env) -> Symbol {
15
+ Symbol::new(env, "authorizer")
16
+ }
17
+
18
+ #[contractimpl]
19
+ impl AuthTestContract {
20
+ pub fn __constructor(env: &Env, authorizer: &Address) {
21
+ env.storage().instance().set(&authorizer_key(env), authorizer);
22
+ }
23
+
24
+ /// Test-only helper to update the authorizer in instance storage.
25
+ ///
26
+ /// NOTE: This is intentionally *not* protected by auth, since it's only used in unit tests.
27
+ pub fn set_authorizer(env: &Env, authorizer: &Address) {
28
+ env.storage().instance().set(&authorizer_key(env), authorizer);
29
+ }
30
+
31
+ pub fn enforce_auth_for_test(env: &Env) -> Address {
32
+ enforce_auth::<Self>(env)
33
+ }
34
+
35
+ pub fn require_auth_for_test(env: &Env) {
36
+ require_auth::<Self>(env);
37
+ }
38
+ }
39
+
40
+ /// `Auth` implementation for the test contract - uses a stored address as the authorizer.
41
+ impl Auth for AuthTestContract {
42
+ fn authorizer(env: &Env) -> Address {
43
+ env.storage().instance().get(&authorizer_key(env)).expect("authorizer must be set in tests")
44
+ }
45
+ }
46
+
47
+ // ============================================
48
+ // enforce_auth
49
+ // ============================================
50
+
51
+ #[test]
52
+ fn test_enforce_auth_returns_authorizer_on_success() {
53
+ let env = Env::default();
54
+ let authorizer = Address::generate(&env);
55
+
56
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
57
+ let client = AuthTestContractClient::new(&env, &contract_id);
58
+
59
+ mock_auth(&env, &contract_id, &authorizer, "enforce_auth_for_test", ());
60
+
61
+ let got = client.enforce_auth_for_test();
62
+ assert_eq!(got, authorizer);
63
+ }
64
+
65
+ #[test]
66
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
67
+ fn test_enforce_auth_panics_without_auth() {
68
+ let env = Env::default();
69
+ let authorizer = Address::generate(&env);
70
+
71
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
72
+ let client = AuthTestContractClient::new(&env, &contract_id);
73
+
74
+ // No `mock_auths` provided -> authorizer.require_auth() must fail.
75
+ client.enforce_auth_for_test();
76
+ }
77
+
78
+ #[test]
79
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
80
+ fn test_enforce_auth_panics_with_wrong_address_auth() {
81
+ let env = Env::default();
82
+ let authorizer = Address::generate(&env);
83
+ let wrong_address = Address::generate(&env);
84
+
85
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
86
+ let client = AuthTestContractClient::new(&env, &contract_id);
87
+
88
+ // Provide auth for the wrong address -> must still fail because authorizer is different.
89
+ mock_auth(&env, &contract_id, &wrong_address, "enforce_auth_for_test", ());
90
+ client.enforce_auth_for_test();
91
+ }
92
+
93
+ // ============================================
94
+ // require_auth
95
+ // ============================================
96
+
97
+ #[test]
98
+ fn test_require_auth_succeeds_when_authorizer_auths() {
99
+ let env = Env::default();
100
+ let authorizer = Address::generate(&env);
101
+
102
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
103
+ let client = AuthTestContractClient::new(&env, &contract_id);
104
+
105
+ mock_auth(&env, &contract_id, &authorizer, "require_auth_for_test", ());
106
+
107
+ client.require_auth_for_test();
108
+ }
109
+
110
+ #[test]
111
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
112
+ fn test_require_auth_panics_without_auth() {
113
+ let env = Env::default();
114
+ let authorizer = Address::generate(&env);
115
+
116
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
117
+ let client = AuthTestContractClient::new(&env, &contract_id);
118
+
119
+ // No `mock_auths` provided -> authorizer.require_auth() must fail.
120
+ client.require_auth_for_test();
121
+ }
122
+
123
+ #[test]
124
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
125
+ fn test_require_auth_panics_with_wrong_address_auth() {
126
+ let env = Env::default();
127
+ let authorizer = Address::generate(&env);
128
+ let wrong_address = Address::generate(&env);
129
+
130
+ let contract_id = env.register(AuthTestContract, (&authorizer,));
131
+ let client = AuthTestContractClient::new(&env, &contract_id);
132
+
133
+ // Provide auth for the wrong address -> must still fail because authorizer is different.
134
+ mock_auth(&env, &contract_id, &wrong_address, "require_auth_for_test", ());
135
+ client.require_auth_for_test();
136
+ }
137
+
138
+ // ============================================
139
+ // behavior: authorizer changes
140
+ // ============================================
141
+
142
+ #[test]
143
+ fn test_enforce_auth_uses_current_authorizer_after_change() {
144
+ let env = Env::default();
145
+ let old_authorizer = Address::generate(&env);
146
+ let new_authorizer = Address::generate(&env);
147
+
148
+ let contract_id = env.register(AuthTestContract, (&old_authorizer,));
149
+ let client = AuthTestContractClient::new(&env, &contract_id);
150
+
151
+ // Update authorizer to `new_authorizer`.
152
+ client.set_authorizer(&new_authorizer);
153
+
154
+ // New authorizer can call, and enforce_auth returns the current authorizer.
155
+ mock_auth(&env, &contract_id, &new_authorizer, "require_auth_for_test", ());
156
+ client.require_auth_for_test();
157
+
158
+ mock_auth(&env, &contract_id, &new_authorizer, "enforce_auth_for_test", ());
159
+ let got = client.enforce_auth_for_test();
160
+ assert_eq!(got, new_authorizer);
161
+ }
162
+
163
+ #[test]
164
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
165
+ fn test_require_auth_fails_with_stale_auth_after_authorizer_change() {
166
+ let env = Env::default();
167
+ let old_authorizer = Address::generate(&env);
168
+ let new_authorizer = Address::generate(&env);
169
+
170
+ let contract_id = env.register(AuthTestContract, (&old_authorizer,));
171
+ let client = AuthTestContractClient::new(&env, &contract_id);
172
+
173
+ // Change to a new authorizer, but only provide auth for the old one.
174
+ client.set_authorizer(&new_authorizer);
175
+ mock_auth(&env, &contract_id, &old_authorizer, "require_auth_for_test", ());
176
+
177
+ // Must fail because current authorizer is now `new_authorizer`.
178
+ client.require_auth_for_test();
179
+ }
@@ -41,7 +41,7 @@ fn test_address_roundtrip(env: &Env, address: &Address) {
41
41
  }
42
42
 
43
43
  // ============================================
44
- // read_primitives tests (u8, u16, u32, u64, u128, u256, bool)
44
+ // read_primitives tests (u8, u16, u32, u64, u128, i128, u256, bool)
45
45
  // ============================================
46
46
 
47
47
  #[test]
@@ -90,6 +90,140 @@ fn test_read_primitives_roundtrip() {
90
90
  assert_eq!(reader.remaining_len(), 0);
91
91
  }
92
92
 
93
+ #[test]
94
+ fn test_read_i128_roundtrip() {
95
+ let env = Env::default();
96
+ let mut writer = BufferWriter::new(&env);
97
+ writer.write_i128(0).write_i128(-42).write_i128(123_456_789).write_i128(i128::MIN).write_i128(i128::MAX);
98
+
99
+ let bytes = writer.to_bytes();
100
+ let mut reader = BufferReader::new(&bytes);
101
+
102
+ assert_eq!(reader.read_i128(), 0);
103
+ assert_eq!(reader.read_i128(), -42);
104
+ assert_eq!(reader.read_i128(), 123_456_789);
105
+ assert_eq!(reader.read_i128(), i128::MIN);
106
+ assert_eq!(reader.read_i128(), i128::MAX);
107
+ assert_eq!(reader.remaining_len(), 0);
108
+ }
109
+
110
+ #[test]
111
+ fn test_read_i8_i16_i32_i64_i128_big_endian_golden_bytes() {
112
+ let env = Env::default();
113
+
114
+ // Layout:
115
+ // - i8: -1, MIN, MAX (3 bytes)
116
+ // - i16: -1, MIN, MAX (6 bytes)
117
+ // - i32: -1, MIN, MAX (12 bytes)
118
+ // - i64: -1, MIN, MAX (24 bytes)
119
+ // - i128: -1, MIN, MAX (48 bytes)
120
+ // Total = 93 bytes
121
+ let mut raw = [0u8; 93];
122
+ let mut pos = 0usize;
123
+
124
+ raw[pos] = (-1i8) as u8;
125
+ pos += 1;
126
+ raw[pos] = i8::MIN as u8;
127
+ pos += 1;
128
+ raw[pos] = i8::MAX as u8;
129
+ pos += 1;
130
+
131
+ raw[pos..pos + 2].copy_from_slice(&(-1i16).to_be_bytes());
132
+ pos += 2;
133
+ raw[pos..pos + 2].copy_from_slice(&i16::MIN.to_be_bytes());
134
+ pos += 2;
135
+ raw[pos..pos + 2].copy_from_slice(&i16::MAX.to_be_bytes());
136
+ pos += 2;
137
+
138
+ raw[pos..pos + 4].copy_from_slice(&(-1i32).to_be_bytes());
139
+ pos += 4;
140
+ raw[pos..pos + 4].copy_from_slice(&i32::MIN.to_be_bytes());
141
+ pos += 4;
142
+ raw[pos..pos + 4].copy_from_slice(&i32::MAX.to_be_bytes());
143
+ pos += 4;
144
+
145
+ raw[pos..pos + 8].copy_from_slice(&(-1i64).to_be_bytes());
146
+ pos += 8;
147
+ raw[pos..pos + 8].copy_from_slice(&i64::MIN.to_be_bytes());
148
+ pos += 8;
149
+ raw[pos..pos + 8].copy_from_slice(&i64::MAX.to_be_bytes());
150
+ pos += 8;
151
+
152
+ raw[pos..pos + 16].copy_from_slice(&[0xFF; 16]); // -1
153
+ pos += 16;
154
+ raw[pos] = 0x80; // i128::MIN (0x80 followed by 15x 0x00)
155
+ pos += 16;
156
+ raw[pos..pos + 16].copy_from_slice(&i128::MAX.to_be_bytes());
157
+ pos += 16;
158
+
159
+ assert_eq!(pos, raw.len());
160
+
161
+ let bytes = Bytes::from_array(&env, &raw);
162
+ let mut reader = BufferReader::new(&bytes);
163
+
164
+ assert_eq!(reader.read_i8(), -1);
165
+ assert_eq!(reader.read_i8(), i8::MIN);
166
+ assert_eq!(reader.read_i8(), i8::MAX);
167
+ assert_eq!(reader.position(), 3);
168
+
169
+ assert_eq!(reader.read_i16(), -1);
170
+ assert_eq!(reader.read_i16(), i16::MIN);
171
+ assert_eq!(reader.read_i16(), i16::MAX);
172
+ assert_eq!(reader.position(), 3 + 6);
173
+
174
+ assert_eq!(reader.read_i32(), -1);
175
+ assert_eq!(reader.read_i32(), i32::MIN);
176
+ assert_eq!(reader.read_i32(), i32::MAX);
177
+ assert_eq!(reader.position(), 3 + 6 + 12);
178
+
179
+ assert_eq!(reader.read_i64(), -1);
180
+ assert_eq!(reader.read_i64(), i64::MIN);
181
+ assert_eq!(reader.read_i64(), i64::MAX);
182
+ assert_eq!(reader.position(), 45);
183
+
184
+ assert_eq!(reader.read_i128(), -1);
185
+ assert_eq!(reader.position(), 45 + 16);
186
+ assert_eq!(reader.read_i128(), i128::MIN);
187
+ assert_eq!(reader.position(), 45 + 16 + 16);
188
+ assert_eq!(reader.read_i128(), i128::MAX);
189
+ assert_eq!(reader.position(), 93);
190
+
191
+ assert_eq!(reader.remaining_len(), 0);
192
+ }
193
+
194
+ #[test]
195
+ fn test_read_i256_big_endian_golden_bytes() {
196
+ use soroban_sdk::I256;
197
+
198
+ let env = Env::default();
199
+
200
+ // Layout: -1, MIN, MAX, +1
201
+ let mut raw = [0u8; 32 * 4];
202
+ raw[0..32].copy_from_slice(&[0xFF; 32]); // -1
203
+ raw[32] = 0x80; // MIN (0x80 followed by 31x 0x00)
204
+ raw[64] = 0x7F; // MAX (0x7F followed by 31x 0xFF)
205
+ raw[65..96].copy_from_slice(&[0xFF; 31]);
206
+ raw[127] = 0x01; // +1
207
+
208
+ let bytes = Bytes::from_array(&env, &raw);
209
+ let mut reader = BufferReader::new(&bytes);
210
+
211
+ let expected_neg1 = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[0..32]));
212
+ let expected_min = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[32..64]));
213
+ let expected_max = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[64..96]));
214
+ let expected_one = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[96..128]));
215
+
216
+ assert_eq!(reader.read_i256(), expected_neg1);
217
+ assert_eq!(reader.position(), 32);
218
+ assert_eq!(reader.read_i256(), expected_min);
219
+ assert_eq!(reader.position(), 64);
220
+ assert_eq!(reader.read_i256(), expected_max);
221
+ assert_eq!(reader.position(), 96);
222
+ assert_eq!(reader.read_i256(), expected_one);
223
+ assert_eq!(reader.position(), 128);
224
+ assert_eq!(reader.remaining_len(), 0);
225
+ }
226
+
93
227
  #[test]
94
228
  fn test_read_boundary_values() {
95
229
  let env = Env::default();
@@ -216,6 +350,53 @@ fn test_read_bytes_n() {
216
350
  assert_eq!(reader.remaining_len(), 0);
217
351
  }
218
352
 
353
+ #[test]
354
+ fn test_read_array_roundtrip_and_position() {
355
+ let env = Env::default();
356
+ let bytes = Bytes::from_array(&env, &[0xAA, 0xBB, 0xCC, 0xDD, 0x10, 0x11]);
357
+ let mut reader = BufferReader::new(&bytes);
358
+
359
+ let a4: [u8; 4] = reader.read_array();
360
+ assert_eq!(a4, [0xAA, 0xBB, 0xCC, 0xDD]);
361
+ assert_eq!(reader.position(), 4);
362
+ assert_eq!(reader.remaining_len(), 2);
363
+
364
+ let a2: [u8; 2] = reader.read_array();
365
+ assert_eq!(a2, [0x10, 0x11]);
366
+ assert_eq!(reader.position(), 6);
367
+ assert_eq!(reader.remaining_len(), 0);
368
+ }
369
+
370
+ #[test]
371
+ fn test_read_array_write_array_roundtrip() {
372
+ let env = Env::default();
373
+
374
+ let a4: [u8; 4] = [0x01, 0x02, 0x03, 0x04];
375
+ let a1: [u8; 1] = [0xAA];
376
+ let a8: [u8; 8] = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17];
377
+
378
+ let mut writer = BufferWriter::new(&env);
379
+ writer.write_array(&a4).write_array(&a1).write_array(&a8);
380
+
381
+ let bytes = writer.to_bytes();
382
+ assert_eq!(bytes.len(), (a4.len() + a1.len() + a8.len()) as u32);
383
+
384
+ let mut reader = BufferReader::new(&bytes);
385
+ let got4: [u8; 4] = reader.read_array();
386
+ assert_eq!(got4, a4);
387
+ assert_eq!(reader.position(), 4);
388
+
389
+ let got1: [u8; 1] = reader.read_array();
390
+ assert_eq!(got1, a1);
391
+ assert_eq!(reader.position(), 5);
392
+
393
+ let got8: [u8; 8] = reader.read_array();
394
+ assert_eq!(got8, a8);
395
+ assert_eq!(reader.position(), 13);
396
+
397
+ assert_eq!(reader.remaining_len(), 0);
398
+ }
399
+
219
400
  #[test]
220
401
  fn test_read_bytes_zero_length() {
221
402
  let env = Env::default();
@@ -701,6 +882,21 @@ fn test_buffer_reader_invalid_length_panics_table() {
701
882
  const EXPECTED: &str = "Error(Contract, #1000)";
702
883
 
703
884
  let cases: &[(&str, &[u8], ReaderStep)] = &[
885
+ ("read_array<4> from 3", &[0x01, 0x02, 0x03], |r: &mut BufferReader| {
886
+ let _val: [u8; 4] = r.read_array();
887
+ }),
888
+ ("read_i8 empty", &[], |r: &mut BufferReader| {
889
+ r.read_i8();
890
+ }),
891
+ ("read_i16 1 byte", &[0x01], |r: &mut BufferReader| {
892
+ r.read_i16();
893
+ }),
894
+ ("read_i32 3 bytes", &[0x01, 0x02, 0x03], |r: &mut BufferReader| {
895
+ r.read_i32();
896
+ }),
897
+ ("read_i64 7 bytes", &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], |r: &mut BufferReader| {
898
+ r.read_i64();
899
+ }),
704
900
  ("read_u8 empty", &[], |r: &mut BufferReader| {
705
901
  r.read_u8();
706
902
  }),
@@ -716,9 +912,15 @@ fn test_buffer_reader_invalid_length_panics_table() {
716
912
  ("read_u128 15 bytes", &[0x01; 15], |r: &mut BufferReader| {
717
913
  r.read_u128();
718
914
  }),
915
+ ("read_i128 15 bytes", &[0x01; 15], |r: &mut BufferReader| {
916
+ r.read_i128();
917
+ }),
719
918
  ("read_u256 31 bytes", &[0x01; 31], |r: &mut BufferReader| {
720
919
  r.read_u256();
721
920
  }),
921
+ ("read_i256 31 bytes", &[0x01; 31], |r: &mut BufferReader| {
922
+ r.read_i256();
923
+ }),
722
924
  ("read_bytes(10) from 4", &[0x01, 0x02, 0x03, 0x04], |r: &mut BufferReader| {
723
925
  r.read_bytes(10);
724
926
  }),
@@ -1,10 +1,8 @@
1
1
  use crate::{
2
- buffer_reader::BufferReader,
3
- buffer_writer::BufferWriter,
4
- bytes_ext::BytesExt,
2
+ buffer_reader::BufferReader, buffer_writer::BufferWriter, bytes_ext::BytesExt,
5
3
  tests::test_helper::assert_address_payload_matches,
6
4
  };
7
- use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, Address, Bytes, BytesN, Env, U256};
5
+ use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, Address, Bytes, BytesN, Env, I256, U256};
8
6
 
9
7
  /// Helper to test U256 write/read roundtrip
10
8
  fn test_u256_roundtrip(env: &Env, value: &soroban_sdk::U256) {
@@ -95,7 +93,7 @@ fn test_from_bytes_empty() {
95
93
  }
96
94
 
97
95
  // ============================================
98
- // write_primitives tests (u8, u16, u32, u64, u128, u256, bool)
96
+ // write_primitives tests (u8, u16, u32, u64, u128, i128, u256, bool)
99
97
  // ============================================
100
98
 
101
99
  #[test]
@@ -122,6 +120,179 @@ fn test_write_primitives_big_endian_golden_bytes() {
122
120
  assert_eq!(got, expected);
123
121
  }
124
122
 
123
+ #[test]
124
+ fn test_write_signed_integers_big_endian_golden_bytes() {
125
+ let env = Env::default();
126
+ let mut writer = BufferWriter::new(&env);
127
+
128
+ writer
129
+ .write_i8(-1)
130
+ .write_i8(i8::MIN)
131
+ .write_i8(i8::MAX)
132
+ .write_i16(-1)
133
+ .write_i16(i16::MIN)
134
+ .write_i16(i16::MAX)
135
+ .write_i32(-1)
136
+ .write_i32(i32::MIN)
137
+ .write_i32(i32::MAX)
138
+ .write_i64(-1)
139
+ .write_i64(i64::MIN)
140
+ .write_i64(i64::MAX)
141
+ .write_i128(-1)
142
+ .write_i128(i128::MIN)
143
+ .write_i128(i128::MAX);
144
+
145
+ let bytes = writer.to_bytes();
146
+ assert_eq!(bytes.len(), 93);
147
+ let got: [u8; 93] = bytes.to_array();
148
+
149
+ // Layout:
150
+ // - i8: -1, MIN, MAX (3 bytes)
151
+ // - i16: -1, MIN, MAX (6 bytes)
152
+ // - i32: -1, MIN, MAX (12 bytes)
153
+ // - i64: -1, MIN, MAX (24 bytes)
154
+ // - i128: -1, MIN, MAX (48 bytes)
155
+ // Total = 93 bytes
156
+ let mut expected = [0u8; 93];
157
+ let mut pos = 0usize;
158
+
159
+ expected[pos] = (-1i8) as u8;
160
+ pos += 1;
161
+ expected[pos] = i8::MIN as u8;
162
+ pos += 1;
163
+ expected[pos] = i8::MAX as u8;
164
+ pos += 1;
165
+
166
+ expected[pos..pos + 2].copy_from_slice(&(-1i16).to_be_bytes());
167
+ pos += 2;
168
+ expected[pos..pos + 2].copy_from_slice(&i16::MIN.to_be_bytes());
169
+ pos += 2;
170
+ expected[pos..pos + 2].copy_from_slice(&i16::MAX.to_be_bytes());
171
+ pos += 2;
172
+
173
+ expected[pos..pos + 4].copy_from_slice(&(-1i32).to_be_bytes());
174
+ pos += 4;
175
+ expected[pos..pos + 4].copy_from_slice(&i32::MIN.to_be_bytes());
176
+ pos += 4;
177
+ expected[pos..pos + 4].copy_from_slice(&i32::MAX.to_be_bytes());
178
+ pos += 4;
179
+
180
+ expected[pos..pos + 8].copy_from_slice(&(-1i64).to_be_bytes());
181
+ pos += 8;
182
+ expected[pos..pos + 8].copy_from_slice(&i64::MIN.to_be_bytes());
183
+ pos += 8;
184
+ expected[pos..pos + 8].copy_from_slice(&i64::MAX.to_be_bytes());
185
+ pos += 8;
186
+
187
+ expected[pos..pos + 16].copy_from_slice(&(-1i128).to_be_bytes());
188
+ pos += 16;
189
+ expected[pos..pos + 16].copy_from_slice(&i128::MIN.to_be_bytes());
190
+ pos += 16;
191
+ expected[pos..pos + 16].copy_from_slice(&i128::MAX.to_be_bytes());
192
+ pos += 16;
193
+
194
+ assert_eq!(pos, expected.len());
195
+ assert_eq!(got, expected);
196
+ }
197
+
198
+ #[test]
199
+ fn test_write_signed_integers_roundtrip() {
200
+ let env = Env::default();
201
+ let mut writer = BufferWriter::new(&env);
202
+
203
+ writer
204
+ .write_i8(0)
205
+ .write_i8(-1)
206
+ .write_i8(i8::MIN)
207
+ .write_i8(i8::MAX)
208
+ .write_i16(0)
209
+ .write_i16(-42)
210
+ .write_i16(i16::MIN)
211
+ .write_i16(i16::MAX)
212
+ .write_i32(0)
213
+ .write_i32(-42)
214
+ .write_i32(i32::MIN)
215
+ .write_i32(i32::MAX)
216
+ .write_i64(0)
217
+ .write_i64(-42)
218
+ .write_i64(i64::MIN)
219
+ .write_i64(i64::MAX)
220
+ .write_i128(0)
221
+ .write_i128(-42)
222
+ .write_i128(123_456_789)
223
+ .write_i128(i128::MIN)
224
+ .write_i128(i128::MAX);
225
+
226
+ let bytes = writer.to_bytes();
227
+ let mut reader = BufferReader::new(&bytes);
228
+
229
+ assert_eq!(reader.read_i8(), 0);
230
+ assert_eq!(reader.read_i8(), -1);
231
+ assert_eq!(reader.read_i8(), i8::MIN);
232
+ assert_eq!(reader.read_i8(), i8::MAX);
233
+
234
+ assert_eq!(reader.read_i16(), 0);
235
+ assert_eq!(reader.read_i16(), -42);
236
+ assert_eq!(reader.read_i16(), i16::MIN);
237
+ assert_eq!(reader.read_i16(), i16::MAX);
238
+
239
+ assert_eq!(reader.read_i32(), 0);
240
+ assert_eq!(reader.read_i32(), -42);
241
+ assert_eq!(reader.read_i32(), i32::MIN);
242
+ assert_eq!(reader.read_i32(), i32::MAX);
243
+
244
+ assert_eq!(reader.read_i64(), 0);
245
+ assert_eq!(reader.read_i64(), -42);
246
+ assert_eq!(reader.read_i64(), i64::MIN);
247
+ assert_eq!(reader.read_i64(), i64::MAX);
248
+
249
+ assert_eq!(reader.read_i128(), 0);
250
+ assert_eq!(reader.read_i128(), -42);
251
+ assert_eq!(reader.read_i128(), 123_456_789);
252
+ assert_eq!(reader.read_i128(), i128::MIN);
253
+ assert_eq!(reader.read_i128(), i128::MAX);
254
+ assert_eq!(reader.remaining_len(), 0);
255
+ }
256
+
257
+ #[test]
258
+ fn test_write_i256_big_endian_golden_bytes_and_roundtrip() {
259
+ let env = Env::default();
260
+
261
+ // Golden layouts: -1, MIN, MAX, +1
262
+ let mut raw = [0u8; 32 * 4];
263
+ raw[0..32].copy_from_slice(&[0xFF; 32]); // -1
264
+ raw[32] = 0x80; // MIN (0x80 followed by 31x 0x00)
265
+ raw[64] = 0x7F; // MAX (0x7F followed by 31x 0xFF)
266
+ raw[65..96].copy_from_slice(&[0xFF; 31]);
267
+ raw[127] = 0x01; // +1
268
+
269
+ let expected_neg1 = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[0..32]));
270
+ let expected_min = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[32..64]));
271
+ let expected_max = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[64..96]));
272
+ let expected_one = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[96..128]));
273
+
274
+ let mut writer = BufferWriter::new(&env);
275
+ writer.write_i256(expected_neg1).write_i256(expected_min).write_i256(expected_max).write_i256(expected_one);
276
+
277
+ let bytes = writer.to_bytes();
278
+ assert_eq!(bytes.len(), 128);
279
+ let got: [u8; 128] = bytes.to_array();
280
+ assert_eq!(got, raw);
281
+
282
+ // Roundtrip through BufferReader.
283
+ let mut reader = BufferReader::new(&bytes);
284
+ let roundtrip_neg1 = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[0..32]));
285
+ let roundtrip_min = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[32..64]));
286
+ let roundtrip_max = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[64..96]));
287
+ let roundtrip_one = I256::from_be_bytes(&env, &Bytes::from_slice(&env, &raw[96..128]));
288
+
289
+ assert_eq!(reader.read_i256(), roundtrip_neg1);
290
+ assert_eq!(reader.read_i256(), roundtrip_min);
291
+ assert_eq!(reader.read_i256(), roundtrip_max);
292
+ assert_eq!(reader.read_i256(), roundtrip_one);
293
+ assert_eq!(reader.remaining_len(), 0);
294
+ }
295
+
125
296
  #[test]
126
297
  fn test_write_primitives_roundtrip() {
127
298
  let env = Env::default();
@@ -1,3 +1,4 @@
1
+ mod auth;
1
2
  mod buffer_reader;
2
3
  mod buffer_writer;
3
4
  mod bytes_ext;
@@ -7,4 +8,5 @@ mod ownable;
7
8
  mod test_helper;
8
9
  mod testing_utils;
9
10
  mod ttl_configurable;
11
+ mod ttl_extendable;
10
12
  mod upgradeable;