@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.
- package/.turbo/turbo-build.log +484 -337
- package/.turbo/turbo-lint.log +126 -56
- package/.turbo/turbo-test.log +1403 -984
- package/Cargo.lock +142 -3
- package/Cargo.toml +5 -1
- package/contracts/ERROR_SPEC.md +44 -0
- package/contracts/common-macros/src/auth.rs +113 -0
- package/contracts/common-macros/src/contract_ttl.rs +84 -0
- package/contracts/common-macros/src/lib.rs +219 -29
- package/contracts/common-macros/src/lz_contract.rs +83 -0
- package/contracts/common-macros/src/storage.rs +1 -1
- package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
- package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
- package/contracts/common-macros/src/tests/mod.rs +3 -2
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
- 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
- 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
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -41
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
- package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
- package/contracts/common-macros/src/ttl_configurable.rs +21 -66
- package/contracts/common-macros/src/ttl_extendable.rs +36 -0
- package/contracts/common-macros/src/upgradeable.rs +76 -0
- package/contracts/common-macros/src/utils.rs +9 -0
- package/contracts/endpoint-v2/src/constants.rs +4 -4
- package/contracts/endpoint-v2/src/endpoint_v2.rs +58 -36
- package/contracts/endpoint-v2/src/errors.rs +4 -3
- package/contracts/endpoint-v2/src/events.rs +1 -1
- package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
- package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
- package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
- package/contracts/endpoint-v2/src/storage.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
- package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
- package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
- package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
- package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
- package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +62 -10
- package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
- package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
- package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
- package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +4 -6
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +16 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
- package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
- package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
- package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
- package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
- package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
- package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
- package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
- package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
- package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
- package/contracts/layerzero-views/Cargo.toml +35 -0
- package/contracts/layerzero-views/src/errors.rs +10 -0
- package/contracts/layerzero-views/src/layerzero_view.rs +226 -0
- package/contracts/layerzero-views/src/lib.rs +38 -0
- package/contracts/layerzero-views/src/storage.rs +18 -0
- package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
- package/contracts/layerzero-views/src/tests/mod.rs +4 -0
- package/contracts/layerzero-views/src/tests/setup.rs +377 -0
- package/contracts/layerzero-views/src/types.rs +50 -0
- package/contracts/macro-integration-tests/Cargo.toml +30 -0
- package/contracts/macro-integration-tests/src/lib.rs +1 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/only_auth_guard.rs +97 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +2 -0
- package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.rs +22 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +16 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +21 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +46 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
- package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
- package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
- package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +49 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +73 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
- package/contracts/message-libs/treasury/src/errors.rs +2 -3
- package/contracts/message-libs/treasury/src/events.rs +1 -1
- package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
- package/contracts/message-libs/treasury/src/lib.rs +3 -3
- package/contracts/message-libs/treasury/src/storage.rs +3 -1
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
- package/contracts/message-libs/treasury/src/treasury.rs +23 -26
- package/contracts/message-libs/uln-302/Cargo.toml +1 -1
- package/contracts/message-libs/uln-302/src/errors.rs +0 -5
- package/contracts/message-libs/uln-302/src/events.rs +5 -6
- package/contracts/message-libs/uln-302/src/receive_uln.rs +37 -56
- package/contracts/message-libs/uln-302/src/send_uln.rs +112 -138
- package/contracts/message-libs/uln-302/src/storage.rs +5 -5
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
- package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
- package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
- package/contracts/message-libs/uln-302/src/uln302.rs +10 -25
- package/contracts/oapps/counter/Cargo.toml +14 -1
- package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
- package/contracts/oapps/counter/integration_tests/setup_sml.rs +169 -0
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
- package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
- package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
- package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
- package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
- package/contracts/oapps/counter/src/counter.rs +67 -44
- package/contracts/oapps/counter/src/tests/mod.rs +0 -13
- package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
- package/contracts/oapps/oapp/src/errors.rs +5 -1
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +318 -221
- package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
- package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
- package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -9
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -18
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -8
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -16
- package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
- package/contracts/oapps/oapp-macros/src/lib.rs +211 -0
- package/contracts/oapps/oft/integration-tests/setup.rs +34 -9
- package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
- package/contracts/oapps/oft/src/errors.rs +6 -1
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -13
- package/contracts/oapps/oft/src/extensions/pausable.rs +5 -5
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +23 -23
- package/contracts/oapps/oft/src/lib.rs +4 -2
- package/contracts/oapps/oft/src/oft.rs +31 -71
- package/contracts/oapps/oft/src/oft_impl.rs +201 -0
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +2 -4
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +1 -4
- package/contracts/oapps/oft/src/storage.rs +2 -0
- package/contracts/oapps/oft/src/tests/extensions/setup.rs +60 -31
- package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +5 -3
- package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +5 -3
- package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +6 -4
- package/contracts/oapps/oft/src/tests/test_decimals.rs +2 -2
- package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +1 -2
- package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
- package/contracts/oapps/oft/src/tests/test_utils.rs +122 -81
- package/contracts/oapps/oft/src/types.rs +20 -0
- package/contracts/oapps/oft-std/Cargo.toml +6 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
- package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
- package/contracts/oapps/{counter/integration_tests → oft-std/integration-tests}/setup.rs +76 -30
- package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
- package/contracts/oapps/oft-std/src/lib.rs +12 -1
- package/contracts/oapps/oft-std/src/oft.rs +141 -26
- package/contracts/upgrader/Cargo.toml +19 -0
- package/contracts/upgrader/src/lib.rs +96 -0
- package/contracts/upgrader/src/tests/mod.rs +1 -0
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
- package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
- package/contracts/utils/src/auth.rs +44 -0
- package/contracts/utils/src/errors.rs +32 -5
- package/contracts/utils/src/lib.rs +5 -1
- package/contracts/utils/src/multisig.rs +211 -0
- package/contracts/utils/src/ownable.rs +50 -60
- package/contracts/utils/src/tests/buffer_reader.rs +6 -6
- package/contracts/utils/src/tests/buffer_writer.rs +6 -6
- package/contracts/utils/src/tests/bytes_ext.rs +2 -4
- package/contracts/utils/src/tests/mod.rs +4 -1
- package/contracts/utils/src/tests/multisig.rs +731 -0
- package/contracts/utils/src/tests/option_ext.rs +18 -0
- package/contracts/utils/src/tests/ownable.rs +22 -70
- package/contracts/utils/src/tests/ttl_configurable.rs +607 -0
- package/contracts/utils/src/tests/upgradeable.rs +290 -0
- package/contracts/utils/src/ttl_configurable.rs +153 -0
- package/contracts/utils/src/ttl_extendable.rs +27 -0
- package/contracts/utils/src/upgradeable.rs +56 -0
- package/contracts/workers/dvn/Cargo.toml +2 -2
- package/contracts/workers/dvn/src/auth.rs +24 -35
- package/contracts/workers/dvn/src/dvn.rs +23 -14
- package/contracts/workers/dvn/src/errors.rs +1 -7
- package/contracts/workers/dvn/src/events.rs +1 -14
- package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
- package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
- package/contracts/workers/dvn/src/storage.rs +3 -13
- package/contracts/workers/dvn/src/tests/auth.rs +4 -4
- package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
- package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
- package/contracts/workers/dvn/src/tests/setup.rs +5 -5
- package/contracts/workers/dvn-fee-lib/Cargo.toml +0 -1
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +45 -16
- package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
- package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
- package/contracts/workers/executor/src/auth.rs +80 -16
- package/contracts/workers/executor/src/executor.rs +17 -29
- package/contracts/workers/executor/src/storage.rs +2 -9
- package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
- package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +153 -121
- package/contracts/workers/executor-helper/Cargo.toml +1 -6
- package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
- package/contracts/workers/executor-helper/src/lib.rs +1 -7
- package/contracts/workers/price-feed/Cargo.toml +1 -2
- package/contracts/workers/price-feed/src/errors.rs +3 -2
- package/contracts/workers/price-feed/src/lib.rs +5 -6
- package/contracts/workers/price-feed/src/price_feed.rs +42 -23
- package/contracts/workers/worker/Cargo.toml +4 -0
- package/contracts/workers/worker/src/errors.rs +4 -0
- package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
- package/contracts/workers/worker/src/lib.rs +2 -2
- package/contracts/workers/worker/src/tests/mod.rs +4 -0
- package/contracts/workers/worker/src/tests/setup.rs +147 -0
- package/contracts/workers/worker/src/tests/worker.rs +502 -0
- package/contracts/workers/worker/src/worker.rs +28 -30
- package/package.json +8 -5
- package/sdk/.turbo/turbo-build.log +1 -0
- package/sdk/.turbo/turbo-test.log +1009 -0
- package/sdk/dist/generated/bml.d.ts +104 -37
- package/sdk/dist/generated/bml.js +83 -42
- package/sdk/dist/generated/counter.d.ts +334 -175
- package/sdk/dist/generated/counter.js +109 -63
- package/sdk/dist/generated/dvn.d.ts +1985 -0
- package/sdk/dist/generated/dvn.js +326 -0
- package/sdk/dist/generated/dvn_fee_lib.d.ts +690 -0
- package/sdk/dist/generated/dvn_fee_lib.js +163 -0
- package/sdk/dist/generated/endpoint.d.ts +155 -46
- package/sdk/dist/generated/endpoint.js +93 -50
- package/sdk/dist/generated/executor.d.ts +1841 -0
- package/sdk/dist/generated/executor.js +312 -0
- package/sdk/dist/generated/executor_fee_lib.d.ts +1083 -0
- package/sdk/dist/generated/executor_fee_lib.js +255 -0
- package/sdk/dist/generated/executor_helper.d.ts +981 -0
- package/sdk/dist/generated/executor_helper.js +236 -0
- package/sdk/dist/generated/oft_std.d.ts +1722 -0
- package/sdk/dist/generated/oft_std.js +316 -0
- package/sdk/dist/generated/price_feed.d.ts +1077 -0
- package/sdk/dist/generated/price_feed.js +210 -0
- package/sdk/dist/generated/sml.d.ts +171 -56
- package/sdk/dist/generated/sml.js +111 -62
- package/sdk/dist/generated/treasury.d.ts +896 -0
- package/sdk/dist/generated/treasury.js +219 -0
- package/sdk/dist/generated/uln302.d.ts +175 -75
- package/sdk/dist/generated/uln302.js +126 -82
- package/sdk/dist/generated/upgrader.d.ts +70 -0
- package/sdk/dist/generated/upgrader.js +19 -0
- package/sdk/dist/index.d.ts +10 -0
- package/sdk/dist/index.js +14 -0
- package/sdk/dist/wasm/blocked-message-lib.d.ts +1 -0
- package/sdk/dist/wasm/blocked-message-lib.js +2 -0
- package/sdk/dist/wasm/counter.d.ts +1 -0
- package/sdk/dist/wasm/counter.js +2 -0
- package/sdk/dist/wasm/dvn-fee-lib.d.ts +1 -0
- package/sdk/dist/wasm/dvn-fee-lib.js +2 -0
- package/sdk/dist/wasm/dvn.d.ts +1 -0
- package/sdk/dist/wasm/dvn.js +2 -0
- package/sdk/dist/wasm/endpoint-v2.d.ts +1 -0
- package/sdk/dist/wasm/endpoint-v2.js +2 -0
- package/sdk/dist/wasm/executor-fee-lib.d.ts +1 -0
- package/sdk/dist/wasm/executor-fee-lib.js +2 -0
- package/sdk/dist/wasm/executor-helper.d.ts +1 -0
- package/sdk/dist/wasm/executor-helper.js +2 -0
- package/sdk/dist/wasm/executor.d.ts +1 -0
- package/sdk/dist/wasm/executor.js +2 -0
- package/sdk/dist/wasm/layerzero-views.d.ts +1 -0
- package/sdk/dist/wasm/layerzero-views.js +2 -0
- package/sdk/dist/wasm/oft-std.d.ts +1 -0
- package/sdk/dist/wasm/oft-std.js +2 -0
- package/sdk/dist/wasm/price-feed.d.ts +1 -0
- package/sdk/dist/wasm/price-feed.js +2 -0
- package/sdk/dist/wasm/simple-message-lib.d.ts +1 -0
- package/sdk/dist/wasm/simple-message-lib.js +2 -0
- package/sdk/dist/wasm/treasury.d.ts +1 -0
- package/sdk/dist/wasm/treasury.js +2 -0
- package/sdk/dist/wasm/uln302.d.ts +1 -0
- package/sdk/dist/wasm/uln302.js +2 -0
- package/sdk/dist/wasm/upgrader.d.ts +1 -0
- package/sdk/dist/wasm/upgrader.js +2 -0
- package/sdk/dist/wasm.d.ts +15 -0
- package/sdk/dist/wasm.js +15 -0
- package/sdk/package.json +7 -4
- package/sdk/src/index.ts +17 -0
- package/sdk/test/counter-sml.test.ts +376 -0
- package/sdk/test/counter-uln.test.ts +493 -0
- package/sdk/test/{oft.test.ts → oft-sml.test.ts} +187 -323
- package/sdk/test/suites/constants.ts +22 -2
- package/sdk/test/suites/dummyContractClient.ts +169 -0
- package/sdk/test/suites/globalSetup.ts +450 -0
- package/sdk/test/suites/localnet.ts +23 -6
- package/sdk/test/upgrader.test.ts +300 -0
- package/sdk/test/utils.ts +558 -85
- package/sdk/vitest.config.ts +21 -0
- package/tools/ts-bindings-gen/src/main.rs +12 -1
- package/turbo.json +2 -0
- package/contracts/common-macros/src/contract_impl.rs +0 -47
- package/contracts/common-macros/src/ownable.rs +0 -59
- package/contracts/common-macros/src/tests/contract_impl.rs +0 -381
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -32
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
- package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
- package/contracts/oapp-macros/src/lib.rs +0 -154
- package/contracts/oapp-macros/src/oapp_core.rs +0 -40
- package/contracts/oapp-macros/src/oapp_full.rs +0 -21
- package/contracts/oapp-macros/src/oapp_options_type3.rs +0 -31
- package/contracts/oapp-macros/src/oapp_receiver.rs +0 -48
- package/contracts/oapp-macros/src/oapp_sender.rs +0 -21
- package/contracts/oapp-macros/src/util.rs +0 -107
- package/contracts/oapps/oft/src/constants.rs +0 -5
- package/contracts/oapps/oft/src/default_oft_impl.rs +0 -146
- package/contracts/utils/src/tests/ttl.rs +0 -421
- package/contracts/utils/src/ttl.rs +0 -123
- package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
- package/contracts/workers/dvn/src/multisig.rs +0 -153
- package/sdk/test/index.test.ts +0 -376
- /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
|
@@ -3,24 +3,34 @@
|
|
|
3
3
|
//! This crate provides foundational macros for Stellar contract development:
|
|
4
4
|
//! - **Storage macros** - Strongly-typed contract storage API generation
|
|
5
5
|
//! - **Error macros** - Contract error enum generation
|
|
6
|
-
//! - **
|
|
6
|
+
//! - **Auth macros** - Authorization-based access control (ownable, multisig, only_auth)
|
|
7
7
|
//! - **TTL macros** - Time-to-live configuration and automatic extension
|
|
8
|
+
//! - **Wrapper macros** - Convenient macro combinations for common patterns
|
|
8
9
|
//!
|
|
9
10
|
//! # Quick Links
|
|
10
11
|
//! - [`storage`] - Storage enum to API macro
|
|
11
12
|
//! - [`contract_error`] - Error enum generation macro
|
|
12
13
|
//! - [`ownable`] - Ownable trait implementation macro
|
|
13
|
-
//! - [`
|
|
14
|
+
//! - [`multisig`] - Multisig trait implementation macro
|
|
15
|
+
//! - [`only_auth`] - Auth-based access control attribute macro
|
|
14
16
|
//! - [`ttl_configurable`] - TTL configuration with freeze support
|
|
17
|
+
//! - [`ttl_extendable`] - Manual instance TTL extension
|
|
15
18
|
//! - [`contract_impl`] - Contract impl with automatic instance TTL extension
|
|
19
|
+
//! - [`contract_trait`] - Contract trait with automatic instance TTL extension
|
|
20
|
+
//! - [`upgradeable`] - Upgradeable trait implementation macro
|
|
21
|
+
//! - [`lz_contract`] - Wrapper macro combining common LayerZero contract attributes
|
|
16
22
|
//!
|
|
23
|
+
|
|
17
24
|
use proc_macro::TokenStream;
|
|
18
25
|
|
|
19
|
-
mod
|
|
26
|
+
mod auth;
|
|
27
|
+
mod contract_ttl;
|
|
20
28
|
mod error;
|
|
21
|
-
mod
|
|
29
|
+
mod lz_contract;
|
|
22
30
|
mod storage;
|
|
23
31
|
mod ttl_configurable;
|
|
32
|
+
mod ttl_extendable;
|
|
33
|
+
mod upgradeable;
|
|
24
34
|
mod utils;
|
|
25
35
|
|
|
26
36
|
#[cfg(test)]
|
|
@@ -139,60 +149,91 @@ pub fn contract_error(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
139
149
|
/// - `Ownable` trait impl - `owner(env)`, `transfer_ownership(env, new_owner)`, `renounce_ownership(env)`
|
|
140
150
|
#[proc_macro_attribute]
|
|
141
151
|
pub fn ownable(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
142
|
-
|
|
152
|
+
auth::generate_ownable_impl(item.into()).into()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// ============================================================================
|
|
156
|
+
// Multisig Macro
|
|
157
|
+
// ============================================================================
|
|
158
|
+
|
|
159
|
+
/// Generates multisig implementation with self-owning access control.
|
|
160
|
+
///
|
|
161
|
+
/// Implements the `Multisig` trait and the `Auth` trait with self-owning pattern,
|
|
162
|
+
/// where the contract's own address is the authorizer. This allows multisig
|
|
163
|
+
/// quorum approval to serve as the authorizer for owner-protected operations
|
|
164
|
+
/// like TTL configuration and upgrades.
|
|
165
|
+
///
|
|
166
|
+
/// # Example
|
|
167
|
+
/// ```ignore
|
|
168
|
+
/// #[multisig]
|
|
169
|
+
/// pub struct MyContract;
|
|
170
|
+
/// ```
|
|
171
|
+
///
|
|
172
|
+
/// Generated code includes:
|
|
173
|
+
/// - `Auth` trait impl - `authorizer(env)` returns `env.current_contract_address()`
|
|
174
|
+
/// - `Multisig` trait impl - `set_signer(...)`, `set_threshold(...)`, `verify_signatures(...)`
|
|
175
|
+
#[proc_macro_attribute]
|
|
176
|
+
pub fn multisig(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
177
|
+
auth::generate_multisig_impl(item.into()).into()
|
|
143
178
|
}
|
|
144
179
|
|
|
145
180
|
// ============================================================================
|
|
146
|
-
// Only
|
|
181
|
+
// Only Auth Macro
|
|
147
182
|
// ============================================================================
|
|
148
183
|
|
|
149
|
-
/// Restricts function access to the contract
|
|
184
|
+
/// Restricts function access to the contract authorizer only.
|
|
150
185
|
///
|
|
151
|
-
/// This attribute macro injects an
|
|
152
|
-
///
|
|
186
|
+
/// This attribute macro injects an auth check at the beginning of the function
|
|
187
|
+
/// using the `Auth` trait. The function will panic if called without authorization.
|
|
188
|
+
///
|
|
189
|
+
/// Works with any contract that implements `Auth`, including both `Ownable` and
|
|
190
|
+
/// `Multisig` contracts.
|
|
153
191
|
///
|
|
154
192
|
/// # Requirements
|
|
155
193
|
/// - The function must have an `Env` parameter (by value or reference)
|
|
156
|
-
/// - The containing contract must implement the `
|
|
194
|
+
/// - The containing contract must implement the `Auth` trait
|
|
157
195
|
///
|
|
158
196
|
/// # Example
|
|
159
197
|
/// ```ignore
|
|
160
|
-
/// #[ownable]
|
|
198
|
+
/// #[ownable] // or implement Multisig
|
|
161
199
|
/// pub struct MyContract;
|
|
162
200
|
///
|
|
163
201
|
/// #[soroban_sdk::contractimpl]
|
|
164
202
|
/// impl MyContract {
|
|
165
|
-
/// #[
|
|
166
|
-
/// pub fn
|
|
167
|
-
/// // Only the
|
|
203
|
+
/// #[only_auth]
|
|
204
|
+
/// pub fn protected_action(env: Env) {
|
|
205
|
+
/// // Only the authorizer can execute this
|
|
168
206
|
/// }
|
|
169
207
|
/// }
|
|
170
208
|
/// ```
|
|
171
209
|
///
|
|
172
210
|
/// Generated code (conceptual):
|
|
173
211
|
/// ```ignore
|
|
174
|
-
/// pub fn
|
|
175
|
-
/// utils::
|
|
212
|
+
/// pub fn protected_action(env: Env) {
|
|
213
|
+
/// utils::auth::require_auth::<Self>(&env);
|
|
176
214
|
/// // Original function body
|
|
177
215
|
/// }
|
|
178
216
|
/// ```
|
|
179
217
|
#[proc_macro_attribute]
|
|
180
|
-
pub fn
|
|
181
|
-
|
|
218
|
+
pub fn only_auth(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
219
|
+
auth::prepend_only_auth_check(item.into()).into()
|
|
182
220
|
}
|
|
183
221
|
|
|
184
222
|
// ============================================================================
|
|
185
223
|
// TTL Configuration Macro
|
|
186
224
|
// ============================================================================
|
|
187
225
|
|
|
188
|
-
/// Generates TtlConfigurable trait implementation
|
|
226
|
+
/// Generates TtlConfigurable trait implementation.
|
|
189
227
|
///
|
|
190
|
-
/// This macro
|
|
191
|
-
///
|
|
192
|
-
///
|
|
228
|
+
/// This macro implements the `TtlConfigurable` trait for a contract struct,
|
|
229
|
+
/// providing TTL configuration management with auth-based access control.
|
|
230
|
+
///
|
|
231
|
+
/// # Requirements
|
|
232
|
+
/// The contract must implement the `Auth` trait (typically via `#[ownable]` or `Multisig`).
|
|
193
233
|
///
|
|
194
234
|
/// # Example
|
|
195
235
|
/// ```ignore
|
|
236
|
+
/// #[ownable] // or implement Multisig for self-owning contracts
|
|
196
237
|
/// #[ttl_configurable]
|
|
197
238
|
/// pub struct MyContract;
|
|
198
239
|
///
|
|
@@ -205,18 +246,39 @@ pub fn only_owner(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
205
246
|
/// ```
|
|
206
247
|
///
|
|
207
248
|
/// Generated code includes:
|
|
208
|
-
/// -
|
|
209
|
-
/// - `set_ttl_configs(env, instance, persistent)` - Set TTL configs (owner only)
|
|
249
|
+
/// - `set_ttl_configs(env, instance, persistent)` - Set TTL configs (auth required)
|
|
210
250
|
/// - `ttl_configs(env)` - Get current TTL configs (instance, persistent)
|
|
211
|
-
/// - `freeze_ttl_configs(env)` - Permanently freeze TTL configs (
|
|
251
|
+
/// - `freeze_ttl_configs(env)` - Permanently freeze TTL configs (auth required)
|
|
212
252
|
/// - `is_ttl_configs_frozen(env)` - Check if TTL configs are frozen
|
|
213
|
-
///
|
|
214
|
-
/// See [`ownable`] for the owner management methods also generated.
|
|
215
253
|
#[proc_macro_attribute]
|
|
216
254
|
pub fn ttl_configurable(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
217
255
|
ttl_configurable::generate_ttl_configurable_impl(item.into()).into()
|
|
218
256
|
}
|
|
219
257
|
|
|
258
|
+
// ============================================================================
|
|
259
|
+
// TTL Extendable Macro
|
|
260
|
+
// ============================================================================
|
|
261
|
+
|
|
262
|
+
/// Generates TtlExtendable trait implementation for manual instance TTL extension.
|
|
263
|
+
///
|
|
264
|
+
/// This macro implements the `TtlExtendable` trait, providing a public
|
|
265
|
+
/// `extend_instance_ttl` function that allows external callers to extend
|
|
266
|
+
/// the contract's instance storage TTL.
|
|
267
|
+
///
|
|
268
|
+
/// # Example
|
|
269
|
+
/// ```ignore
|
|
270
|
+
/// #[contract]
|
|
271
|
+
/// #[ttl_extendable]
|
|
272
|
+
/// pub struct MyContract;
|
|
273
|
+
/// ```
|
|
274
|
+
///
|
|
275
|
+
/// Generated code includes:
|
|
276
|
+
/// - `extend_instance_ttl(env, threshold, extend_to)` - Extends instance TTL
|
|
277
|
+
#[proc_macro_attribute]
|
|
278
|
+
pub fn ttl_extendable(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
279
|
+
ttl_extendable::generate_ttl_extendable_impl(item.into()).into()
|
|
280
|
+
}
|
|
281
|
+
|
|
220
282
|
// ============================================================================
|
|
221
283
|
// Contract Impl Macro
|
|
222
284
|
// ============================================================================
|
|
@@ -255,7 +317,7 @@ pub fn ttl_configurable(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
255
317
|
/// #[soroban_sdk::contractimpl]
|
|
256
318
|
/// impl MyContract {
|
|
257
319
|
/// pub fn my_method(env: &Env) {
|
|
258
|
-
/// if let Some(ttl) = <Self as ::utils::
|
|
320
|
+
/// if let Some(ttl) = <Self as ::utils::ttl_configurable::TtlConfigurable>::ttl_config(env).0 {
|
|
259
321
|
/// env.storage().instance().extend_ttl(ttl.threshold, ttl.extend_to);
|
|
260
322
|
/// }
|
|
261
323
|
/// // ... your code
|
|
@@ -264,5 +326,133 @@ pub fn ttl_configurable(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
264
326
|
/// ```
|
|
265
327
|
#[proc_macro_attribute]
|
|
266
328
|
pub fn contract_impl(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
267
|
-
|
|
329
|
+
contract_ttl::contractimpl_with_ttl(attr.into(), item.into()).into()
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// ============================================================================
|
|
333
|
+
// Contract Trait Macro
|
|
334
|
+
// ============================================================================
|
|
335
|
+
|
|
336
|
+
/// Wraps `#[soroban_sdk::contracttrait]` with automatic instance TTL extension.
|
|
337
|
+
///
|
|
338
|
+
/// This macro applies `#[soroban_sdk::contracttrait]` and injects TTL extension logic
|
|
339
|
+
/// at the beginning of each default trait method to keep the contract instance alive.
|
|
340
|
+
///
|
|
341
|
+
/// # Requirements
|
|
342
|
+
/// - The implementing contract must have `#[ttl_configurable]` applied
|
|
343
|
+
/// - Methods must have an `Env` parameter to receive TTL extension
|
|
344
|
+
/// - Only methods with default implementations are processed
|
|
345
|
+
///
|
|
346
|
+
/// # Behavior
|
|
347
|
+
/// - All default methods with an `Env` parameter receive TTL extension
|
|
348
|
+
/// - Methods without a body (abstract methods) are not modified
|
|
349
|
+
/// - Methods without an `Env` parameter are skipped
|
|
350
|
+
///
|
|
351
|
+
/// # Example
|
|
352
|
+
/// ```ignore
|
|
353
|
+
/// #[contract_trait]
|
|
354
|
+
/// pub trait MyTrait {
|
|
355
|
+
/// /// This method will have TTL extension injected
|
|
356
|
+
/// fn my_method(env: &Env) {
|
|
357
|
+
/// // TTL extension is automatically injected here
|
|
358
|
+
/// // ... your code
|
|
359
|
+
/// }
|
|
360
|
+
///
|
|
361
|
+
/// /// Abstract methods are not modified
|
|
362
|
+
/// fn abstract_method(env: &Env) -> u32;
|
|
363
|
+
/// }
|
|
364
|
+
/// ```
|
|
365
|
+
///
|
|
366
|
+
/// Generated code (conceptual):
|
|
367
|
+
/// ```ignore
|
|
368
|
+
/// #[soroban_sdk::contracttrait]
|
|
369
|
+
/// pub trait MyTrait {
|
|
370
|
+
/// fn my_method(env: &Env) {
|
|
371
|
+
/// if let Some(ttl) = utils::ttl_configurable::TtlConfigStorage::instance(env) {
|
|
372
|
+
/// env.storage().instance().extend_ttl(ttl.threshold, ttl.extend_to);
|
|
373
|
+
/// }
|
|
374
|
+
/// // ... your code
|
|
375
|
+
/// }
|
|
376
|
+
///
|
|
377
|
+
/// fn abstract_method(env: &Env) -> u32;
|
|
378
|
+
/// }
|
|
379
|
+
/// ```
|
|
380
|
+
#[proc_macro_attribute]
|
|
381
|
+
pub fn contract_trait(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
382
|
+
contract_ttl::contracttrait_with_ttl(attr.into(), item.into()).into()
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// ============================================================================
|
|
386
|
+
// Upgradeable Macro
|
|
387
|
+
// ============================================================================
|
|
388
|
+
|
|
389
|
+
/// Generates upgradeable implementation with auth-based access control.
|
|
390
|
+
///
|
|
391
|
+
/// Implements the `Upgradeable` trait for contract upgrade and migration functionality.
|
|
392
|
+
///
|
|
393
|
+
/// # Requirements
|
|
394
|
+
/// - The contract must implement the `Auth` trait (via `#[ownable]` or `Multisig`)
|
|
395
|
+
/// - The contract must implement `UpgradeableInternal` trait with migration logic
|
|
396
|
+
///
|
|
397
|
+
/// # Example
|
|
398
|
+
/// ```ignore
|
|
399
|
+
/// #[ownable] // or implement Multisig for self-owning contracts
|
|
400
|
+
/// #[upgradeable]
|
|
401
|
+
/// pub struct MyContract;
|
|
402
|
+
///
|
|
403
|
+
/// impl utils::upgradeable::UpgradeableInternal for MyContract {
|
|
404
|
+
/// type MigrationData = ();
|
|
405
|
+
///
|
|
406
|
+
/// fn _migrate(env: &Env, migration_data: &Self::MigrationData) {
|
|
407
|
+
/// // Migration logic here
|
|
408
|
+
/// }
|
|
409
|
+
/// }
|
|
410
|
+
/// ```
|
|
411
|
+
///
|
|
412
|
+
/// Generated code includes:
|
|
413
|
+
/// - `upgrade(env, new_wasm_hash)` - Upgrades the contract WASM (auth required)
|
|
414
|
+
/// - `migrate(env, migration_data)` - Runs migration after upgrade (auth required)
|
|
415
|
+
/// - `contractmeta!` with `binver` set to the Cargo package version (if not 0.0.0)
|
|
416
|
+
#[proc_macro_attribute]
|
|
417
|
+
pub fn upgradeable(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
418
|
+
upgradeable::generate_upgradeable_impl(item.into()).into()
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// ============================================================================
|
|
422
|
+
// LZ Contract Wrapper Macro
|
|
423
|
+
// ============================================================================
|
|
424
|
+
|
|
425
|
+
/// Wrapper macro that combines common LayerZero contract attributes.
|
|
426
|
+
///
|
|
427
|
+
/// This macro simplifies contract declarations by combining multiple commonly
|
|
428
|
+
/// used macros into a single attribute.
|
|
429
|
+
///
|
|
430
|
+
/// # Default (no options)
|
|
431
|
+
/// `#[lz_contract]` generates:
|
|
432
|
+
/// - `#[contract]` - Soroban contract
|
|
433
|
+
/// - `#[ttl_configurable]` - TTL configuration with auth
|
|
434
|
+
/// - `#[ttl_extendable]` - Manual TTL extension
|
|
435
|
+
/// - `#[ownable]` - Single-owner access control
|
|
436
|
+
///
|
|
437
|
+
/// # Options
|
|
438
|
+
/// - `upgradeable` - Adds `#[upgradeable]` for contract upgrade support
|
|
439
|
+
/// - `multisig` - Uses `#[multisig]` instead of `#[ownable]`
|
|
440
|
+
///
|
|
441
|
+
/// # Examples
|
|
442
|
+
/// ```ignore
|
|
443
|
+
/// // Basic contract with ownable auth
|
|
444
|
+
/// #[lz_contract]
|
|
445
|
+
/// pub struct EndpointV2;
|
|
446
|
+
///
|
|
447
|
+
/// // Contract with upgrade support
|
|
448
|
+
/// #[lz_contract(upgradeable)]
|
|
449
|
+
/// pub struct DVNFeeLib;
|
|
450
|
+
///
|
|
451
|
+
/// // Contract with multisig auth and upgrade support
|
|
452
|
+
/// #[lz_contract(multisig, upgradeable)]
|
|
453
|
+
/// pub struct DVN;
|
|
454
|
+
/// ```
|
|
455
|
+
#[proc_macro_attribute]
|
|
456
|
+
pub fn lz_contract(attr: TokenStream, item: TokenStream) -> TokenStream {
|
|
457
|
+
lz_contract::generate_lz_contract(attr.into(), item.into()).into()
|
|
268
458
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
//! LzContract wrapper macro for Stellar smart contracts.
|
|
2
|
+
//!
|
|
3
|
+
//! This module provides the `#[lz_contract]` macro which combines commonly used
|
|
4
|
+
//! LayerZero contract attributes into a single macro invocation.
|
|
5
|
+
|
|
6
|
+
use proc_macro2::TokenStream;
|
|
7
|
+
use quote::quote;
|
|
8
|
+
use syn::{
|
|
9
|
+
parse::{Parse, ParseStream},
|
|
10
|
+
punctuated::Punctuated,
|
|
11
|
+
Error, Ident, ItemStruct, Token,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/// Configuration options for the `#[lz_contract]` macro.
|
|
15
|
+
#[derive(Debug, Default)]
|
|
16
|
+
pub struct LzContractConfig {
|
|
17
|
+
/// If true, adds `#[upgradeable]` for contract upgrade support.
|
|
18
|
+
pub upgradeable: bool,
|
|
19
|
+
/// If true, uses `#[multisig]` instead of `#[ownable]` for auth.
|
|
20
|
+
pub multisig: bool,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
impl Parse for LzContractConfig {
|
|
24
|
+
fn parse(input: ParseStream) -> syn::Result<Self> {
|
|
25
|
+
if input.is_empty() {
|
|
26
|
+
return Ok(Self::default());
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let idents = Punctuated::<Ident, Token![,]>::parse_terminated(input)?;
|
|
30
|
+
let mut config = Self::default();
|
|
31
|
+
|
|
32
|
+
for ident in idents {
|
|
33
|
+
match ident.to_string().as_str() {
|
|
34
|
+
"upgradeable" => config.upgradeable = true,
|
|
35
|
+
"multisig" => config.multisig = true,
|
|
36
|
+
_ => {
|
|
37
|
+
return Err(Error::new(ident.span(), "expected one of `upgradeable`, `multisig`"));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Ok(config)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// Generates a complete LayerZero contract with common macro attributes.
|
|
47
|
+
///
|
|
48
|
+
/// # Default (no options)
|
|
49
|
+
/// Generates:
|
|
50
|
+
/// - `#[soroban_sdk::contract]` - Soroban contract
|
|
51
|
+
/// - `#[common_macros::ttl_configurable]` - TTL configuration with auth
|
|
52
|
+
/// - `#[common_macros::ttl_extendable]` - Manual TTL extension
|
|
53
|
+
/// - `#[common_macros::ownable]` - Single-owner access control
|
|
54
|
+
///
|
|
55
|
+
/// # Options
|
|
56
|
+
/// - `upgradeable` - Adds `#[common_macros::upgradeable]` for contract upgrade support
|
|
57
|
+
/// - `multisig` - Uses `#[common_macros::multisig]` instead of `#[common_macros::ownable]`
|
|
58
|
+
pub fn generate_lz_contract(attr: TokenStream, input: TokenStream) -> TokenStream {
|
|
59
|
+
let config: LzContractConfig =
|
|
60
|
+
syn::parse2(attr).unwrap_or_else(|e| panic!("failed to parse lz_contract config: {}", e));
|
|
61
|
+
let item: ItemStruct = syn::parse2(input).unwrap_or_else(|e| panic!("failed to parse struct: {}", e));
|
|
62
|
+
|
|
63
|
+
let auth = if config.multisig {
|
|
64
|
+
quote! { #[common_macros::multisig] }
|
|
65
|
+
} else {
|
|
66
|
+
quote! { #[common_macros::ownable] }
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
let upgrade = if config.upgradeable {
|
|
70
|
+
quote! { #[common_macros::upgradeable] }
|
|
71
|
+
} else {
|
|
72
|
+
quote! {}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
quote! {
|
|
76
|
+
#[soroban_sdk::contract]
|
|
77
|
+
#[common_macros::ttl_configurable]
|
|
78
|
+
#[common_macros::ttl_extendable]
|
|
79
|
+
#auth
|
|
80
|
+
#upgrade
|
|
81
|
+
#item
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -306,7 +306,7 @@ fn gen_ttl_extension(storage_type: &StorageType, use_stored_config: bool) -> Tok
|
|
|
306
306
|
if use_stored_config {
|
|
307
307
|
let method = format_ident!("{}", storage_type.accessor_name());
|
|
308
308
|
quote! {
|
|
309
|
-
if let Some(utils::
|
|
309
|
+
if let Some(utils::ttl_configurable::TtlConfig { threshold, extend_to }) = utils::ttl_configurable::TtlConfigStorage::#method(env) {
|
|
310
310
|
#extend_call
|
|
311
311
|
}
|
|
312
312
|
}
|
|
@@ -2,6 +2,7 @@ use proc_macro2::TokenStream;
|
|
|
2
2
|
use quote::quote;
|
|
3
3
|
|
|
4
4
|
use crate::tests::test_helpers::{assert_panics_contains, non_struct_item_inputs};
|
|
5
|
+
|
|
5
6
|
// ============================================
|
|
6
7
|
// Snapshot Test: Ownable Code Generation
|
|
7
8
|
// ============================================
|
|
@@ -11,21 +12,40 @@ fn snapshot_generated_ownable_code() {
|
|
|
11
12
|
let input = quote! {
|
|
12
13
|
pub struct MyContract;
|
|
13
14
|
};
|
|
14
|
-
let result = crate::
|
|
15
|
+
let result = crate::auth::generate_ownable_impl(input);
|
|
16
|
+
let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
|
|
17
|
+
|
|
18
|
+
insta::assert_snapshot!(formatted);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// ============================================
|
|
22
|
+
// Snapshot Test: Multisig Code Generation
|
|
23
|
+
// ============================================
|
|
24
|
+
|
|
25
|
+
#[test]
|
|
26
|
+
fn snapshot_generated_multisig_code() {
|
|
27
|
+
let input = quote! {
|
|
28
|
+
pub struct MyContract;
|
|
29
|
+
};
|
|
30
|
+
let result = crate::auth::generate_multisig_impl(input);
|
|
15
31
|
let formatted = prettyplease::unparse(&syn::parse2::<syn::File>(result).expect("failed to parse generated code"));
|
|
16
32
|
|
|
17
33
|
insta::assert_snapshot!(formatted);
|
|
18
34
|
}
|
|
19
35
|
|
|
36
|
+
// ============================================
|
|
37
|
+
// Snapshot Test: Only Auth Macro
|
|
38
|
+
// ============================================
|
|
39
|
+
|
|
20
40
|
#[test]
|
|
21
|
-
fn
|
|
41
|
+
fn snapshot_only_auth_preserves_function_signature() {
|
|
22
42
|
// Test with borrowed Env (&Env) - should use env directly
|
|
23
43
|
let input_borrowed = quote! {
|
|
24
44
|
pub(crate) async fn admin_action<T: Clone>(env: &Env, value: T) -> Result<T, Error> {
|
|
25
45
|
Ok(value.clone())
|
|
26
46
|
}
|
|
27
47
|
};
|
|
28
|
-
let result_borrowed = crate::
|
|
48
|
+
let result_borrowed = crate::auth::prepend_only_auth_check(input_borrowed);
|
|
29
49
|
let formatted_borrowed =
|
|
30
50
|
prettyplease::unparse(&syn::parse2::<syn::File>(result_borrowed).expect("failed to parse generated code"));
|
|
31
51
|
|
|
@@ -35,7 +55,7 @@ fn snapshot_only_owner_preserves_function_signature() {
|
|
|
35
55
|
Ok(value.clone())
|
|
36
56
|
}
|
|
37
57
|
};
|
|
38
|
-
let result_owned = crate::
|
|
58
|
+
let result_owned = crate::auth::prepend_only_auth_check(input_owned);
|
|
39
59
|
let formatted_owned =
|
|
40
60
|
prettyplease::unparse(&syn::parse2::<syn::File>(result_owned).expect("failed to parse generated code"));
|
|
41
61
|
|
|
@@ -49,30 +69,30 @@ fn snapshot_only_owner_preserves_function_signature() {
|
|
|
49
69
|
}
|
|
50
70
|
|
|
51
71
|
// ============================================
|
|
52
|
-
//
|
|
72
|
+
// prepend_only_auth_check Tests
|
|
53
73
|
// ============================================
|
|
54
74
|
|
|
55
|
-
/// Helper function to verify that the
|
|
56
|
-
fn
|
|
57
|
-
let result_tokens = crate::
|
|
75
|
+
/// Helper function to verify that the auth check is correctly inserted at the beginning of a function.
|
|
76
|
+
fn assert_auth_check_inserted(input: TokenStream, expected_env_ref: &str, test_name: &str) {
|
|
77
|
+
let result_tokens = crate::auth::prepend_only_auth_check(input);
|
|
58
78
|
let output_fn: syn::ItemFn =
|
|
59
79
|
syn::parse2(result_tokens).unwrap_or_else(|e| panic!("{}: failed to parse output function: {}", test_name, e));
|
|
60
80
|
|
|
61
81
|
assert!(!output_fn.block.stmts.is_empty(), "{}: function body should contain at least one statement", test_name);
|
|
62
82
|
|
|
63
83
|
let first_stmt = &output_fn.block.stmts[0];
|
|
64
|
-
let expected_stmt = format!("utils::
|
|
84
|
+
let expected_stmt = format!("utils::auth::require_auth::<Self>({});", expected_env_ref);
|
|
65
85
|
let actual_stmt = quote::quote!(#first_stmt).to_string().replace(" ", "");
|
|
66
86
|
|
|
67
87
|
assert_eq!(
|
|
68
88
|
actual_stmt, expected_stmt,
|
|
69
|
-
"{}: expected
|
|
89
|
+
"{}: expected auth check statement '{}', but got '{}'",
|
|
70
90
|
test_name, expected_stmt, actual_stmt
|
|
71
91
|
);
|
|
72
92
|
}
|
|
73
93
|
|
|
74
94
|
#[test]
|
|
75
|
-
fn
|
|
95
|
+
fn test_only_auth_inserts_correct_code_at_the_beginning() {
|
|
76
96
|
// (description, input, expected_env_ref)
|
|
77
97
|
// Owned Env should produce &env, reference Env should produce env directly
|
|
78
98
|
let test_cases = vec![
|
|
@@ -88,12 +108,12 @@ fn test_only_owner_inserts_correct_code_at_the_beginning() {
|
|
|
88
108
|
];
|
|
89
109
|
|
|
90
110
|
for (description, input, expected_env_ref) in test_cases {
|
|
91
|
-
|
|
111
|
+
assert_auth_check_inserted(input, expected_env_ref, description);
|
|
92
112
|
}
|
|
93
113
|
}
|
|
94
114
|
|
|
95
115
|
#[test]
|
|
96
|
-
fn
|
|
116
|
+
fn test_only_auth_requires_env_param() {
|
|
97
117
|
// ============================================
|
|
98
118
|
// Error Cases: Missing/Invalid Env Argument Patterns
|
|
99
119
|
// ============================================
|
|
@@ -109,7 +129,7 @@ fn test_only_owner_requires_env_param() {
|
|
|
109
129
|
|
|
110
130
|
for (case, input) in cases {
|
|
111
131
|
assert_panics_contains(case, "function must have an Env argument", || {
|
|
112
|
-
crate::
|
|
132
|
+
crate::auth::prepend_only_auth_check(input.clone());
|
|
113
133
|
});
|
|
114
134
|
}
|
|
115
135
|
}
|
|
@@ -122,7 +142,20 @@ fn test_only_owner_requires_env_param() {
|
|
|
122
142
|
fn test_ownable_rejects_non_struct_inputs() {
|
|
123
143
|
for (case, input) in non_struct_item_inputs() {
|
|
124
144
|
assert_panics_contains(case, "failed to parse struct", || {
|
|
125
|
-
crate::
|
|
145
|
+
crate::auth::generate_ownable_impl(input.clone());
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ============================================
|
|
151
|
+
// Error Cases: multisig macro non-struct input
|
|
152
|
+
// ============================================
|
|
153
|
+
|
|
154
|
+
#[test]
|
|
155
|
+
fn test_multisig_rejects_non_struct_inputs() {
|
|
156
|
+
for (case, input) in non_struct_item_inputs() {
|
|
157
|
+
assert_panics_contains(case, "failed to parse struct", || {
|
|
158
|
+
crate::auth::generate_multisig_impl(input.clone());
|
|
126
159
|
});
|
|
127
160
|
}
|
|
128
161
|
}
|