@layerzerolabs/protocol-stellar-v2 0.2.15 → 0.2.19
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 +365 -297
- package/.turbo/turbo-lint.log +142 -110
- package/.turbo/turbo-test.log +1273 -1222
- package/Cargo.lock +20 -5
- package/Cargo.toml +4 -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 +181 -30
- package/contracts/common-macros/src/lz_contract.rs +83 -0
- 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 +2 -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} +3 -3
- 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__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -21
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +2 -2
- package/contracts/common-macros/src/ttl_configurable.rs +19 -34
- package/contracts/common-macros/src/ttl_extendable.rs +36 -0
- package/contracts/common-macros/src/upgradeable.rs +5 -5
- 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 +38 -40
- 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_v2/pay_messaging_fees.rs +3 -3
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +3 -3
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +3 -3
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +1 -1
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +3 -3
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +1 -1
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +4 -4
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +1 -1
- package/contracts/layerzero-views/src/layerzero_view.rs +3 -6
- package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +2 -2
- package/contracts/macro-integration-tests/tests/runtime/ownable/{only_owner_guard.rs → only_auth_guard.rs} +1 -1
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +1 -1
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +1 -1
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +0 -1
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.rs → only_auth_missing_env.rs} +3 -3
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.stderr → only_auth_missing_env.stderr} +4 -4
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +2 -3
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/{only_owner_env_param_variants.rs → only_auth_env_param_variants.rs} +9 -9
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +6 -6
- 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 +3 -3
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +1 -2
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +1 -2
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +9 -9
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +1 -1
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +1 -1
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +2 -2
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
- package/contracts/message-libs/treasury/src/errors.rs +2 -2
- 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/storage.rs +1 -1
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
- package/contracts/message-libs/treasury/src/treasury.rs +14 -16
- package/contracts/message-libs/uln-302/src/receive_uln.rs +13 -2
- package/contracts/message-libs/uln-302/src/send_uln.rs +24 -4
- package/contracts/message-libs/uln-302/src/uln302.rs +6 -24
- 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.rs → setup_sml.rs} +48 -80
- 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 -43
- 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 +93 -78
- 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 -8
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -17
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -7
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -15
- package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
- package/contracts/oapps/oapp-macros/src/lib.rs +113 -56
- package/contracts/oapps/oft/Cargo.toml +10 -7
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
- package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
- package/contracts/oapps/oft/integration-tests/setup.rs +29 -110
- package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -14
- package/contracts/oapps/oft/src/extensions/pausable.rs +4 -4
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +5 -5
- package/contracts/oapps/oft/src/lib.rs +11 -13
- package/contracts/oapps/oft/src/oft.rs +147 -225
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -13
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +31 -14
- package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
- package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
- package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
- package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +129 -30
- package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
- package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
- package/contracts/oapps/oft-core/src/errors.rs +13 -0
- package/contracts/oapps/oft-core/src/lib.rs +18 -0
- package/contracts/oapps/oft-core/src/oft_core.rs +439 -0
- package/contracts/oapps/{oft → oft-core}/src/storage.rs +2 -0
- package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
- package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +2 -2
- package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
- package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -5
- package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
- package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +78 -37
- package/contracts/oapps/oft-core/src/types.rs +58 -0
- package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
- package/contracts/upgrader/src/lib.rs +4 -4
- package/contracts/utils/src/auth.rs +44 -0
- package/contracts/utils/src/errors.rs +31 -5
- package/contracts/utils/src/lib.rs +3 -0
- package/contracts/utils/src/multisig.rs +211 -0
- package/contracts/utils/src/ownable.rs +137 -13
- 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 +1 -0
- package/contracts/utils/src/tests/multisig.rs +731 -0
- package/contracts/utils/src/tests/option_ext.rs +2 -5
- package/contracts/utils/src/tests/ownable.rs +456 -7
- package/contracts/utils/src/tests/ttl_configurable.rs +27 -16
- package/contracts/utils/src/tests/upgradeable.rs +4 -2
- package/contracts/utils/src/ttl_configurable.rs +23 -8
- package/contracts/utils/src/ttl_extendable.rs +27 -0
- package/contracts/utils/src/upgradeable.rs +2 -0
- package/contracts/workers/dvn/Cargo.toml +1 -1
- package/contracts/workers/dvn/src/auth.rs +7 -7
- package/contracts/workers/dvn/src/dvn.rs +10 -38
- package/contracts/workers/dvn/src/errors.rs +0 -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 +1 -1
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -6
- package/contracts/workers/executor/src/auth.rs +80 -16
- package/contracts/workers/executor/src/executor.rs +5 -31
- 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/executor_fee_lib.rs +3 -6
- package/contracts/workers/executor-helper/Cargo.toml +1 -1
- package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
- package/contracts/workers/price-feed/Cargo.toml +1 -1
- package/contracts/workers/price-feed/src/price_feed.rs +7 -10
- package/contracts/workers/worker/src/errors.rs +4 -0
- package/contracts/workers/worker/src/tests/worker.rs +7 -6
- package/contracts/workers/worker/src/worker.rs +20 -16
- package/package.json +7 -5
- package/sdk/.turbo/turbo-build.log +1 -0
- package/sdk/.turbo/turbo-test.log +1019 -0
- package/sdk/dist/generated/bml.d.ts +95 -8
- package/sdk/dist/generated/bml.js +95 -36
- package/sdk/dist/generated/counter.d.ts +289 -44
- package/sdk/dist/generated/counter.js +119 -49
- package/sdk/dist/generated/dvn.d.ts +312 -229
- package/sdk/dist/generated/dvn.js +144 -83
- package/sdk/dist/generated/dvn_fee_lib.d.ts +258 -63
- package/sdk/dist/generated/dvn_fee_lib.js +95 -26
- package/sdk/dist/generated/endpoint.d.ts +219 -24
- package/sdk/dist/generated/endpoint.js +108 -41
- package/sdk/dist/generated/executor.d.ts +239 -87
- package/sdk/dist/generated/executor.js +135 -63
- package/sdk/dist/generated/executor_fee_lib.d.ts +278 -74
- package/sdk/dist/generated/executor_fee_lib.js +135 -59
- package/sdk/dist/generated/executor_helper.d.ts +163 -21
- package/sdk/dist/generated/executor_helper.js +124 -52
- package/sdk/dist/generated/oft.d.ts +1842 -0
- package/sdk/dist/generated/oft.js +345 -0
- package/sdk/dist/generated/price_feed.d.ts +258 -63
- package/sdk/dist/generated/price_feed.js +95 -26
- package/sdk/dist/generated/sml.d.ts +235 -34
- package/sdk/dist/generated/sml.js +126 -53
- package/sdk/dist/generated/treasury.d.ts +1016 -0
- package/sdk/dist/generated/treasury.js +248 -0
- package/sdk/dist/generated/uln302.d.ts +235 -34
- package/sdk/dist/generated/uln302.js +126 -53
- package/sdk/dist/generated/upgrader.d.ts +17 -2
- package/sdk/dist/generated/upgrader.js +19 -1
- package/sdk/dist/index.d.ts +2 -1
- package/sdk/dist/index.js +2 -1
- package/sdk/package.json +6 -3
- package/sdk/src/index.ts +2 -1
- 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} +196 -321
- package/sdk/test/suites/constants.ts +22 -2
- package/sdk/test/suites/globalSetup.ts +450 -0
- package/sdk/test/suites/localnet.ts +23 -6
- package/sdk/test/upgrader.test.ts +7 -16
- package/sdk/test/utils.ts +558 -85
- package/sdk/turbo.json +8 -0
- package/sdk/vitest.config.ts +21 -0
- package/tools/ts-bindings-gen/Cargo.toml +2 -0
- package/tools/ts-bindings-gen/src/main.rs +52 -4
- package/contracts/common-macros/src/contract_impl.rs +0 -52
- package/contracts/common-macros/src/ownable.rs +0 -41
- package/contracts/common-macros/src/tests/contract_impl.rs +0 -386
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -12
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +0 -50
- package/contracts/oapps/oapp-macros/src/oapp_core.rs +0 -41
- package/contracts/oapps/oapp-macros/src/oapp_full.rs +0 -21
- package/contracts/oapps/oapp-macros/src/oapp_options_type3.rs +0 -31
- package/contracts/oapps/oapp-macros/src/oapp_receiver.rs +0 -48
- package/contracts/oapps/oapp-macros/src/oapp_sender.rs +0 -21
- package/contracts/oapps/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 -152
- package/contracts/oapps/oft/src/errors.rs +0 -8
- package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
- package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
- package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
- package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -903
- package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -749
- package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -432
- package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1078
- package/contracts/oapps/oft/src/types.rs +0 -38
- package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
- package/contracts/oapps/oft-std/src/lib.rs +0 -16
- package/contracts/oapps/oft-std/src/oft.rs +0 -156
- package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
- package/contracts/workers/dvn/src/multisig.rs +0 -157
- package/sdk/dist/generated/oft_std.d.ts +0 -1544
- package/sdk/dist/generated/oft_std.js +0 -271
- package/sdk/test/index.test.ts +0 -375
- /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
- /package/sdk/test/suites/{testUpgradeable.ts → dummyContractClient.ts} +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
use super::*;
|
|
2
|
-
|
|
2
|
+
use endpoint_v2::LayerZeroEndpointV2Client;
|
|
3
3
|
use soroban_sdk::{
|
|
4
4
|
address_payload::AddressPayload,
|
|
5
5
|
auth::{Context, CustomAccountInterface},
|
|
6
|
-
|
|
6
|
+
contracttype,
|
|
7
7
|
crypto::Hash,
|
|
8
|
+
Symbol, TryFromVal, Val,
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
// ============================================================================
|
|
@@ -26,7 +27,7 @@ pub struct ExecutorSignature {
|
|
|
26
27
|
// Custom Account Interface Implementation
|
|
27
28
|
// ============================================================================
|
|
28
29
|
|
|
29
|
-
#[
|
|
30
|
+
#[contract_impl]
|
|
30
31
|
impl CustomAccountInterface for LzExecutor {
|
|
31
32
|
type Signature = ExecutorSignature;
|
|
32
33
|
type Error = ExecutorError;
|
|
@@ -35,7 +36,6 @@ impl CustomAccountInterface for LzExecutor {
|
|
|
35
36
|
///
|
|
36
37
|
/// The public key must correspond to a registered admin and must have signed the signature_payload.
|
|
37
38
|
/// Uses Ed25519 signature verification.
|
|
38
|
-
/// Only whitelisted function calls are authorized.
|
|
39
39
|
fn __check_auth(
|
|
40
40
|
env: Env,
|
|
41
41
|
signature_payload: Hash<32>,
|
|
@@ -70,24 +70,88 @@ impl LzExecutor {
|
|
|
70
70
|
Ok(())
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
/// Validates
|
|
74
|
-
///
|
|
73
|
+
/// Validates auth contexts according to executor rules.
|
|
74
|
+
///
|
|
75
|
+
/// # Design
|
|
76
|
+
///
|
|
77
|
+
/// For `lz_receive`: OApps call `verify_and_clear_payload` (see `oapp_receiver.rs`)
|
|
78
|
+
/// which requires executor auth and optionally transfers native token from executor to OApp.
|
|
79
|
+
///
|
|
80
|
+
/// For `lz_compose`: Composers follow the same pattern - require executor auth and
|
|
81
|
+
/// optionally transfer native token from executor to composer.
|
|
82
|
+
///
|
|
83
|
+
/// Both create 1-2 auth contexts depending on whether value == 0:
|
|
84
|
+
/// - Context 1: `lz_receive`/`lz_compose` on the OApp/Composer (always present)
|
|
85
|
+
/// - Context 2: `transfer` on native token (only if value != 0)
|
|
86
|
+
///
|
|
87
|
+
/// For `lz_receive_alert`/`lz_compose_alert`: These are called directly on the endpoint
|
|
88
|
+
/// to record failed executions. Only 1 context on the endpoint is expected.
|
|
75
89
|
fn validate_auth_contexts(env: &Env, contexts: &Vec<Context>) -> Result<(), ExecutorError> {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
90
|
+
// Early bounds check: max 2 contexts expected
|
|
91
|
+
if contexts.len() > 2 {
|
|
92
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
let first_ctx = contexts.first().ok_or(ExecutorError::UnauthorizedContext)?;
|
|
96
|
+
let Context::Contract(first_ctx) = first_ctx else {
|
|
97
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
let first_fn_name = &first_ctx.fn_name;
|
|
101
|
+
|
|
102
|
+
// Alert path: lz_receive_alert or lz_compose_alert (lazy Symbol creation)
|
|
103
|
+
if *first_fn_name == Symbol::new(env, "lz_receive_alert")
|
|
104
|
+
|| *first_fn_name == Symbol::new(env, "lz_compose_alert")
|
|
105
|
+
{
|
|
106
|
+
// Require exactly 1 context and the contract must be the endpoint
|
|
107
|
+
if contexts.len() != 1 || first_ctx.contract != Self::endpoint(env) {
|
|
108
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
84
109
|
}
|
|
85
|
-
|
|
86
|
-
|
|
110
|
+
return Ok(());
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Execute path: lz_receive or lz_compose
|
|
114
|
+
if *first_fn_name != Symbol::new(env, "lz_receive") && *first_fn_name != Symbol::new(env, "lz_compose") {
|
|
115
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
let value = Self::extract_i128(env, first_ctx.args.last())?;
|
|
119
|
+
if value == 0 {
|
|
120
|
+
// If value is 0, there should be exactly 1 context
|
|
121
|
+
if contexts.len() != 1 {
|
|
87
122
|
return Err(ExecutorError::UnauthorizedContext);
|
|
88
123
|
}
|
|
124
|
+
return Ok(());
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// value != 0: validate transfer context (only if there are 2 contexts)
|
|
128
|
+
if contexts.len() != 2 {
|
|
129
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Second context must be the transfer context
|
|
133
|
+
let Context::Contract(second_ctx) = contexts.get(1).unwrap() else {
|
|
134
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
let native_token = LayerZeroEndpointV2Client::new(env, &Self::endpoint(env)).native_token();
|
|
138
|
+
let transfer_amount = Self::extract_i128(env, second_ctx.args.get(2))?;
|
|
139
|
+
|
|
140
|
+
// Validate transfer context: must be transfer with matching value and native token contract
|
|
141
|
+
if second_ctx.fn_name != Symbol::new(env, "transfer")
|
|
142
|
+
|| second_ctx.contract != native_token
|
|
143
|
+
|| transfer_amount != value
|
|
144
|
+
{
|
|
145
|
+
return Err(ExecutorError::UnauthorizedContext);
|
|
89
146
|
}
|
|
90
147
|
|
|
91
148
|
Ok(())
|
|
92
149
|
}
|
|
150
|
+
|
|
151
|
+
/// Extracts an i128 value from an optional Val.
|
|
152
|
+
#[inline]
|
|
153
|
+
fn extract_i128(env: &Env, val: Option<Val>) -> Result<i128, ExecutorError> {
|
|
154
|
+
let val = val.ok_or(ExecutorError::UnauthorizedContext)?;
|
|
155
|
+
i128::try_from_val(env, &val).map_err(|_| ExecutorError::UnauthorizedContext)
|
|
156
|
+
}
|
|
93
157
|
}
|
|
@@ -5,29 +5,25 @@ use crate::{
|
|
|
5
5
|
storage::ExecutorStorage,
|
|
6
6
|
NativeDropParams,
|
|
7
7
|
};
|
|
8
|
-
use common_macros::{contract_impl,
|
|
8
|
+
use common_macros::{contract_impl, lz_contract};
|
|
9
9
|
use endpoint_v2::{FeeRecipient, LayerZeroEndpointV2Client, Origin};
|
|
10
10
|
use message_lib_common::interfaces::ILayerZeroExecutor;
|
|
11
|
-
use soroban_sdk::{
|
|
12
|
-
use utils::option_ext::OptionExt;
|
|
13
|
-
use utils::upgradeable::UpgradeableInternal;
|
|
11
|
+
use soroban_sdk::{token::TokenClient, vec, Address, Bytes, BytesN, Env, Vec};
|
|
12
|
+
use utils::{option_ext::OptionExt, upgradeable::UpgradeableInternal};
|
|
14
13
|
use worker::{
|
|
15
14
|
assert_acl, assert_not_paused, assert_supported_message_lib, init_worker, require_admin_auth, set_admin_by_owner,
|
|
16
15
|
ExecutorFeeLibClient, FeeParams, Worker,
|
|
17
16
|
};
|
|
18
17
|
|
|
19
18
|
/// LayerZero Executor contract for cross-chain message execution.
|
|
20
|
-
#[
|
|
21
|
-
#[ttl_configurable]
|
|
22
|
-
#[upgradeable]
|
|
23
|
-
#[ownable]
|
|
19
|
+
#[lz_contract(upgradeable)]
|
|
24
20
|
pub struct LzExecutor;
|
|
25
21
|
|
|
26
22
|
#[contract_impl]
|
|
27
23
|
impl LzExecutor {
|
|
28
24
|
/// Initializes the executor contract.
|
|
29
25
|
///
|
|
30
|
-
/// Sets up ownership, worker configuration, endpoint address
|
|
26
|
+
/// Sets up ownership, worker configuration, and endpoint address.
|
|
31
27
|
///
|
|
32
28
|
/// # Arguments
|
|
33
29
|
/// * `endpoint` - LayerZero Endpoint V2 contract address
|
|
@@ -36,7 +32,6 @@ impl LzExecutor {
|
|
|
36
32
|
/// * `message_libs` - Supported message library addresses (e.g., ULN302)
|
|
37
33
|
/// * `price_feed` - Price feed contract address for fee calculations
|
|
38
34
|
/// * `default_multiplier_bps` - Default fee multiplier in basis points (10000 = 1x)
|
|
39
|
-
/// * `whitelist` - Initial whitelisted (contract, function) pairs for authorization
|
|
40
35
|
/// * `worker_fee_lib` - Worker fee library contract address
|
|
41
36
|
/// * `deposit_address` - Address to receive fee payments
|
|
42
37
|
pub fn __constructor(
|
|
@@ -47,7 +42,6 @@ impl LzExecutor {
|
|
|
47
42
|
message_libs: &Vec<Address>,
|
|
48
43
|
price_feed: &Address,
|
|
49
44
|
default_multiplier_bps: u32,
|
|
50
|
-
whitelist: &Vec<(Address, Symbol)>,
|
|
51
45
|
worker_fee_lib: &Address,
|
|
52
46
|
deposit_address: &Address,
|
|
53
47
|
) {
|
|
@@ -62,26 +56,6 @@ impl LzExecutor {
|
|
|
62
56
|
deposit_address,
|
|
63
57
|
);
|
|
64
58
|
ExecutorStorage::set_endpoint(env, endpoint);
|
|
65
|
-
|
|
66
|
-
// Set initial whitelisted functions
|
|
67
|
-
for (contract, fn_name) in whitelist.iter() {
|
|
68
|
-
ExecutorStorage::set_whitelisted_fn(env, &contract, &fn_name, &true);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/// Sets whether a (contract, function) pair is whitelisted.
|
|
73
|
-
/// When `allowed` is false, the entry is removed from storage to save space.
|
|
74
|
-
///
|
|
75
|
-
/// Only the contract owner can call this function.
|
|
76
|
-
#[only_owner]
|
|
77
|
-
pub fn set_whitelisted_fn(env: &Env, contract: &Address, fn_name: &Symbol, allowed: bool) {
|
|
78
|
-
let value = if allowed { Some(true) } else { None };
|
|
79
|
-
ExecutorStorage::set_or_remove_whitelisted_fn(env, contract, fn_name, &value);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/// Returns whether a (contract, function) pair is whitelisted.
|
|
83
|
-
pub fn is_whitelisted_fn(env: &Env, contract: &Address, fn_name: &Symbol) -> bool {
|
|
84
|
-
ExecutorStorage::has_whitelisted_fn(env, contract, fn_name)
|
|
85
59
|
}
|
|
86
60
|
|
|
87
61
|
/// Withdraws a token from the contract to a specified address.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
use common_macros::storage;
|
|
2
|
-
use soroban_sdk::
|
|
2
|
+
use soroban_sdk::Address;
|
|
3
3
|
|
|
4
4
|
use crate::DstConfig;
|
|
5
5
|
|
|
6
6
|
/// Storage keys for the Executor contract.
|
|
7
7
|
///
|
|
8
8
|
/// Manages persistent storage for destination configurations and instance storage
|
|
9
|
-
/// for the endpoint address
|
|
9
|
+
/// for the endpoint address.
|
|
10
10
|
#[storage]
|
|
11
11
|
pub enum ExecutorStorage {
|
|
12
12
|
/// Destination chain configuration indexed by endpoint ID.
|
|
@@ -21,11 +21,4 @@ pub enum ExecutorStorage {
|
|
|
21
21
|
/// Used for receive-flow operations to interact with the endpoint.
|
|
22
22
|
#[instance(Address)]
|
|
23
23
|
Endpoint,
|
|
24
|
-
|
|
25
|
-
/// Whitelisted function for a specific contract.
|
|
26
|
-
///
|
|
27
|
-
/// Only whitelisted (contract, function) pairs can trigger Executor authorization.
|
|
28
|
-
/// This allows fine-grained control over which contracts can call which functions.
|
|
29
|
-
#[instance(bool)]
|
|
30
|
-
WhitelistedFn { contract: Address, fn_name: Symbol },
|
|
31
24
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
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
4
|
use utils::upgradeable::UpgradeableInternal;
|
|
5
5
|
use worker::{FeeParams, IExecutorFeeLib, LayerZeroPriceFeedClient};
|
|
6
6
|
|
|
@@ -25,10 +25,7 @@ const NATIVE_DECIMALS_RATE: u128 = 10_000_000;
|
|
|
25
25
|
/// Provides fee calculation logic based on executor options, destination configuration,
|
|
26
26
|
/// and current gas prices from the price feed. Handles fee multipliers, margins, and
|
|
27
27
|
/// native token value conversions.
|
|
28
|
-
#[
|
|
29
|
-
#[ownable]
|
|
30
|
-
#[ttl_configurable]
|
|
31
|
-
#[upgradeable]
|
|
28
|
+
#[lz_contract(upgradeable)]
|
|
32
29
|
pub struct ExecutorFeeLib;
|
|
33
30
|
|
|
34
31
|
#[contract_impl]
|
|
@@ -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
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
use common_macros::{contract_impl,
|
|
2
|
-
use soroban_sdk::{assert_with_error,
|
|
1
|
+
use common_macros::{contract_impl, lz_contract, only_auth};
|
|
2
|
+
use soroban_sdk::{assert_with_error, panic_with_error, Address, Env, Vec};
|
|
3
3
|
use utils::upgradeable::UpgradeableInternal;
|
|
4
4
|
use worker::{FeeEstimate, ILayerZeroPriceFeed, Price};
|
|
5
5
|
|
|
@@ -10,10 +10,7 @@ use crate::{
|
|
|
10
10
|
types::{ArbitrumPriceExt, ModelType, SetEidToModelTypeParam, UpdatePrice, UpdatePriceExt},
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
#[
|
|
14
|
-
#[ownable]
|
|
15
|
-
#[ttl_configurable]
|
|
16
|
-
#[upgradeable]
|
|
13
|
+
#[lz_contract(upgradeable)]
|
|
17
14
|
pub struct LzPriceFeed;
|
|
18
15
|
|
|
19
16
|
#[contract_impl]
|
|
@@ -79,7 +76,7 @@ impl LzPriceFeed {
|
|
|
79
76
|
// ========================================================================
|
|
80
77
|
|
|
81
78
|
/// Set price updater status (owner only)
|
|
82
|
-
#[
|
|
79
|
+
#[only_auth]
|
|
83
80
|
pub fn set_price_updater(env: &Env, updater: &Address, active: bool) {
|
|
84
81
|
if active {
|
|
85
82
|
PriceFeedStorage::set_price_updater(env, updater, &true);
|
|
@@ -90,20 +87,20 @@ impl LzPriceFeed {
|
|
|
90
87
|
}
|
|
91
88
|
|
|
92
89
|
/// Set the price ratio denominator (owner only)
|
|
93
|
-
#[
|
|
90
|
+
#[only_auth]
|
|
94
91
|
pub fn set_price_ratio_denominator(env: &Env, denominator: u128) {
|
|
95
92
|
assert_with_error!(env, denominator > 0, PriceFeedError::InvalidDenominator);
|
|
96
93
|
PriceFeedStorage::set_price_ratio_denominator(env, &denominator);
|
|
97
94
|
}
|
|
98
95
|
|
|
99
96
|
/// Set the Arbitrum compression percentage (owner only)
|
|
100
|
-
#[
|
|
97
|
+
#[only_auth]
|
|
101
98
|
pub fn set_arbitrum_compression_percent(env: &Env, compression_percent: u128) {
|
|
102
99
|
PriceFeedStorage::set_arbitrum_compression_percent(env, &compression_percent);
|
|
103
100
|
}
|
|
104
101
|
|
|
105
102
|
/// Set the fee model type for destination EIDs (owner only)
|
|
106
|
-
#[
|
|
103
|
+
#[only_auth]
|
|
107
104
|
pub fn set_eid_to_model_type(env: &Env, params: &Vec<SetEidToModelTypeParam>) {
|
|
108
105
|
for param in params.iter() {
|
|
109
106
|
PriceFeedStorage::set_eid_to_model_type(env, param.dst_eid, ¶m.model_type);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
use super::setup::{bare_worker, TestSetup, WorkerTester};
|
|
2
|
-
use crate::
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
use crate::{
|
|
3
|
+
events::{
|
|
4
|
+
Paused, SetAdmin, SetAllowlist, SetDefaultMultiplierBps, SetDenylist, SetDepositAddress, SetPriceFeed,
|
|
5
|
+
SetSupportedMessageLib, SetSupportedOptionTypes, SetWorkerFeeLib, Unpaused,
|
|
6
|
+
},
|
|
7
|
+
init_worker,
|
|
5
8
|
};
|
|
6
|
-
use
|
|
7
|
-
use soroban_sdk::testutils::Address as _;
|
|
8
|
-
use soroban_sdk::{vec, Address, Bytes, Env, IntoVal};
|
|
9
|
+
use soroban_sdk::{testutils::Address as _, vec, Address, Bytes, Env, IntoVal};
|
|
9
10
|
use utils::testing_utils::assert_event;
|
|
10
11
|
|
|
11
12
|
// pause
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
use soroban_sdk::{assert_with_error, contracttrait, panic_with_error, Address, Bytes, Env, Vec};
|
|
2
|
-
use utils::{
|
|
3
|
-
option_ext::OptionExt,
|
|
4
|
-
ownable::{enforce_owner_auth, require_owner_auth, Ownable},
|
|
5
|
-
};
|
|
6
|
-
|
|
7
1
|
use crate::{
|
|
8
2
|
errors::WorkerError,
|
|
9
3
|
events::{
|
|
@@ -12,10 +6,20 @@ use crate::{
|
|
|
12
6
|
},
|
|
13
7
|
storage::WorkerStorage,
|
|
14
8
|
};
|
|
9
|
+
use common_macros::contract_trait;
|
|
10
|
+
use soroban_sdk::{assert_with_error, panic_with_error, Address, Bytes, Env, Vec};
|
|
11
|
+
use utils::{
|
|
12
|
+
auth::{enforce_auth, require_auth, Auth},
|
|
13
|
+
option_ext::OptionExt,
|
|
14
|
+
};
|
|
15
15
|
|
|
16
16
|
/// Worker interface providing common functionality for LayerZero workers.
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
///
|
|
18
|
+
/// Requires the `Auth` trait to be implemented, which can be provided by either:
|
|
19
|
+
/// - `#[ownable]` macro for single-owner contracts (e.g., Executor)
|
|
20
|
+
/// - `Multisig` trait for multisig-controlled contracts (e.g., DVN)
|
|
21
|
+
#[contract_trait]
|
|
22
|
+
pub trait Worker: Auth {
|
|
19
23
|
// ========================================================================
|
|
20
24
|
// Manager Functions
|
|
21
25
|
// ========================================================================
|
|
@@ -28,14 +32,14 @@ pub trait Worker: Ownable {
|
|
|
28
32
|
/// # Arguments
|
|
29
33
|
/// * `paused` - `true` to pause, `false` to unpause
|
|
30
34
|
fn set_paused(env: &Env, paused: bool) {
|
|
31
|
-
let
|
|
35
|
+
let authorizer = enforce_auth::<Self>(env);
|
|
32
36
|
assert_with_error!(env, Self::paused(env) != paused, WorkerError::PauseStatusUnchanged);
|
|
33
37
|
|
|
34
38
|
WorkerStorage::set_paused(env, &paused);
|
|
35
39
|
if paused {
|
|
36
|
-
Paused { pauser:
|
|
40
|
+
Paused { pauser: authorizer }.publish(env);
|
|
37
41
|
} else {
|
|
38
|
-
Unpaused { unpauser:
|
|
42
|
+
Unpaused { unpauser: authorizer }.publish(env);
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
|
|
@@ -48,7 +52,7 @@ pub trait Worker: Ownable {
|
|
|
48
52
|
/// * `message_lib` - The message library contract address
|
|
49
53
|
/// * `supported` - `true` to add support, `false` to remove support
|
|
50
54
|
fn set_supported_message_lib(env: &Env, message_lib: &Address, supported: bool) {
|
|
51
|
-
|
|
55
|
+
require_auth::<Self>(env);
|
|
52
56
|
set_message_lib_no_auth::<Self>(env, message_lib, supported);
|
|
53
57
|
}
|
|
54
58
|
|
|
@@ -62,7 +66,7 @@ pub trait Worker: Ownable {
|
|
|
62
66
|
/// * `oapp` - The OApp contract address
|
|
63
67
|
/// * `allowed` - `true` to add to allowlist, `false` to remove
|
|
64
68
|
fn set_allowlist(env: &Env, oapp: &Address, allowed: bool) {
|
|
65
|
-
|
|
69
|
+
require_auth::<Self>(env);
|
|
66
70
|
|
|
67
71
|
let is_on_list = Self::is_on_allowlist(env, oapp);
|
|
68
72
|
if allowed {
|
|
@@ -92,7 +96,7 @@ pub trait Worker: Ownable {
|
|
|
92
96
|
/// * `oapp` - The OApp contract address
|
|
93
97
|
/// * `denied` - `true` to add to denylist, `false` to remove
|
|
94
98
|
fn set_denylist(env: &Env, oapp: &Address, denied: bool) {
|
|
95
|
-
|
|
99
|
+
require_auth::<Self>(env);
|
|
96
100
|
let is_on_list = Self::is_on_denylist(env, oapp);
|
|
97
101
|
|
|
98
102
|
if denied {
|
|
@@ -369,13 +373,13 @@ pub fn assert_supported_message_lib<T: Worker>(env: &Env, message_lib: &Address)
|
|
|
369
373
|
// Admin Setter Functions with authentication
|
|
370
374
|
// ============================================================================================
|
|
371
375
|
|
|
372
|
-
/// Sets admin status for an address by owner.
|
|
376
|
+
/// Sets admin status for an address by authorizer (owner/multisig).
|
|
373
377
|
///
|
|
374
378
|
/// # Arguments
|
|
375
379
|
/// * `admin` - The address to set admin status for
|
|
376
380
|
/// * `active` - `true` to add admin, `false` to remove
|
|
377
381
|
pub fn set_admin_by_owner<T: Worker>(env: &Env, admin: &Address, active: bool) {
|
|
378
|
-
|
|
382
|
+
require_auth::<T>(env);
|
|
379
383
|
set_admin_no_auth::<T>(env, admin, active);
|
|
380
384
|
}
|
|
381
385
|
|
package/package.json
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/protocol-stellar-v2",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.19",
|
|
4
4
|
"private": false,
|
|
5
5
|
"devDependencies": {
|
|
6
6
|
"@types/node": "^22.18.6",
|
|
7
7
|
"tsx": "^4.19.3",
|
|
8
8
|
"typescript": "^5.8.2",
|
|
9
|
-
"@layerzerolabs/common-node-utils": "0.2.
|
|
10
|
-
"@layerzerolabs/vm-tooling-stellar": "0.2.
|
|
9
|
+
"@layerzerolabs/common-node-utils": "0.2.19",
|
|
10
|
+
"@layerzerolabs/vm-tooling-stellar": "0.2.19"
|
|
11
11
|
},
|
|
12
12
|
"publishConfig": {
|
|
13
13
|
"access": "restricted",
|
|
14
14
|
"registry": "https://registry.npmjs.org/"
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
|
-
"build": "pnpm build:contracts && pnpm generate:sdk",
|
|
18
|
-
"build:contracts": "pnpm exec lz-tool stellar contract build",
|
|
17
|
+
"build": "pnpm build:contracts:sandbox && pnpm generate:sdk",
|
|
18
|
+
"build:contracts:mainnet": "pnpm exec lz-tool stellar contract build --features mainnet",
|
|
19
|
+
"build:contracts:sandbox": "pnpm exec lz-tool stellar contract build --features sandbox",
|
|
20
|
+
"build:contracts:testnet": "pnpm exec lz-tool stellar contract build --features testnet",
|
|
19
21
|
"format": "pnpm exec lz-tool --script \"cargo fmt\" stellar",
|
|
20
22
|
"generate:sdk": "pnpm exec lz-tool --script \"cargo run -p ts-bindings-gen\" stellar",
|
|
21
23
|
"lint": "pnpm exec lz-tool --script \"cargo clippy -- -D warnings\" stellar",
|