@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
use crate::{errors::ExecutorFeeLibError, executor_option};
|
|
2
|
-
use common_macros::contract_impl;
|
|
3
|
-
use soroban_sdk::{assert_with_error,
|
|
2
|
+
use common_macros::{contract_impl, lz_contract};
|
|
3
|
+
use soroban_sdk::{assert_with_error, Address, Bytes, Env};
|
|
4
|
+
use utils::upgradeable::UpgradeableInternal;
|
|
4
5
|
use worker::{FeeParams, IExecutorFeeLib, LayerZeroPriceFeedClient};
|
|
5
6
|
|
|
6
7
|
// ============================================================================
|
|
@@ -11,7 +12,7 @@ use worker::{FeeParams, IExecutorFeeLib, LayerZeroPriceFeedClient};
|
|
|
11
12
|
const V1_EID_THRESHOLD: u32 = 30000;
|
|
12
13
|
|
|
13
14
|
/// Basis points denominator (10000 = 100%).
|
|
14
|
-
const BPS_DENOMINATOR:
|
|
15
|
+
const BPS_DENOMINATOR: u128 = 10000;
|
|
15
16
|
|
|
16
17
|
/// Overhead percentage for ordered execution (102 = 2% overhead).
|
|
17
18
|
const ORDERED_EXECUTION_OVERHEAD_PERCENT: u128 = 102;
|
|
@@ -24,124 +25,13 @@ const NATIVE_DECIMALS_RATE: u128 = 10_000_000;
|
|
|
24
25
|
/// Provides fee calculation logic based on executor options, destination configuration,
|
|
25
26
|
/// and current gas prices from the price feed. Handles fee multipliers, margins, and
|
|
26
27
|
/// native token value conversions.
|
|
27
|
-
#[
|
|
28
|
+
#[lz_contract(upgradeable)]
|
|
28
29
|
pub struct ExecutorFeeLib;
|
|
29
30
|
|
|
30
31
|
#[contract_impl]
|
|
31
32
|
impl ExecutorFeeLib {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// ========================================================================
|
|
35
|
-
|
|
36
|
-
/// Decodes executor options and calculates total gas and native value.
|
|
37
|
-
///
|
|
38
|
-
/// Parses encoded executor options, accumulates gas requirements (including
|
|
39
|
-
/// compose calls and ordered execution overhead), and returns the total native
|
|
40
|
-
/// value and gas needed.
|
|
41
|
-
///
|
|
42
|
-
/// # Arguments
|
|
43
|
-
/// * `options` - Encoded executor options bytes
|
|
44
|
-
/// * `dst_eid` - Destination endpoint ID
|
|
45
|
-
/// * `lz_receive_base_gas` - Base gas for lzReceive execution
|
|
46
|
-
/// * `lz_compose_base_gas` - Base gas per lzCompose call
|
|
47
|
-
/// * `native_cap` - Maximum allowed native token value
|
|
48
|
-
///
|
|
49
|
-
/// # Returns
|
|
50
|
-
/// Tuple of (total_native_value, total_gas).
|
|
51
|
-
fn decode_executor_options(
|
|
52
|
-
env: &Env,
|
|
53
|
-
options: &Bytes,
|
|
54
|
-
dst_eid: u32,
|
|
55
|
-
lz_receive_base_gas: u64,
|
|
56
|
-
lz_compose_base_gas: u64,
|
|
57
|
-
native_cap: u128,
|
|
58
|
-
) -> (u128, u128) {
|
|
59
|
-
let options_agg = executor_option::parse_executor_options(env, options, Self::is_v1_eid(dst_eid), native_cap);
|
|
60
|
-
|
|
61
|
-
let mut total_gas = (lz_receive_base_gas as u128)
|
|
62
|
-
+ options_agg.total_gas
|
|
63
|
-
+ ((lz_compose_base_gas as u128) * (options_agg.num_lz_compose as u128));
|
|
64
|
-
|
|
65
|
-
if options_agg.ordered {
|
|
66
|
-
total_gas = (total_gas * ORDERED_EXECUTION_OVERHEAD_PERCENT) / 100;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
(options_agg.total_value, total_gas)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/// Returns the effective multiplier in basis points.
|
|
73
|
-
///
|
|
74
|
-
/// Uses destination-specific multiplier if set, otherwise falls back to default multiplier.
|
|
75
|
-
///
|
|
76
|
-
/// # Arguments
|
|
77
|
-
/// * `params` - Fee parameters containing multiplier settings
|
|
78
|
-
///
|
|
79
|
-
/// # Returns
|
|
80
|
-
/// Effective multiplier in basis points.
|
|
81
|
-
fn get_effective_multiplier_bps(params: &FeeParams) -> u32 {
|
|
82
|
-
if params.multiplier_bps == 0 {
|
|
83
|
-
params.default_multiplier_bps
|
|
84
|
-
} else {
|
|
85
|
-
params.multiplier_bps
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/// Applies premium (multiplier and margin) to gas fee.
|
|
90
|
-
///
|
|
91
|
-
/// Calculates fee with multiplier and floor margin, returning the maximum of both
|
|
92
|
-
/// to ensure profitability.
|
|
93
|
-
///
|
|
94
|
-
/// # Arguments
|
|
95
|
-
/// * `fee` - Base gas fee
|
|
96
|
-
/// * `multiplier_bps` - Fee multiplier in basis points
|
|
97
|
-
/// * `margin_usd` - Minimum margin in USD (scaled)
|
|
98
|
-
/// * `native_price_usd` - Native token price in USD (scaled)
|
|
99
|
-
///
|
|
100
|
-
/// # Returns
|
|
101
|
-
/// Fee with premium applied (max of multiplier fee and margin fee).
|
|
102
|
-
fn apply_premium_to_gas(fee: i128, multiplier_bps: u32, margin_usd: u128, native_price_usd: u128) -> i128 {
|
|
103
|
-
let fee_with_multiplier = (fee * multiplier_bps as i128) / BPS_DENOMINATOR;
|
|
104
|
-
|
|
105
|
-
if native_price_usd == 0 || margin_usd == 0 {
|
|
106
|
-
return fee_with_multiplier;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
let fee_with_margin = ((margin_usd * NATIVE_DECIMALS_RATE) / native_price_usd) as i128 + fee;
|
|
110
|
-
|
|
111
|
-
fee_with_margin.max(fee_with_multiplier)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/// Converts native value and applies premium multiplier.
|
|
115
|
-
///
|
|
116
|
-
/// Converts value using price ratio and applies multiplier in basis points.
|
|
117
|
-
///
|
|
118
|
-
/// # Arguments
|
|
119
|
-
/// * `value` - Native value to convert
|
|
120
|
-
/// * `ratio` - Price ratio numerator
|
|
121
|
-
/// * `denom` - Price ratio denominator
|
|
122
|
-
/// * `multiplier_bps` - Fee multiplier in basis points
|
|
123
|
-
///
|
|
124
|
-
/// # Returns
|
|
125
|
-
/// Converted and multiplied value, or 0 if input value is 0.
|
|
126
|
-
fn convert_and_apply_premium_to_value(value: u128, ratio: u128, denom: u128, multiplier_bps: u32) -> i128 {
|
|
127
|
-
if value == 0 {
|
|
128
|
-
return 0;
|
|
129
|
-
}
|
|
130
|
-
let converted = (value * ratio) / denom;
|
|
131
|
-
((converted * multiplier_bps as u128) / BPS_DENOMINATOR as u128) as i128
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/// Checks if an endpoint ID is a V1 endpoint.
|
|
135
|
-
///
|
|
136
|
-
/// V1 endpoints (EID < 30000) have restrictions on executor options.
|
|
137
|
-
///
|
|
138
|
-
/// # Arguments
|
|
139
|
-
/// * `eid` - Endpoint ID to check
|
|
140
|
-
///
|
|
141
|
-
/// # Returns
|
|
142
|
-
/// `true` if the endpoint is a V1 endpoint, `false` otherwise.
|
|
143
|
-
fn is_v1_eid(eid: u32) -> bool {
|
|
144
|
-
eid < V1_EID_THRESHOLD
|
|
33
|
+
pub fn __constructor(env: &Env, owner: &Address) {
|
|
34
|
+
Self::init_owner(env, owner);
|
|
145
35
|
}
|
|
146
36
|
}
|
|
147
37
|
|
|
@@ -170,7 +60,7 @@ impl IExecutorFeeLib for ExecutorFeeLib {
|
|
|
170
60
|
fn get_fee(env: &Env, _executor: &Address, params: &FeeParams) -> i128 {
|
|
171
61
|
assert_with_error!(env, params.lz_receive_base_gas != 0, ExecutorFeeLibError::EidNotSupported);
|
|
172
62
|
|
|
173
|
-
let (total_value, total_gas) =
|
|
63
|
+
let (total_value, total_gas) = decode_executor_options(
|
|
174
64
|
env,
|
|
175
65
|
¶ms.options,
|
|
176
66
|
params.dst_eid,
|
|
@@ -186,16 +76,18 @@ impl IExecutorFeeLib for ExecutorFeeLib {
|
|
|
186
76
|
&total_gas,
|
|
187
77
|
);
|
|
188
78
|
|
|
189
|
-
let multiplier_bps =
|
|
79
|
+
let multiplier_bps = get_effective_multiplier_bps(params);
|
|
190
80
|
|
|
191
|
-
let mut fee =
|
|
81
|
+
let mut fee = apply_premium_to_gas(
|
|
82
|
+
env,
|
|
192
83
|
fee_estimate.total_gas_fee,
|
|
193
84
|
multiplier_bps,
|
|
194
85
|
params.floor_margin_usd,
|
|
195
86
|
fee_estimate.native_price_usd,
|
|
196
87
|
);
|
|
197
88
|
|
|
198
|
-
fee +=
|
|
89
|
+
fee += convert_and_apply_premium_to_value(
|
|
90
|
+
env,
|
|
199
91
|
total_value,
|
|
200
92
|
fee_estimate.price_ratio,
|
|
201
93
|
fee_estimate.price_ratio_denominator,
|
|
@@ -213,3 +105,143 @@ impl IExecutorFeeLib for ExecutorFeeLib {
|
|
|
213
105
|
(1, 1)
|
|
214
106
|
}
|
|
215
107
|
}
|
|
108
|
+
|
|
109
|
+
// ============================================================================
|
|
110
|
+
// Upgradeable Implementation
|
|
111
|
+
// ============================================================================
|
|
112
|
+
|
|
113
|
+
impl UpgradeableInternal for ExecutorFeeLib {
|
|
114
|
+
type MigrationData = ();
|
|
115
|
+
|
|
116
|
+
fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
|
|
117
|
+
// No migration logic needed for initial upgrade capability
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ========================================================================
|
|
122
|
+
// Helper Functions
|
|
123
|
+
// ========================================================================
|
|
124
|
+
|
|
125
|
+
/// Decodes executor options and calculates total gas and native value.
|
|
126
|
+
///
|
|
127
|
+
/// Parses encoded executor options, accumulates gas requirements (including
|
|
128
|
+
/// compose calls and ordered execution overhead), and returns the total native
|
|
129
|
+
/// value and gas needed.
|
|
130
|
+
///
|
|
131
|
+
/// # Arguments
|
|
132
|
+
/// * `options` - Encoded executor options bytes
|
|
133
|
+
/// * `dst_eid` - Destination endpoint ID
|
|
134
|
+
/// * `lz_receive_base_gas` - Base gas for lzReceive execution
|
|
135
|
+
/// * `lz_compose_base_gas` - Base gas per lzCompose call
|
|
136
|
+
/// * `native_cap` - Maximum allowed native token value
|
|
137
|
+
///
|
|
138
|
+
/// # Returns
|
|
139
|
+
/// Tuple of (total_native_value, total_gas).
|
|
140
|
+
fn decode_executor_options(
|
|
141
|
+
env: &Env,
|
|
142
|
+
options: &Bytes,
|
|
143
|
+
dst_eid: u32,
|
|
144
|
+
lz_receive_base_gas: u64,
|
|
145
|
+
lz_compose_base_gas: u64,
|
|
146
|
+
native_cap: u128,
|
|
147
|
+
) -> (u128, u128) {
|
|
148
|
+
let options_agg = executor_option::parse_executor_options(env, options, is_v1_eid(dst_eid), native_cap);
|
|
149
|
+
|
|
150
|
+
let mut total_gas = (lz_receive_base_gas as u128)
|
|
151
|
+
+ options_agg.total_gas
|
|
152
|
+
+ ((lz_compose_base_gas as u128) * (options_agg.num_lz_compose as u128));
|
|
153
|
+
|
|
154
|
+
if options_agg.ordered {
|
|
155
|
+
total_gas = (total_gas * ORDERED_EXECUTION_OVERHEAD_PERCENT) / 100;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
(options_agg.total_value, total_gas)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/// Returns the effective multiplier in basis points.
|
|
162
|
+
///
|
|
163
|
+
/// Uses destination-specific multiplier if set, otherwise falls back to default multiplier.
|
|
164
|
+
///
|
|
165
|
+
/// # Arguments
|
|
166
|
+
/// * `params` - Fee parameters containing multiplier settings
|
|
167
|
+
///
|
|
168
|
+
/// # Returns
|
|
169
|
+
/// Effective multiplier in basis points.
|
|
170
|
+
fn get_effective_multiplier_bps(params: &FeeParams) -> u32 {
|
|
171
|
+
if params.multiplier_bps == 0 {
|
|
172
|
+
params.default_multiplier_bps
|
|
173
|
+
} else {
|
|
174
|
+
params.multiplier_bps
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/// Applies premium (multiplier and margin) to gas fee.
|
|
179
|
+
///
|
|
180
|
+
/// Calculates fee with multiplier and floor margin, returning the maximum of both
|
|
181
|
+
/// to ensure profitability.
|
|
182
|
+
///
|
|
183
|
+
/// # Arguments
|
|
184
|
+
/// * `fee` - Base gas fee
|
|
185
|
+
/// * `multiplier_bps` - Fee multiplier in basis points
|
|
186
|
+
/// * `margin_usd` - Minimum margin in USD (scaled)
|
|
187
|
+
/// * `native_price_usd` - Native token price in USD (scaled)
|
|
188
|
+
///
|
|
189
|
+
/// # Example(scaled to 10^20)
|
|
190
|
+
/// With margin_usd = $0.01 (0.01 * 10^20), native_price_usd = $0.32 (0.32 * 10^20), fee = 0:
|
|
191
|
+
/// fee_with_margin = ((0.01 * 10^20 * 10^7) / (0.32 * 10^20)) + 0 = 312_500 stroops (0.03125 XLM)
|
|
192
|
+
///
|
|
193
|
+
/// # Returns
|
|
194
|
+
/// Fee with premium applied (max of multiplier fee and margin fee).
|
|
195
|
+
fn apply_premium_to_gas(env: &Env, fee: i128, multiplier_bps: u32, margin_usd: u128, native_price_usd: u128) -> i128 {
|
|
196
|
+
assert_with_error!(env, fee >= 0, ExecutorFeeLibError::InvalidFee);
|
|
197
|
+
|
|
198
|
+
let fee_with_multiplier = safe_u128_to_i128(env, (fee as u128 * multiplier_bps as u128) / BPS_DENOMINATOR);
|
|
199
|
+
|
|
200
|
+
if native_price_usd == 0 || margin_usd == 0 {
|
|
201
|
+
return fee_with_multiplier;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
let margin_in_native = (margin_usd * NATIVE_DECIMALS_RATE) / native_price_usd;
|
|
205
|
+
let fee_with_margin = safe_u128_to_i128(env, margin_in_native) + fee;
|
|
206
|
+
|
|
207
|
+
fee_with_margin.max(fee_with_multiplier)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/// Converts native value and applies premium multiplier.
|
|
211
|
+
///
|
|
212
|
+
/// Converts value using price ratio and applies multiplier in basis points.
|
|
213
|
+
///
|
|
214
|
+
/// # Arguments
|
|
215
|
+
/// * `value` - Native value to convert
|
|
216
|
+
/// * `ratio` - Price ratio numerator
|
|
217
|
+
/// * `denom` - Price ratio denominator
|
|
218
|
+
/// * `multiplier_bps` - Fee multiplier in basis points
|
|
219
|
+
///
|
|
220
|
+
/// # Returns
|
|
221
|
+
/// Converted and multiplied value, or 0 if input value is 0.
|
|
222
|
+
fn convert_and_apply_premium_to_value(env: &Env, value: u128, ratio: u128, denom: u128, multiplier_bps: u32) -> i128 {
|
|
223
|
+
if value == 0 {
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
let converted = (value * ratio) / denom;
|
|
227
|
+
safe_u128_to_i128(env, (converted * multiplier_bps as u128) / BPS_DENOMINATOR)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// Checks if an endpoint ID is a V1 endpoint.
|
|
231
|
+
///
|
|
232
|
+
/// V1 endpoints (EID < 30000) have restrictions on executor options.
|
|
233
|
+
///
|
|
234
|
+
/// # Arguments
|
|
235
|
+
/// * `eid` - Endpoint ID to check
|
|
236
|
+
///
|
|
237
|
+
/// # Returns
|
|
238
|
+
/// `true` if the endpoint is a V1 endpoint, `false` otherwise.
|
|
239
|
+
fn is_v1_eid(eid: u32) -> bool {
|
|
240
|
+
eid < V1_EID_THRESHOLD
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/// Safely converts u128 to i128, panicking if value exceeds i128::MAX.
|
|
244
|
+
fn safe_u128_to_i128(env: &Env, value: u128) -> i128 {
|
|
245
|
+
assert_with_error!(env, value <= i128::MAX as u128, ExecutorFeeLibError::Overflow);
|
|
246
|
+
value as i128
|
|
247
|
+
}
|
|
@@ -6,15 +6,10 @@ license.workspace = true
|
|
|
6
6
|
publish = false
|
|
7
7
|
|
|
8
8
|
[lib]
|
|
9
|
-
crate-type = ["cdylib"]
|
|
9
|
+
crate-type = ["cdylib", "rlib"]
|
|
10
10
|
doctest = false
|
|
11
11
|
|
|
12
|
-
[features]
|
|
13
|
-
library = []
|
|
14
|
-
testutils = []
|
|
15
|
-
|
|
16
12
|
[dependencies]
|
|
17
|
-
cfg-if = { workspace = true }
|
|
18
13
|
soroban-sdk = { workspace = true }
|
|
19
14
|
# workspace dependencies
|
|
20
15
|
common-macros = { workspace = true }
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
//! ABA-safe entry point for cross-chain message execution on Stellar.
|
|
2
2
|
//! Prevents reentry into the Executor during OApp Atomic Batch Actions.
|
|
3
3
|
|
|
4
|
+
use common_macros::contract_impl;
|
|
4
5
|
use endpoint_v2::{
|
|
5
6
|
LayerZeroComposerClient, LayerZeroEndpointV2Client, LayerZeroReceiverClient, MessagingComposerClient, Origin,
|
|
6
7
|
};
|
|
7
8
|
use executor::{ExecutorClient, NativeDropParams};
|
|
8
|
-
use common_macros::contract_impl;
|
|
9
9
|
use soroban_sdk::{contract, contracttype, token::TokenClient, Address, Bytes, BytesN, Env, Vec};
|
|
10
10
|
|
|
11
11
|
/// Parameters for `lz_receive` execution.
|
|
@@ -40,28 +40,43 @@ pub struct ExecutorHelper;
|
|
|
40
40
|
|
|
41
41
|
#[contract_impl]
|
|
42
42
|
impl ExecutorHelper {
|
|
43
|
-
/// Executes `lz_receive` on the target OApp
|
|
43
|
+
/// Executes `lz_receive` on the target OApp
|
|
44
44
|
pub fn execute(env: &Env, executor: &Address, params: &ExecutionParams, value_payer: &Address) {
|
|
45
|
-
if params.value
|
|
46
|
-
value_payer.
|
|
45
|
+
if params.value != 0 {
|
|
46
|
+
transfer_value(env, value_payer, executor, params.value);
|
|
47
47
|
}
|
|
48
|
-
|
|
48
|
+
LayerZeroReceiverClient::new(env, ¶ms.receiver).lz_receive(
|
|
49
|
+
executor,
|
|
50
|
+
¶ms.origin,
|
|
51
|
+
¶ms.guid,
|
|
52
|
+
¶ms.message,
|
|
53
|
+
¶ms.extra_data,
|
|
54
|
+
¶ms.value,
|
|
55
|
+
);
|
|
49
56
|
}
|
|
50
57
|
|
|
51
|
-
///
|
|
52
|
-
pub fn
|
|
53
|
-
executor.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
/// Records a failed `lz_receive` execution for off-chain processing.
|
|
59
|
+
pub fn lz_receive_alert(env: &Env, executor: &Address, params: &ExecutionParams, reason: &Bytes) {
|
|
60
|
+
let endpoint = ExecutorClient::new(env, executor).endpoint();
|
|
61
|
+
LayerZeroEndpointV2Client::new(env, &endpoint).lz_receive_alert(
|
|
62
|
+
executor,
|
|
63
|
+
¶ms.origin,
|
|
64
|
+
¶ms.receiver,
|
|
65
|
+
¶ms.guid,
|
|
66
|
+
¶ms.gas_limit,
|
|
67
|
+
¶ms.value,
|
|
68
|
+
¶ms.message,
|
|
69
|
+
¶ms.extra_data,
|
|
70
|
+
reason,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
63
73
|
|
|
64
|
-
|
|
74
|
+
/// Executes `lz_compose` on the target composer
|
|
75
|
+
pub fn compose(env: &Env, executor: &Address, params: &ComposeParams, value_payer: &Address) {
|
|
76
|
+
if params.value != 0 {
|
|
77
|
+
transfer_value(env, value_payer, executor, params.value);
|
|
78
|
+
}
|
|
79
|
+
LayerZeroComposerClient::new(env, ¶ms.to).lz_compose(
|
|
65
80
|
executor,
|
|
66
81
|
¶ms.from,
|
|
67
82
|
¶ms.guid,
|
|
@@ -70,22 +85,23 @@ impl ExecutorHelper {
|
|
|
70
85
|
¶ms.extra_data,
|
|
71
86
|
¶ms.value,
|
|
72
87
|
);
|
|
88
|
+
}
|
|
73
89
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
90
|
+
/// Records a failed `lz_compose` execution for off-chain processing.
|
|
91
|
+
pub fn lz_compose_alert(env: &Env, executor: &Address, params: &ComposeParams, reason: &Bytes) {
|
|
92
|
+
let endpoint = ExecutorClient::new(env, executor).endpoint();
|
|
93
|
+
MessagingComposerClient::new(env, &endpoint).lz_compose_alert(
|
|
94
|
+
executor,
|
|
95
|
+
¶ms.from,
|
|
96
|
+
¶ms.to,
|
|
97
|
+
¶ms.guid,
|
|
98
|
+
¶ms.index,
|
|
99
|
+
¶ms.gas_limit,
|
|
100
|
+
¶ms.value,
|
|
101
|
+
¶ms.message,
|
|
102
|
+
¶ms.extra_data,
|
|
103
|
+
reason,
|
|
104
|
+
);
|
|
89
105
|
}
|
|
90
106
|
|
|
91
107
|
/// Delegates `native_drop` to the executor contract.
|
|
@@ -98,7 +114,6 @@ impl ExecutorHelper {
|
|
|
98
114
|
oapp: &Address,
|
|
99
115
|
params: &Vec<NativeDropParams>,
|
|
100
116
|
) {
|
|
101
|
-
admin.require_auth();
|
|
102
117
|
ExecutorClient::new(env, executor).native_drop(admin, origin, &dst_eid, oapp, params);
|
|
103
118
|
}
|
|
104
119
|
|
|
@@ -114,48 +129,13 @@ impl ExecutorHelper {
|
|
|
114
129
|
execute_params: &ExecutionParams,
|
|
115
130
|
) {
|
|
116
131
|
Self::native_drop(env, executor, admin, origin, dst_eid, oapp, native_drop_params);
|
|
117
|
-
Self::
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
fn execute_internal(env: &Env, executor: &Address, params: &ExecutionParams, value_payer: &Address) {
|
|
121
|
-
executor.require_auth();
|
|
122
|
-
|
|
123
|
-
let endpoint = if params.value > 0 {
|
|
124
|
-
let ep = ExecutorClient::new(env, executor).endpoint();
|
|
125
|
-
transfer_value(env, &ep, value_payer, executor, params.value);
|
|
126
|
-
Some(ep)
|
|
127
|
-
} else {
|
|
128
|
-
None
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
let result = LayerZeroReceiverClient::new(env, ¶ms.receiver).try_lz_receive(
|
|
132
|
-
executor,
|
|
133
|
-
¶ms.origin,
|
|
134
|
-
¶ms.guid,
|
|
135
|
-
¶ms.message,
|
|
136
|
-
¶ms.extra_data,
|
|
137
|
-
¶ms.value,
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
if result.is_err() {
|
|
141
|
-
let ep = endpoint.unwrap_or_else(|| ExecutorClient::new(env, executor).endpoint());
|
|
142
|
-
LayerZeroEndpointV2Client::new(env, &ep).lz_receive_alert(
|
|
143
|
-
executor,
|
|
144
|
-
¶ms.origin,
|
|
145
|
-
¶ms.receiver,
|
|
146
|
-
¶ms.guid,
|
|
147
|
-
¶ms.gas_limit,
|
|
148
|
-
¶ms.value,
|
|
149
|
-
¶ms.message,
|
|
150
|
-
¶ms.extra_data,
|
|
151
|
-
&Bytes::new(env),
|
|
152
|
-
);
|
|
153
|
-
}
|
|
132
|
+
Self::execute(env, executor, execute_params, admin);
|
|
154
133
|
}
|
|
155
134
|
}
|
|
156
135
|
|
|
157
136
|
#[inline]
|
|
158
|
-
fn transfer_value(env: &Env,
|
|
159
|
-
let
|
|
137
|
+
fn transfer_value(env: &Env, payer: &Address, executor: &Address, value: i128) {
|
|
138
|
+
let endpoint = ExecutorClient::new(env, executor).endpoint();
|
|
139
|
+
let native_token = LayerZeroEndpointV2Client::new(env, &endpoint).native_token();
|
|
160
140
|
TokenClient::new(env, &native_token).transfer(payer, executor, &value);
|
|
161
141
|
}
|
|
@@ -2,10 +2,4 @@
|
|
|
2
2
|
|
|
3
3
|
mod executor_helper;
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
// Include implementation when NOT in library mode, OR when testutils is enabled (for tests)
|
|
7
|
-
if #[cfg(any(not(feature = "library"), feature = "testutils"))] {
|
|
8
|
-
|
|
9
|
-
pub use executor_helper::*;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
5
|
+
pub use executor_helper::*;
|
|
@@ -6,12 +6,11 @@ license.workspace = true
|
|
|
6
6
|
publish = false
|
|
7
7
|
|
|
8
8
|
[lib]
|
|
9
|
-
crate-type = ["cdylib"]
|
|
9
|
+
crate-type = ["cdylib", "rlib"]
|
|
10
10
|
doctest = false
|
|
11
11
|
|
|
12
12
|
[dependencies]
|
|
13
13
|
soroban-sdk = { workspace = true }
|
|
14
|
-
endpoint-v2 = { workspace = true, features = ["library"] }
|
|
15
14
|
utils = { workspace = true }
|
|
16
15
|
worker = { workspace = true }
|
|
17
16
|
common-macros = { workspace = true }
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
#![no_std]
|
|
2
2
|
|
|
3
|
-
mod errors;
|
|
4
|
-
mod events;
|
|
5
|
-
mod price_feed;
|
|
6
3
|
mod storage;
|
|
7
|
-
mod types;
|
|
8
4
|
|
|
9
|
-
pub
|
|
5
|
+
pub mod errors;
|
|
6
|
+
pub mod events;
|
|
7
|
+
pub mod price_feed;
|
|
8
|
+
pub mod types;
|
|
9
|
+
|
|
10
10
|
pub use price_feed::{LzPriceFeed, LzPriceFeedClient};
|
|
11
|
-
pub use types::*;
|