@layerzerolabs/protocol-stellar-v2 0.2.13 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/.turbo/turbo-build.log +484 -337
  2. package/.turbo/turbo-lint.log +126 -56
  3. package/.turbo/turbo-test.log +1403 -984
  4. package/Cargo.lock +142 -3
  5. package/Cargo.toml +5 -1
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +219 -29
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/storage.rs +1 -1
  12. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  13. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  14. package/contracts/common-macros/src/tests/mod.rs +3 -2
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  18. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +26 -10
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
  21. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -41
  22. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
  23. package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
  24. package/contracts/common-macros/src/ttl_configurable.rs +21 -66
  25. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  26. package/contracts/common-macros/src/upgradeable.rs +76 -0
  27. package/contracts/common-macros/src/utils.rs +9 -0
  28. package/contracts/endpoint-v2/src/constants.rs +4 -4
  29. package/contracts/endpoint-v2/src/endpoint_v2.rs +58 -36
  30. package/contracts/endpoint-v2/src/errors.rs +4 -3
  31. package/contracts/endpoint-v2/src/events.rs +1 -1
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  35. package/contracts/endpoint-v2/src/storage.rs +1 -1
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +62 -10
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
  56. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
  67. package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
  68. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
  69. package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
  70. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
  71. package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
  72. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
  73. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +4 -6
  74. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
  75. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +16 -2
  76. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
  77. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
  78. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
  79. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
  80. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
  81. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
  82. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
  83. package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
  84. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
  85. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
  86. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
  87. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
  88. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
  89. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
  90. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
  91. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
  92. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
  93. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
  94. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
  95. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
  96. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
  97. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
  98. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
  99. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
  100. package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
  101. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
  102. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
  103. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
  104. package/contracts/layerzero-views/Cargo.toml +35 -0
  105. package/contracts/layerzero-views/src/errors.rs +10 -0
  106. package/contracts/layerzero-views/src/layerzero_view.rs +226 -0
  107. package/contracts/layerzero-views/src/lib.rs +38 -0
  108. package/contracts/layerzero-views/src/storage.rs +18 -0
  109. package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
  110. package/contracts/layerzero-views/src/tests/mod.rs +4 -0
  111. package/contracts/layerzero-views/src/tests/setup.rs +377 -0
  112. package/contracts/layerzero-views/src/types.rs +50 -0
  113. package/contracts/macro-integration-tests/Cargo.toml +30 -0
  114. package/contracts/macro-integration-tests/src/lib.rs +1 -0
  115. package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
  116. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
  117. package/contracts/macro-integration-tests/tests/runtime/ownable/only_auth_guard.rs +97 -0
  118. package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
  119. package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
  120. package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
  121. package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
  122. package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
  123. package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
  124. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
  125. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
  126. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +2 -0
  127. package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
  128. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
  129. package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
  130. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
  131. package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
  132. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
  133. package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
  134. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
  135. package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
  136. package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
  137. package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
  138. package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
  139. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +22 -0
  140. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +16 -0
  141. package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
  142. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +21 -0
  143. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +46 -0
  144. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
  145. package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
  146. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
  147. package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
  148. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
  149. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
  150. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
  151. package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
  152. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
  153. package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
  154. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
  155. package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
  156. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
  157. package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
  158. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
  159. package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
  160. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
  161. package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
  162. package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
  163. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
  164. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
  165. package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
  166. package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
  167. package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
  168. package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
  169. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
  170. package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
  171. package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
  172. package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
  173. package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
  174. package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
  175. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  176. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
  177. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
  178. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
  179. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
  180. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
  181. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
  182. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
  183. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
  184. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +49 -0
  185. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +73 -0
  186. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
  187. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
  188. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
  189. package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
  190. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
  191. package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
  192. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  193. package/contracts/message-libs/treasury/src/errors.rs +2 -3
  194. package/contracts/message-libs/treasury/src/events.rs +1 -1
  195. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  196. package/contracts/message-libs/treasury/src/lib.rs +3 -3
  197. package/contracts/message-libs/treasury/src/storage.rs +3 -1
  198. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  199. package/contracts/message-libs/treasury/src/treasury.rs +23 -26
  200. package/contracts/message-libs/uln-302/Cargo.toml +1 -1
  201. package/contracts/message-libs/uln-302/src/errors.rs +0 -5
  202. package/contracts/message-libs/uln-302/src/events.rs +5 -6
  203. package/contracts/message-libs/uln-302/src/receive_uln.rs +37 -56
  204. package/contracts/message-libs/uln-302/src/send_uln.rs +112 -138
  205. package/contracts/message-libs/uln-302/src/storage.rs +5 -5
  206. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
  207. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
  208. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
  209. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  210. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
  211. package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
  212. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
  213. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
  214. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
  215. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
  216. package/contracts/message-libs/uln-302/src/uln302.rs +10 -25
  217. package/contracts/oapps/counter/Cargo.toml +14 -1
  218. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  219. package/contracts/oapps/counter/integration_tests/setup_sml.rs +169 -0
  220. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  221. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  222. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  223. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  224. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  225. package/contracts/oapps/counter/src/counter.rs +67 -44
  226. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  227. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  228. package/contracts/oapps/oapp/src/errors.rs +5 -1
  229. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +318 -221
  230. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  231. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  232. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  233. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  234. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -9
  235. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -18
  236. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -8
  237. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -16
  238. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  239. package/contracts/oapps/oapp-macros/src/lib.rs +211 -0
  240. package/contracts/oapps/oft/integration-tests/setup.rs +34 -9
  241. package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
  242. package/contracts/oapps/oft/src/errors.rs +6 -1
  243. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -13
  244. package/contracts/oapps/oft/src/extensions/pausable.rs +5 -5
  245. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +23 -23
  246. package/contracts/oapps/oft/src/lib.rs +4 -2
  247. package/contracts/oapps/oft/src/oft.rs +31 -71
  248. package/contracts/oapps/oft/src/oft_impl.rs +201 -0
  249. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +2 -4
  250. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
  251. package/contracts/oapps/oft/src/storage.rs +2 -0
  252. package/contracts/oapps/oft/src/tests/extensions/setup.rs +60 -31
  253. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
  254. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
  255. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +6 -4
  256. package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
  257. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
  258. package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
  259. package/contracts/oapps/oft/src/tests/test_utils.rs +122 -81
  260. package/contracts/oapps/oft/src/types.rs +20 -0
  261. package/contracts/oapps/oft-std/Cargo.toml +6 -0
  262. package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
  263. package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
  264. package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
  265. package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
  266. package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
  267. package/contracts/oapps/{counter/integration_tests → oft-std/integration-tests}/setup.rs +76 -30
  268. package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
  269. package/contracts/oapps/oft-std/src/lib.rs +12 -1
  270. package/contracts/oapps/oft-std/src/oft.rs +141 -26
  271. package/contracts/upgrader/Cargo.toml +19 -0
  272. package/contracts/upgrader/src/lib.rs +96 -0
  273. package/contracts/upgrader/src/tests/mod.rs +1 -0
  274. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  275. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  276. package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
  277. package/contracts/utils/src/auth.rs +44 -0
  278. package/contracts/utils/src/errors.rs +32 -5
  279. package/contracts/utils/src/lib.rs +5 -1
  280. package/contracts/utils/src/multisig.rs +211 -0
  281. package/contracts/utils/src/ownable.rs +50 -60
  282. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  283. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  284. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  285. package/contracts/utils/src/tests/mod.rs +4 -1
  286. package/contracts/utils/src/tests/multisig.rs +731 -0
  287. package/contracts/utils/src/tests/option_ext.rs +18 -0
  288. package/contracts/utils/src/tests/ownable.rs +22 -70
  289. package/contracts/utils/src/tests/ttl_configurable.rs +607 -0
  290. package/contracts/utils/src/tests/upgradeable.rs +290 -0
  291. package/contracts/utils/src/ttl_configurable.rs +153 -0
  292. package/contracts/utils/src/ttl_extendable.rs +27 -0
  293. package/contracts/utils/src/upgradeable.rs +56 -0
  294. package/contracts/workers/dvn/Cargo.toml +2 -2
  295. package/contracts/workers/dvn/src/auth.rs +24 -35
  296. package/contracts/workers/dvn/src/dvn.rs +23 -14
  297. package/contracts/workers/dvn/src/errors.rs +1 -7
  298. package/contracts/workers/dvn/src/events.rs +1 -14
  299. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  300. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  301. package/contracts/workers/dvn/src/storage.rs +3 -13
  302. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  303. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  304. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  305. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  306. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  307. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  308. package/contracts/workers/dvn-fee-lib/Cargo.toml +0 -1
  309. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +45 -16
  310. package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
  311. package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
  312. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
  313. package/contracts/workers/executor/src/auth.rs +80 -16
  314. package/contracts/workers/executor/src/executor.rs +17 -29
  315. package/contracts/workers/executor/src/storage.rs +2 -9
  316. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  317. package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
  318. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +153 -121
  319. package/contracts/workers/executor-helper/Cargo.toml +1 -6
  320. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  321. package/contracts/workers/executor-helper/src/lib.rs +1 -7
  322. package/contracts/workers/price-feed/Cargo.toml +1 -2
  323. package/contracts/workers/price-feed/src/errors.rs +3 -2
  324. package/contracts/workers/price-feed/src/lib.rs +5 -6
  325. package/contracts/workers/price-feed/src/price_feed.rs +42 -23
  326. package/contracts/workers/worker/Cargo.toml +4 -0
  327. package/contracts/workers/worker/src/errors.rs +4 -0
  328. package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
  329. package/contracts/workers/worker/src/lib.rs +2 -2
  330. package/contracts/workers/worker/src/tests/mod.rs +4 -0
  331. package/contracts/workers/worker/src/tests/setup.rs +147 -0
  332. package/contracts/workers/worker/src/tests/worker.rs +502 -0
  333. package/contracts/workers/worker/src/worker.rs +28 -30
  334. package/package.json +8 -5
  335. package/sdk/.turbo/turbo-build.log +1 -0
  336. package/sdk/.turbo/turbo-test.log +1009 -0
  337. package/sdk/dist/generated/bml.d.ts +104 -37
  338. package/sdk/dist/generated/bml.js +83 -42
  339. package/sdk/dist/generated/counter.d.ts +334 -175
  340. package/sdk/dist/generated/counter.js +109 -63
  341. package/sdk/dist/generated/dvn.d.ts +1985 -0
  342. package/sdk/dist/generated/dvn.js +326 -0
  343. package/sdk/dist/generated/dvn_fee_lib.d.ts +690 -0
  344. package/sdk/dist/generated/dvn_fee_lib.js +163 -0
  345. package/sdk/dist/generated/endpoint.d.ts +155 -46
  346. package/sdk/dist/generated/endpoint.js +93 -50
  347. package/sdk/dist/generated/executor.d.ts +1841 -0
  348. package/sdk/dist/generated/executor.js +312 -0
  349. package/sdk/dist/generated/executor_fee_lib.d.ts +1083 -0
  350. package/sdk/dist/generated/executor_fee_lib.js +255 -0
  351. package/sdk/dist/generated/executor_helper.d.ts +981 -0
  352. package/sdk/dist/generated/executor_helper.js +236 -0
  353. package/sdk/dist/generated/oft_std.d.ts +1722 -0
  354. package/sdk/dist/generated/oft_std.js +316 -0
  355. package/sdk/dist/generated/price_feed.d.ts +1077 -0
  356. package/sdk/dist/generated/price_feed.js +210 -0
  357. package/sdk/dist/generated/sml.d.ts +171 -56
  358. package/sdk/dist/generated/sml.js +111 -62
  359. package/sdk/dist/generated/treasury.d.ts +896 -0
  360. package/sdk/dist/generated/treasury.js +219 -0
  361. package/sdk/dist/generated/uln302.d.ts +175 -75
  362. package/sdk/dist/generated/uln302.js +126 -82
  363. package/sdk/dist/generated/upgrader.d.ts +70 -0
  364. package/sdk/dist/generated/upgrader.js +19 -0
  365. package/sdk/dist/index.d.ts +10 -0
  366. package/sdk/dist/index.js +14 -0
  367. package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
  368. package/sdk/dist/wasm/blocked-message-lib.js +2 -0
  369. package/sdk/dist/wasm/counter.d.ts +1 -0
  370. package/sdk/dist/wasm/counter.js +2 -0
  371. package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
  372. package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
  373. package/sdk/dist/wasm/dvn.d.ts +1 -0
  374. package/sdk/dist/wasm/dvn.js +2 -0
  375. package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
  376. package/sdk/dist/wasm/endpoint-v2.js +2 -0
  377. package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
  378. package/sdk/dist/wasm/executor-fee-lib.js +2 -0
  379. package/sdk/dist/wasm/executor-helper.d.ts +1 -0
  380. package/sdk/dist/wasm/executor-helper.js +2 -0
  381. package/sdk/dist/wasm/executor.d.ts +1 -0
  382. package/sdk/dist/wasm/executor.js +2 -0
  383. package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
  384. package/sdk/dist/wasm/layerzero-views.js +2 -0
  385. package/sdk/dist/wasm/oft-std.d.ts +1 -0
  386. package/sdk/dist/wasm/oft-std.js +2 -0
  387. package/sdk/dist/wasm/price-feed.d.ts +1 -0
  388. package/sdk/dist/wasm/price-feed.js +2 -0
  389. package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
  390. package/sdk/dist/wasm/simple-message-lib.js +2 -0
  391. package/sdk/dist/wasm/treasury.d.ts +1 -0
  392. package/sdk/dist/wasm/treasury.js +2 -0
  393. package/sdk/dist/wasm/uln302.d.ts +1 -0
  394. package/sdk/dist/wasm/uln302.js +2 -0
  395. package/sdk/dist/wasm/upgrader.d.ts +1 -0
  396. package/sdk/dist/wasm/upgrader.js +2 -0
  397. package/sdk/dist/wasm.d.ts +15 -0
  398. package/sdk/dist/wasm.js +15 -0
  399. package/sdk/package.json +7 -4
  400. package/sdk/src/index.ts +17 -0
  401. package/sdk/test/counter-sml.test.ts +376 -0
  402. package/sdk/test/counter-uln.test.ts +493 -0
  403. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +187 -323
  404. package/sdk/test/suites/constants.ts +22 -2
  405. package/sdk/test/suites/dummyContractClient.ts +169 -0
  406. package/sdk/test/suites/globalSetup.ts +450 -0
  407. package/sdk/test/suites/localnet.ts +23 -6
  408. package/sdk/test/upgrader.test.ts +300 -0
  409. package/sdk/test/utils.ts +558 -85
  410. package/sdk/vitest.config.ts +21 -0
  411. package/tools/ts-bindings-gen/src/main.rs +12 -1
  412. package/turbo.json +2 -0
  413. package/contracts/common-macros/src/contract_impl.rs +0 -47
  414. package/contracts/common-macros/src/ownable.rs +0 -59
  415. package/contracts/common-macros/src/tests/contract_impl.rs +0 -381
  416. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -32
  417. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
  418. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
  419. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
  420. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
  421. package/contracts/oapp-macros/src/lib.rs +0 -154
  422. package/contracts/oapp-macros/src/oapp_core.rs +0 -40
  423. package/contracts/oapp-macros/src/oapp_full.rs +0 -21
  424. package/contracts/oapp-macros/src/oapp_options_type3.rs +0 -31
  425. package/contracts/oapp-macros/src/oapp_receiver.rs +0 -48
  426. package/contracts/oapp-macros/src/oapp_sender.rs +0 -21
  427. package/contracts/oapp-macros/src/util.rs +0 -107
  428. package/contracts/oapps/oft/src/constants.rs +0 -5
  429. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -146
  430. package/contracts/utils/src/tests/ttl.rs +0 -421
  431. package/contracts/utils/src/ttl.rs +0 -123
  432. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  433. package/contracts/workers/dvn/src/multisig.rs +0 -153
  434. package/sdk/test/index.test.ts +0 -376
  435. /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
@@ -0,0 +1,290 @@
1
+ use crate::upgradeable::{self, Upgradeable, UpgradeableInternal, UpgradeableStorage};
2
+ use soroban_sdk::{contract, contractimpl, Bytes, BytesN, Env, Symbol};
3
+
4
+ // #![no_std]
5
+
6
+ // use soroban_sdk::{contract, contractimpl, BytesN, Env, Symbol};
7
+ // use utils::upgradeable::{self, Upgradeable, UpgradeableInternal};
8
+
9
+ // #[contract]
10
+ // pub struct DummyContract;
11
+
12
+ // impl UpgradeableInternal for DummyContract {
13
+ // type MigrationData = ();
14
+
15
+ // fn _migrate(env: &Env, _migration_data: &Self::MigrationData) {
16
+ // // Store the migration data to verify it was called
17
+ // env.storage().instance().set(&Symbol::new(env, "migrated"), &true);
18
+ // }
19
+ // }
20
+
21
+ // #[contractimpl]
22
+ // impl Upgradeable for DummyContract {
23
+ // fn upgrade(env: &Env, new_wasm_hash: BytesN<32>) {
24
+ // upgradeable::upgrade(env, new_wasm_hash);
25
+ // }
26
+
27
+ // fn migrate(env: &Env, migration_data: &()) {
28
+ // upgradeable::migrate::<Self>(env, migration_data);
29
+ // }
30
+ // }
31
+
32
+ // Hardcoded test WASM bytes for upgrade testing
33
+ // This is the compiled above dummy_contract WASM
34
+ const TEST_WASM: &[u8] = &[
35
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x29, 0x08, 0x60, 0x01, 0x7e, 0x01, 0x7e, 0x60, 0x02, 0x7e,
36
+ 0x7e, 0x01, 0x7e, 0x60, 0x03, 0x7e, 0x7e, 0x7e, 0x01, 0x7e, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x00, 0x01, 0x7e, 0x60,
37
+ 0x00, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f, 0x00, 0x60, 0x02, 0x7e, 0x7e, 0x00, 0x02, 0x31, 0x08, 0x01, 0x62, 0x01,
38
+ 0x38, 0x00, 0x00, 0x01, 0x6c, 0x01, 0x36, 0x00, 0x00, 0x01, 0x6c, 0x01, 0x30, 0x00, 0x01, 0x01, 0x6c, 0x01, 0x31,
39
+ 0x00, 0x01, 0x01, 0x62, 0x01, 0x6a, 0x00, 0x01, 0x01, 0x78, 0x01, 0x35, 0x00, 0x00, 0x01, 0x6c, 0x01, 0x5f, 0x00,
40
+ 0x02, 0x01, 0x76, 0x01, 0x67, 0x00, 0x01, 0x03, 0x08, 0x07, 0x00, 0x03, 0x00, 0x04, 0x05, 0x06, 0x07, 0x05, 0x03,
41
+ 0x01, 0x00, 0x11, 0x06, 0x21, 0x04, 0x7f, 0x01, 0x41, 0x80, 0x80, 0xc0, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0x88, 0x80,
42
+ 0xc0, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0x91, 0x80, 0xc0, 0x00, 0x0b, 0x7f, 0x00, 0x41, 0xa0, 0x80, 0xc0, 0x00, 0x0b,
43
+ 0x07, 0x3d, 0x06, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64,
44
+ 0x65, 0x00, 0x08, 0x07, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0a, 0x01, 0x5f, 0x03, 0x01, 0x0a, 0x5f,
45
+ 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x6e, 0x64, 0x03, 0x02, 0x0b, 0x5f, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f,
46
+ 0x62, 0x61, 0x73, 0x65, 0x03, 0x03, 0x0a, 0x80, 0x05, 0x07, 0x41, 0x00, 0x02, 0x40, 0x02, 0x40, 0x20, 0x00, 0x42,
47
+ 0xff, 0x01, 0x83, 0x42, 0xc8, 0x00, 0x52, 0x0d, 0x00, 0x20, 0x00, 0x10, 0x80, 0x80, 0x80, 0x80, 0x00, 0x42, 0x80,
48
+ 0x80, 0x80, 0x80, 0x70, 0x83, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x04, 0x51, 0x0d, 0x01, 0x0b, 0x00, 0x0b, 0x41,
49
+ 0x01, 0x10, 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x42, 0x02, 0x0b,
50
+ 0x15, 0x00, 0x10, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0xad, 0x42, 0xff, 0x01, 0x83, 0x10, 0x8e, 0x80, 0x80,
51
+ 0x80, 0x00, 0x0b, 0x97, 0x01, 0x01, 0x01, 0x7f, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01,
52
+ 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x00, 0x42, 0xff, 0x01, 0x83, 0x42, 0x02, 0x52, 0x0d, 0x00,
53
+ 0x02, 0x40, 0x02, 0x40, 0x10, 0x8b, 0x80, 0x80, 0x80, 0x00, 0x22, 0x00, 0x42, 0x02, 0x10, 0x82, 0x80, 0x80, 0x80,
54
+ 0x00, 0x42, 0x01, 0x52, 0x0d, 0x00, 0x20, 0x00, 0x42, 0x02, 0x10, 0x83, 0x80, 0x80, 0x80, 0x00, 0xa7, 0x41, 0xff,
55
+ 0x01, 0x71, 0x0e, 0x02, 0x00, 0x01, 0x02, 0x0b, 0x10, 0x8c, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0b, 0x41, 0x00, 0x10,
56
+ 0x89, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x41, 0x80, 0x80, 0xc0, 0x80, 0x00, 0x41, 0x08, 0x10, 0x8d, 0x80, 0x80,
57
+ 0x80, 0x00, 0x20, 0x01, 0x28, 0x02, 0x00, 0x41, 0x01, 0x46, 0x0d, 0x00, 0x20, 0x01, 0x29, 0x03, 0x08, 0x42, 0x01,
58
+ 0x10, 0x8e, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x41, 0x10, 0x6a, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x42, 0x02,
59
+ 0x0f, 0x0b, 0x00, 0x0b, 0x63, 0x02, 0x01, 0x7f, 0x01, 0x7e, 0x23, 0x80, 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b,
60
+ 0x22, 0x00, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x00, 0x41, 0x88, 0x80, 0xc0, 0x80, 0x00, 0x41, 0x09, 0x10,
61
+ 0x8d, 0x80, 0x80, 0x80, 0x00, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x01, 0x47, 0x0d, 0x00, 0x00, 0x0b,
62
+ 0x20, 0x00, 0x20, 0x00, 0x29, 0x03, 0x08, 0x37, 0x03, 0x00, 0x20, 0x00, 0xad, 0x42, 0x20, 0x86, 0x42, 0x04, 0x84,
63
+ 0x42, 0x84, 0x80, 0x80, 0x80, 0x10, 0x10, 0x87, 0x80, 0x80, 0x80, 0x00, 0x21, 0x01, 0x20, 0x00, 0x41, 0x10, 0x6a,
64
+ 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x01, 0x0b, 0x11, 0x00, 0x42, 0x83, 0x80, 0x80, 0x80, 0xc0, 0xbb, 0x01,
65
+ 0x10, 0x85, 0x80, 0x80, 0x80, 0x00, 0x1a, 0x0b, 0x86, 0x02, 0x03, 0x01, 0x7f, 0x01, 0x7e, 0x04, 0x7f, 0x23, 0x80,
66
+ 0x80, 0x80, 0x80, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x03, 0x24, 0x80, 0x80, 0x80, 0x80, 0x00, 0x42, 0x00, 0x21, 0x04,
67
+ 0x20, 0x02, 0x21, 0x05, 0x20, 0x01, 0x21, 0x06, 0x02, 0x40, 0x02, 0x40, 0x03, 0x40, 0x20, 0x05, 0x45, 0x0d, 0x01,
68
+ 0x41, 0x01, 0x21, 0x07, 0x02, 0x40, 0x02, 0x40, 0x20, 0x06, 0x2d, 0x00, 0x00, 0x22, 0x08, 0x41, 0xdf, 0x00, 0x46,
69
+ 0x0d, 0x00, 0x02, 0x40, 0x20, 0x08, 0x41, 0x50, 0x6a, 0x41, 0xff, 0x01, 0x71, 0x41, 0x0a, 0x49, 0x0d, 0x00, 0x02,
70
+ 0x40, 0x20, 0x08, 0x41, 0xbf, 0x7f, 0x6a, 0x41, 0xff, 0x01, 0x71, 0x41, 0x1a, 0x49, 0x0d, 0x00, 0x20, 0x08, 0x41,
71
+ 0x9f, 0x7f, 0x6a, 0x41, 0xff, 0x01, 0x71, 0x41, 0x19, 0x4b, 0x0d, 0x03, 0x20, 0x08, 0x41, 0x45, 0x6a, 0x21, 0x07,
72
+ 0x0c, 0x02, 0x0b, 0x20, 0x08, 0x41, 0x4b, 0x6a, 0x21, 0x07, 0x0c, 0x01, 0x0b, 0x20, 0x08, 0x41, 0x52, 0x6a, 0x21,
73
+ 0x07, 0x0b, 0x20, 0x04, 0x42, 0x06, 0x86, 0x20, 0x07, 0xad, 0x42, 0xff, 0x01, 0x83, 0x84, 0x21, 0x04, 0x20, 0x05,
74
+ 0x41, 0x7f, 0x6a, 0x21, 0x05, 0x20, 0x06, 0x41, 0x01, 0x6a, 0x21, 0x06, 0x0c, 0x01, 0x0b, 0x0b, 0x20, 0x03, 0x20,
75
+ 0x08, 0xad, 0x42, 0x08, 0x86, 0x42, 0x01, 0x84, 0x37, 0x03, 0x00, 0x20, 0x01, 0xad, 0x42, 0x20, 0x86, 0x42, 0x04,
76
+ 0x84, 0x20, 0x02, 0xad, 0x42, 0x20, 0x86, 0x42, 0x04, 0x84, 0x10, 0x84, 0x80, 0x80, 0x80, 0x00, 0x21, 0x04, 0x0c,
77
+ 0x01, 0x0b, 0x20, 0x03, 0x20, 0x04, 0x42, 0x08, 0x86, 0x42, 0x0e, 0x84, 0x22, 0x04, 0x37, 0x02, 0x04, 0x0b, 0x20,
78
+ 0x00, 0x42, 0x00, 0x37, 0x03, 0x00, 0x20, 0x00, 0x20, 0x04, 0x37, 0x03, 0x08, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x24,
79
+ 0x80, 0x80, 0x80, 0x80, 0x00, 0x0b, 0x0f, 0x00, 0x20, 0x00, 0x20, 0x01, 0x42, 0x02, 0x10, 0x86, 0x80, 0x80, 0x80,
80
+ 0x00, 0x1a, 0x0b, 0x0b, 0x1a, 0x01, 0x00, 0x41, 0x80, 0x80, 0xc0, 0x00, 0x0b, 0x11, 0x6d, 0x69, 0x67, 0x72, 0x61,
81
+ 0x74, 0x65, 0x64, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x00, 0xdf, 0x0d, 0x0e, 0x63, 0x6f, 0x6e,
82
+ 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x70, 0x65, 0x63, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83
+ 0x00, 0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
84
+ 0x00, 0x00, 0x00, 0x00, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x00,
85
+ 0x00, 0x00, 0x00, 0x00, 0x03, 0xee, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, 0x00, 0x01,
87
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64,
88
+ 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x03, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x42, 0x75, 0x66, 0x66, 0x65,
90
+ 0x72, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
91
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x65, 0x6e, 0x67,
92
+ 0x74, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x6e,
93
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64,
94
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95
+ 0x00, 0x00, 0x00, 0x11, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x57, 0x72, 0x69, 0x74, 0x65, 0x72, 0x45, 0x72, 0x72,
96
+ 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x49, 0x6e,
97
+ 0x76, 0x61, 0x6c, 0x69, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64,
98
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99
+ 0x00, 0x00, 0x00, 0x08, 0x54, 0x74, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
100
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66,
101
+ 0x69, 0x67, 0x00, 0x00, 0x04, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x54, 0x74, 0x6c, 0x43, 0x6f,
102
+ 0x6e, 0x66, 0x69, 0x67, 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x04, 0xb1, 0x00, 0x00, 0x00, 0x00,
103
+ 0x00, 0x00, 0x00, 0x16, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x6c, 0x72, 0x65, 0x61, 0x64,
104
+ 0x79, 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x04, 0xb2, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
105
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x4f, 0x77, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72,
106
+ 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x4f, 0x77, 0x6e, 0x65,
107
+ 0x72, 0x41, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x65, 0x74, 0x00, 0x00, 0x00, 0x05, 0x14, 0x00, 0x00, 0x00,
108
+ 0x00, 0x00, 0x00, 0x00, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x00, 0x00, 0x00,
109
+ 0x05, 0x15, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x42,
110
+ 0x79, 0x74, 0x65, 0x73, 0x45, 0x78, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
111
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x69, 0x73, 0x6d, 0x61,
112
+ 0x74, 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x05, 0x78, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x72,
114
+ 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x4d, 0x69, 0x67, 0x72,
115
+ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x00, 0x00, 0x00, 0x05,
116
+ 0xdc, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74,
117
+ 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x20,
118
+ 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00,
119
+ 0x00, 0x00, 0x00, 0x14, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66,
120
+ 0x65, 0x72, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73,
121
+ 0x68, 0x69, 0x70, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00,
122
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x00, 0x00, 0x00,
123
+ 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x6e, 0x65, 0x77,
124
+ 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x69,
126
+ 0x74, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70,
127
+ 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00,
128
+ 0x00, 0x00, 0x00, 0x00, 0x12, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x6e, 0x6f, 0x75,
129
+ 0x6e, 0x63, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x4f, 0x77, 0x6e, 0x65, 0x72,
130
+ 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
131
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x00, 0x00,
132
+ 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
133
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x77,
134
+ 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
135
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x00, 0x00,
136
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x57, 0x41, 0x20, 0x70, 0x61, 0x69, 0x72, 0x20, 0x6f, 0x66, 0x20,
137
+ 0x54, 0x54, 0x4c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x3a, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f,
138
+ 0x6c, 0x64, 0x20, 0x28, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
139
+ 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x74,
140
+ 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x20, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x54, 0x54, 0x4c, 0x29,
141
+ 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
142
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x54,
143
+ 0x54, 0x4c, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20,
144
+ 0x28, 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x73, 0x29, 0x2e, 0x00, 0x00, 0x00, 0x09, 0x65, 0x78,
145
+ 0x74, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x33, 0x54,
146
+ 0x54, 0x4c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74,
147
+ 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28,
148
+ 0x69, 0x6e, 0x20, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x73, 0x29, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x09, 0x74, 0x68,
149
+ 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00,
150
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69,
151
+ 0x67, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152
+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
154
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x00, 0x00,
155
+ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x27, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6d, 0x69, 0x74, 0x74,
156
+ 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x54, 0x54, 0x4c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73,
157
+ 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x65, 0x74, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x54,
158
+ 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x53, 0x65, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
159
+ 0x00, 0x00, 0x00, 0x0d, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x53, 0x65, 0x74, 0x00, 0x00,
160
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e,
161
+ 0x63, 0x65, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x00, 0x09, 0x54, 0x74, 0x6c, 0x43, 0x6f,
162
+ 0x6e, 0x66, 0x69, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a,
163
+ 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x07,
164
+ 0xd0, 0x00, 0x00, 0x00, 0x09, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00,
165
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x2a, 0x45, 0x76, 0x65, 0x6e, 0x74,
166
+ 0x20, 0x65, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x54, 0x54, 0x4c, 0x20, 0x63,
167
+ 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x2e, 0x00,
168
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x54, 0x74, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73,
169
+ 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x54, 0x74, 0x6c, 0x43, 0x6f,
170
+ 0x6e, 0x66, 0x69, 0x67, 0x73, 0x46, 0x72, 0x6f, 0x7a, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
171
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x55, 0x70, 0x67,
172
+ 0x72, 0x61, 0x64, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00,
173
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4d, 0x69, 0x67, 0x72, 0x61,
174
+ 0x74, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65,
175
+ 0x6e, 0x76, 0x6d, 0x65, 0x74, 0x61, 0x76, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
176
+ 0x00, 0x00, 0x6f, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x76, 0x30, 0x00,
177
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x72, 0x73, 0x76, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
178
+ 0x31, 0x2e, 0x39, 0x30, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x72, 0x73, 0x73,
179
+ 0x64, 0x6b, 0x76, 0x65, 0x72, 0x00, 0x00, 0x00, 0x2f, 0x32, 0x33, 0x2e, 0x34, 0x2e, 0x30, 0x23, 0x36, 0x37, 0x33,
180
+ 0x64, 0x36, 0x63, 0x34, 0x66, 0x32, 0x33, 0x36, 0x38, 0x64, 0x32, 0x38, 0x32, 0x64, 0x32, 0x35, 0x64, 0x61, 0x32,
181
+ 0x39, 0x62, 0x64, 0x61, 0x35, 0x35, 0x63, 0x32, 0x31, 0x62, 0x38, 0x62, 0x65, 0x36, 0x39, 0x63, 0x61, 0x36, 0x00,
182
+ 0x00, 0x2b, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x76, 0x30, 0x00, 0x00,
183
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x63, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x32,
184
+ 0x33, 0x2e, 0x33, 0x2e, 0x30, 0x23, 0x00,
185
+ ];
186
+
187
+ // ============================================
188
+ // Dummy Contract for Testing
189
+ // ============================================
190
+
191
+ #[contract]
192
+ pub struct DummyContract;
193
+
194
+ // Regular trait implementation (not a contract implementation)
195
+ impl UpgradeableInternal for DummyContract {
196
+ type MigrationData = ();
197
+
198
+ fn __migrate(env: &Env, _migration_data: &Self::MigrationData) {
199
+ // Store the migration data to verify it was called
200
+ env.storage().instance().set(&Symbol::new(env, "migrated"), &0_u32);
201
+ }
202
+ }
203
+
204
+ #[contractimpl]
205
+ impl Upgradeable for DummyContract {
206
+ fn upgrade(env: &Env, new_wasm_hash: BytesN<32>) {
207
+ upgradeable::upgrade(env, new_wasm_hash);
208
+ }
209
+
210
+ fn migrate(env: &Env, migration_data: &()) {
211
+ upgradeable::migrate::<Self>(env, migration_data);
212
+ }
213
+ }
214
+
215
+ #[test]
216
+ fn test_upgrade_success() {
217
+ let env = Env::default();
218
+ let contract_id = env.register(DummyContract, ());
219
+
220
+ // Upload valid contract WASM to get a valid hash
221
+ let wasm_hash = env.deployer().upload_contract_wasm(Bytes::from_slice(&env, TEST_WASM));
222
+
223
+ env.as_contract(&contract_id, || {
224
+ // Initially, migrating flag should not be set
225
+ assert_eq!(UpgradeableStorage::migrating(&env), None);
226
+ });
227
+
228
+ // Call the actual upgrade function with valid WASM hash
229
+ let client = DummyContractClient::new(&env, &contract_id);
230
+ client.upgrade(&wasm_hash);
231
+
232
+ env.as_contract(&contract_id, || {
233
+ // Verify the flag is set by upgrade()
234
+ assert_eq!(UpgradeableStorage::migrating(&env), Some(true));
235
+ });
236
+ }
237
+
238
+ #[test]
239
+ fn test_migrate_success() {
240
+ let env = Env::default();
241
+ let contract_id = env.register(DummyContract, ());
242
+ let client = DummyContractClient::new(&env, &contract_id);
243
+
244
+ let wasm_hash = env.deployer().upload_contract_wasm(Bytes::from_slice(&env, TEST_WASM));
245
+ client.upgrade(&wasm_hash);
246
+ client.migrate(&());
247
+
248
+ env.as_contract(&contract_id, || {
249
+ // Verify migration flag was cleared
250
+ assert_eq!(UpgradeableStorage::migrating(&env), Some(false));
251
+
252
+ // Verify migration data was stored (proving _migrate was called)
253
+ let stored_value: Option<bool> = env.storage().instance().get(&Symbol::new(&env, "migrated"));
254
+ assert_eq!(stored_value, Some(true));
255
+ });
256
+ }
257
+
258
+ #[test]
259
+ #[should_panic(expected = "Error(Contract, #1050)")] // MigrationNotAllowed
260
+ fn test_migrate_fail_without_upgrade() {
261
+ let env = Env::default();
262
+ let contract_id = env.register(DummyContract, ());
263
+ let client = DummyContractClient::new(&env, &contract_id);
264
+
265
+ // Try to migrate without setting migrating flag first
266
+ // Should panic with MigrationNotAllowed
267
+ client.migrate(&());
268
+ }
269
+
270
+ // ============================================
271
+ // Integration test: upgrade then migrate
272
+ // ============================================
273
+
274
+ // TODO (ken): change error code to 1050 and fix test
275
+ #[test]
276
+ #[should_panic(expected = "Error(Contract, #1500)")] // MigrationNotAllowed (TEST_WASM uses old error code)
277
+ fn test_cannot_migrate_twice_without_upgrade() {
278
+ let env = Env::default();
279
+ let contract_id = env.register(DummyContract, ());
280
+ let client = DummyContractClient::new(&env, &contract_id);
281
+
282
+ // First upgrade and migrate with valid WASM
283
+ // Note: TEST_WASM is a pre-compiled contract with old error codes (1500 instead of 1050)
284
+ let wasm_hash = env.deployer().upload_contract_wasm(Bytes::from_slice(&env, TEST_WASM));
285
+ client.upgrade(&wasm_hash);
286
+ client.migrate(&());
287
+
288
+ // Try to migrate again without upgrade - should panic
289
+ client.migrate(&());
290
+ }
@@ -0,0 +1,153 @@
1
+ use crate::{
2
+ self as utils,
3
+ auth::{require_auth, Auth},
4
+ errors::TtlConfigurableError,
5
+ };
6
+ use common_macros::contract_trait;
7
+ use soroban_sdk::{assert_with_error, contractevent, contracttype, Env};
8
+
9
+ /// Ledgers per day (~5 second close time).
10
+ pub const LEDGERS_PER_DAY: u32 = (24 * 3600) / 5;
11
+
12
+ /// Maximum TTL (1 year) allowed by the protocol.
13
+ /// Note: Stellar's current maximum TTL is 6 months, but this constraint may change
14
+ /// in the future. In order to preserve LayerZero's censorship-resistance and protect
15
+ /// users from abusive parameter changes, a constant upper bound is enforced on the
16
+ /// extend_to value.
17
+ pub const MAX_TTL: u32 = 365 * LEDGERS_PER_DAY;
18
+
19
+ /// TTL configuration: threshold (when to extend) and extend_to (target TTL).
20
+ #[contracttype]
21
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
22
+ pub struct TtlConfig {
23
+ /// TTL threshold that triggers extension (in ledgers).
24
+ pub threshold: u32,
25
+ /// Target TTL after extension (in ledgers).
26
+ pub extend_to: u32,
27
+ }
28
+
29
+ impl TtlConfig {
30
+ /// Creates a new TTL config.
31
+ pub const fn new(threshold: u32, extend_to: u32) -> Self {
32
+ Self { threshold, extend_to }
33
+ }
34
+
35
+ /// Validates that threshold <= extend_to <= max_ttl.
36
+ pub fn is_valid(&self, max_ttl: u32) -> bool {
37
+ self.threshold <= self.extend_to && self.extend_to <= max_ttl
38
+ }
39
+ }
40
+
41
+ // =============================================================================
42
+ // Events
43
+ // =============================================================================
44
+
45
+ /// Event emitted when TTL configs are set.
46
+ #[contractevent]
47
+ #[derive(Clone, Debug, Eq, PartialEq)]
48
+ pub struct TtlConfigsSet {
49
+ pub instance: Option<TtlConfig>,
50
+ pub persistent: Option<TtlConfig>,
51
+ }
52
+
53
+ /// Event emitted when TTL configs are frozen.
54
+ #[contractevent]
55
+ #[derive(Clone, Debug, Eq, PartialEq)]
56
+ pub struct TtlConfigsFrozen {}
57
+
58
+ // =============================================================================
59
+ // Storage for default implementation
60
+ // =============================================================================
61
+
62
+ /// Storage keys for TTL configuration.
63
+ ///
64
+ /// Note: Auto-TTL extension is disabled for these instance storage entries to avoid infinite
65
+ /// recursion. Extending TTL config storage would require reading the TTL config, which would
66
+ /// trigger another extension, creating a deep loop.
67
+ #[common_macros::storage]
68
+ pub enum TtlConfigStorage {
69
+ #[instance(bool)]
70
+ #[default(false)]
71
+ Frozen,
72
+
73
+ #[instance(TtlConfig)]
74
+ Instance,
75
+
76
+ #[instance(TtlConfig)]
77
+ Persistent,
78
+ }
79
+
80
+ /// Initializes TTL configs with the default values (threshold: 29 days, extend_to: 30 days).
81
+ ///
82
+ /// This sets both instance and persistent TTL configs to `DEFAULT_TTL_CONFIG`.
83
+ pub fn init_default_ttl_configs(env: &Env) {
84
+ let default_ttl_config = TtlConfig::new(29 * LEDGERS_PER_DAY, 30 * LEDGERS_PER_DAY);
85
+ TtlConfigStorage::set_instance(env, &default_ttl_config);
86
+ TtlConfigStorage::set_persistent(env, &default_ttl_config);
87
+ }
88
+
89
+ /// Trait for contracts that support configurable TTL (Time-To-Live) management.
90
+ ///
91
+ /// Allows the contract authorizer to configure how long instance and persistent storage entries
92
+ /// remain alive on Stellar.
93
+ ///
94
+ /// The authorizer can also permanently freeze the configuration to prevent future changes,
95
+ /// providing immutability guarantees to users.
96
+ ///
97
+ /// Requires the `Auth` trait to be implemented, which can be provided by either:
98
+ /// - `#[ownable]` macro for single-owner contracts
99
+ /// - `Multisig` trait for multisig-controlled contracts
100
+ #[contract_trait]
101
+ pub trait TtlConfigurable: Auth {
102
+ /// Sets TTL configs for instance and persistent storage.
103
+ ///
104
+ /// - `None` values remove the corresponding config (disables auto-extension for that type)
105
+ /// - Validates that `threshold <= extend_to <= MAX_TTL`
106
+ ///
107
+ /// # Arguments
108
+ /// - `instance` - TTL config for instance storage
109
+ /// - `persistent` - TTL config for persistent storage
110
+ ///
111
+ /// # Panics
112
+ /// - `TtlConfigFrozen` if configs are frozen
113
+ /// - `InvalidTtlConfig` if validation fails
114
+ fn set_ttl_configs(env: &Env, instance: &Option<TtlConfig>, persistent: &Option<TtlConfig>) {
115
+ require_auth::<Self>(env);
116
+ assert_with_error!(env, !Self::is_ttl_configs_frozen(env), TtlConfigurableError::TtlConfigFrozen);
117
+
118
+ let max_ttl = u32::min(MAX_TTL, env.storage().max_ttl());
119
+ let all_valid = [instance, persistent].iter().all(|c| c.is_none_or(|cfg| cfg.is_valid(max_ttl)));
120
+ assert_with_error!(env, all_valid, TtlConfigurableError::InvalidTtlConfig);
121
+
122
+ TtlConfigStorage::set_or_remove_instance(env, instance);
123
+ TtlConfigStorage::set_or_remove_persistent(env, persistent);
124
+
125
+ TtlConfigsSet { instance: *instance, persistent: *persistent }.publish(env);
126
+ }
127
+
128
+ /// Returns the current TTL configs as (instance_config, persistent_config).
129
+ fn ttl_configs(env: &Env) -> (Option<TtlConfig>, Option<TtlConfig>) {
130
+ (TtlConfigStorage::instance(env), TtlConfigStorage::persistent(env))
131
+ }
132
+
133
+ /// Permanently freezes TTL configs, preventing any future modifications.
134
+ ///
135
+ /// This is irreversible and provides immutability guarantees to users.
136
+ /// Emits `TtlConfigsFrozen` event.
137
+ ///
138
+ /// # Panics
139
+ /// - `TtlConfigAlreadyFrozen` if already frozen
140
+ fn freeze_ttl_configs(env: &Env) {
141
+ require_auth::<Self>(env);
142
+ assert_with_error!(env, !Self::is_ttl_configs_frozen(env), TtlConfigurableError::TtlConfigAlreadyFrozen);
143
+
144
+ TtlConfigStorage::set_frozen(env, &true);
145
+
146
+ TtlConfigsFrozen {}.publish(env);
147
+ }
148
+
149
+ /// Returns whether TTL configs are frozen.
150
+ fn is_ttl_configs_frozen(env: &Env) -> bool {
151
+ TtlConfigStorage::frozen(env)
152
+ }
153
+ }
@@ -0,0 +1,27 @@
1
+ //! TtlExtendable trait for manual instance TTL extension.
2
+ //!
3
+ //! This module provides the `TtlExtendable` trait which allows external callers
4
+ //! to extend a contract's instance storage TTL, keeping the contract alive.
5
+
6
+ use soroban_sdk::Env;
7
+
8
+ /// Trait for contracts that support manual instance TTL extension.
9
+ ///
10
+ /// This trait provides a public contract function to extend the instance storage TTL,
11
+ /// allowing external callers to keep the contract alive by paying for TTL extension.
12
+ ///
13
+ /// Uses `#[soroban_sdk::contracttrait]` directly (not `#[common_macros::contract_trait]`)
14
+ /// because auto TTL extension would be redundant for a trait whose purpose is manual
15
+ /// TTL control.
16
+ #[soroban_sdk::contracttrait]
17
+ pub trait TtlExtendable {
18
+ /// Extends the instance TTL.
19
+ ///
20
+ /// # Arguments
21
+ ///
22
+ /// * `threshold` - The threshold to extend the TTL (if current TTL is below this, extend).
23
+ /// * `extend_to` - The TTL to extend to.
24
+ fn extend_instance_ttl(env: &Env, threshold: u32, extend_to: u32) {
25
+ env.storage().instance().extend_ttl(threshold, extend_to);
26
+ }
27
+ }
@@ -0,0 +1,56 @@
1
+ use crate::errors::UpgradeableError;
2
+ use common_macros::storage;
3
+ use soroban_sdk::{assert_with_error, BytesN, Env, FromVal, Val};
4
+
5
+ // ============================================
6
+ // Upgradeable Interface
7
+ // ============================================
8
+
9
+ /// Trait for contracts with upgrade and migration support.
10
+ pub trait Upgradeable: UpgradeableInternal {
11
+ /// Upgrades the contract to new WASM bytecode.
12
+ /// Sets a migration flag that must be cleared by calling `migrate`.
13
+ fn upgrade(env: &Env, new_wasm_hash: BytesN<32>);
14
+
15
+ /// Runs migration logic after an upgrade.
16
+ /// Can only be called when the migration flag is set by a previous `upgrade` call.
17
+ fn migrate(env: &Env, migration_data: &Self::MigrationData);
18
+ }
19
+
20
+ /// Trait for defining contract-specific migration logic.
21
+ /// Contracts using `#[upgradeable]` must implement this trait.
22
+ pub trait UpgradeableInternal {
23
+ /// The type of data required for migration.
24
+ /// This is the type used as the `migration_data` parameter in `Upgradeable::migrate` for this contract.
25
+ type MigrationData: FromVal<Env, Val>;
26
+
27
+ /// Internal migration logic to be implemented by the contract.
28
+ fn __migrate(env: &Env, migration_data: &Self::MigrationData);
29
+ }
30
+
31
+ // ============================================
32
+ // Storage and Helper Functions
33
+ // ============================================
34
+
35
+ /// Storage keys for upgrade migration state.
36
+ #[storage]
37
+ pub enum UpgradeableStorage {
38
+ #[instance(bool)]
39
+ Migrating,
40
+ }
41
+
42
+ /// Upgrades the contract to new WASM bytecode and sets the migration flag.
43
+ pub fn upgrade(env: &Env, new_wasm_hash: BytesN<32>) {
44
+ UpgradeableStorage::set_migrating(env, &true);
45
+ env.deployer().update_current_contract_wasm(new_wasm_hash);
46
+ }
47
+
48
+ /// Runs migration logic after an upgrade.
49
+ /// Can only be called when the migration flag is set by a previous `upgrade` call.
50
+ pub fn migrate<T: UpgradeableInternal>(env: &Env, migration_data: &T::MigrationData) {
51
+ assert_with_error!(env, UpgradeableStorage::migrating(env).unwrap_or(false), UpgradeableError::MigrationNotAllowed);
52
+ UpgradeableStorage::set_migrating(env, &false);
53
+ T::__migrate(env, migration_data);
54
+ }
55
+
56
+ // TODO (hanson): review and polish this
@@ -10,7 +10,7 @@ library = []
10
10
  testutils = []
11
11
 
12
12
  [lib]
13
- crate-type = ["cdylib"]
13
+ crate-type = ["cdylib", "rlib"]
14
14
  doctest = false
15
15
 
16
16
  [dependencies]
@@ -20,7 +20,7 @@ worker = { workspace = true }
20
20
  message-lib-common = { workspace = true }
21
21
  utils = { workspace = true }
22
22
  common-macros = { workspace = true }
23
- endpoint-v2 = { workspace = true }
23
+ endpoint-v2 = { workspace = true, features = ["library"] }
24
24
 
25
25
  [dev-dependencies]
26
26
  soroban-sdk = { workspace = true, features = ["testutils"] }
@@ -1,9 +1,8 @@
1
1
  use super::*;
2
-
3
2
  use soroban_sdk::{
4
3
  address_payload::AddressPayload,
5
4
  auth::{Context, CustomAccountInterface},
6
- contractimpl, contracttype,
5
+ contracttype,
7
6
  crypto::Hash,
8
7
  vec, Symbol,
9
8
  };
@@ -43,7 +42,7 @@ pub struct TransactionAuthData {
43
42
  // Custom Account Interface Implementation
44
43
  // ============================================================================
45
44
 
46
- #[contractimpl]
45
+ #[contract_impl]
47
46
  impl CustomAccountInterface for LzDVN {
48
47
  type Signature = TransactionAuthData;
49
48
  type Error = DvnError;
@@ -65,16 +64,14 @@ impl CustomAccountInterface for LzDVN {
65
64
  return Err(DvnError::AuthDataExpired);
66
65
  }
67
66
 
68
- // 2. Admin verification (skip for quorum_change_admin)
69
- if !Self::is_invoking_quorum_change_admin(&env, &auth_contexts) {
70
- let Sender::Admin(public_key, signature) = sender else {
71
- return Err(DvnError::OnlyAdmin);
72
- };
73
- Self::verify_admin_signature(&env, &public_key, &signature, &signature_payload)?;
67
+ // 2. Admin verification (quorum_change_admin bypasses this - allows quorum-only admin changes)
68
+ let requires_admin = !Self::is_invoking_quorum_change_admin(&env, &auth_contexts);
69
+ if requires_admin {
70
+ Self::verify_admin_signature(&env, &sender, &signature_payload)?;
74
71
  }
75
72
 
76
73
  // 3. Replay protection
77
- let calls = Self::extract_execution_calls(&env, &auth_contexts)?;
74
+ let calls = Self::collect_contract_calls(&env, &auth_contexts)?;
78
75
  let hash = Self::hash_call_data(&env, vid, expiration, &calls);
79
76
  if DvnStorage::used_hash(&env, &hash) {
80
77
  return Err(DvnError::HashAlreadyUsed);
@@ -93,21 +90,15 @@ impl CustomAccountInterface for LzDVN {
93
90
  // ============================================================================
94
91
 
95
92
  impl LzDVN {
96
- /// Verifies that the admin signature is valid and from a registered admin.
97
- ///
98
- /// # Arguments
99
- /// * `public_key` - The admin's Ed25519 public key (32 bytes)
100
- /// * `signature` - The admin's signature over the signature payload (64 bytes)
101
- /// * `signature_payload` - The payload that was signed
93
+ /// Verifies that the sender is an admin with a valid signature.
102
94
  ///
103
95
  /// # Errors
104
- /// Returns `DvnError::OnlyAdmin` if the signer is not a registered admin.
105
- fn verify_admin_signature(
106
- env: &Env,
107
- public_key: &BytesN<32>,
108
- signature: &BytesN<64>,
109
- signature_payload: &Hash<32>,
110
- ) -> Result<(), DvnError> {
96
+ /// - `DvnError::OnlyAdmin` if sender is not `Sender::Admin` or not a registered admin.
97
+ fn verify_admin_signature(env: &Env, sender: &Sender, signature_payload: &Hash<32>) -> Result<(), DvnError> {
98
+ let Sender::Admin(public_key, signature) = sender else {
99
+ return Err(DvnError::OnlyAdmin);
100
+ };
101
+
111
102
  let admin_address = Address::from_payload(env, AddressPayload::AccountIdPublicKeyEd25519(public_key.clone()));
112
103
  if !Self::is_admin(env, &admin_address) {
113
104
  return Err(DvnError::OnlyAdmin);
@@ -118,8 +109,8 @@ impl LzDVN {
118
109
  Ok(())
119
110
  }
120
111
 
121
- /// Extracts the execution calls from the auth contexts.
122
- fn extract_execution_calls(env: &Env, auth_contexts: &Vec<Context>) -> Result<Vec<Call>, DvnError> {
112
+ /// Collects contract calls from the auth contexts.
113
+ fn collect_contract_calls(env: &Env, auth_contexts: &Vec<Context>) -> Result<Vec<Call>, DvnError> {
123
114
  auth_contexts.iter().try_fold(vec![env], |mut calls, context| {
124
115
  let Context::Contract(ctx) = context else {
125
116
  return Err(DvnError::NonContractInvoke);
@@ -129,16 +120,14 @@ impl LzDVN {
129
120
  })
130
121
  }
131
122
 
132
- /// Checks if the auth context is for `quorum_change_admin` on this contract.
133
- /// This function doesn't require admin verification (quorum-only).
123
+ /// Checks if the first auth context is a call to `quorum_change_admin` on this contract.
124
+ ///
125
+ /// Used to allow quorum-only admin changes without requiring existing admin authorization.
134
126
  fn is_invoking_quorum_change_admin(env: &Env, auth_contexts: &Vec<Context>) -> bool {
135
- // Must be exactly one call (no bundling with other operations)
136
- if auth_contexts.len() != 1 {
137
- return false;
138
- }
139
- let Context::Contract(ctx) = auth_contexts.first().unwrap() else {
140
- return false;
141
- };
142
- ctx.contract == env.current_contract_address() && ctx.fn_name == Symbol::new(env, "quorum_change_admin")
127
+ auth_contexts.len() == 1
128
+ && auth_contexts.first().is_some_and(|ctx| {
129
+ let Context::Contract(c) = ctx else { return false };
130
+ c.contract == env.current_contract_address() && c.fn_name == Symbol::new(env, "quorum_change_admin")
131
+ })
143
132
  }
144
133
  }