@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.21
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 +795 -791
- package/.turbo/turbo-lint.log +325 -155
- package/.turbo/turbo-test.log +1398 -1277
- package/Cargo.lock +122 -111
- package/Cargo.toml +32 -16
- package/contracts/common-macros/Cargo.toml +7 -7
- package/contracts/common-macros/src/auth.rs +18 -37
- package/contracts/common-macros/src/contract_ttl.rs +18 -7
- package/contracts/common-macros/src/lib.rs +31 -14
- package/contracts/common-macros/src/lz_contract.rs +38 -7
- package/contracts/common-macros/src/storage.rs +251 -292
- package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -14
- package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
- package/contracts/common-macros/src/ttl_configurable.rs +2 -10
- package/contracts/common-macros/src/ttl_extendable.rs +2 -10
- package/contracts/common-macros/src/upgradeable.rs +61 -26
- package/contracts/common-macros/src/utils.rs +0 -9
- package/contracts/endpoint-v2/src/lib.rs +3 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
- package/contracts/layerzero-views/Cargo.toml +0 -1
- package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
- package/contracts/macro-integration-tests/Cargo.toml +5 -15
- package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
- package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
- package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
- package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
- package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
- package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
- package/contracts/message-libs/treasury/Cargo.toml +0 -2
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
- package/contracts/message-libs/uln-302/src/events.rs +4 -0
- package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +21 -67
- 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 +2 -2
- package/contracts/oapps/counter/Cargo.toml +5 -6
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
- package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
- package/contracts/oapps/oapp/src/errors.rs +1 -1
- package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
- package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
- package/contracts/oapps/oapp/src/lib.rs +1 -0
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
- package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
- package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
- package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
- package/contracts/oapps/oapp/src/tests/oapp_core.rs +223 -0
- package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +240 -0
- package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +381 -0
- package/contracts/oapps/oapp/src/tests/oapp_sender.rs +569 -0
- package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
- package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
- package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
- package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
- package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
- package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
- package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
- package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +153 -75
- package/contracts/oapps/oft/src/extensions/pausable.rs +61 -12
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +198 -134
- package/contracts/oapps/oft/src/oft.rs +45 -50
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +4 -26
- package/contracts/oapps/oft-core/Cargo.toml +1 -4
- package/contracts/oapps/oft-core/integration-tests/setup.rs +3 -3
- package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
- package/contracts/oapps/oft-core/src/errors.rs +3 -2
- package/contracts/oapps/oft-core/src/events.rs +6 -0
- package/contracts/oapps/oft-core/src/lib.rs +1 -1
- package/contracts/oapps/oft-core/src/oft_core.rs +341 -246
- package/contracts/oapps/oft-core/src/storage.rs +7 -3
- package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
- package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
- package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
- package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
- package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +61 -16
- package/contracts/upgrader/src/lib.rs +30 -57
- 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 +44 -35
- package/contracts/utils/Cargo.toml +0 -1
- package/contracts/utils/src/buffer_reader.rs +1 -0
- package/contracts/utils/src/errors.rs +4 -2
- package/contracts/utils/src/multisig.rs +17 -8
- package/contracts/utils/src/ownable.rs +6 -6
- package/contracts/utils/src/testing_utils.rs +124 -54
- package/contracts/utils/src/tests/multisig.rs +12 -12
- package/contracts/utils/src/tests/ownable.rs +6 -6
- package/contracts/utils/src/tests/testing_utils.rs +50 -167
- package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
- package/contracts/utils/src/tests/upgradeable.rs +372 -175
- package/contracts/utils/src/ttl_configurable.rs +13 -7
- package/contracts/utils/src/upgradeable.rs +48 -23
- package/contracts/workers/dvn/Cargo.toml +6 -6
- package/contracts/workers/dvn/src/auth.rs +12 -42
- package/contracts/workers/dvn/src/dvn.rs +15 -40
- package/contracts/workers/dvn/src/errors.rs +0 -1
- package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
- package/contracts/workers/dvn/src/lib.rs +4 -3
- package/contracts/workers/dvn/src/tests/auth.rs +1 -1
- package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
- package/contracts/workers/dvn/src/tests/setup.rs +5 -9
- package/contracts/workers/dvn-fee-lib/Cargo.toml +2 -2
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +38 -22
- package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +17 -16
- package/contracts/workers/executor/Cargo.toml +4 -0
- package/contracts/workers/executor/src/executor.rs +15 -36
- package/contracts/workers/executor/src/lib.rs +2 -2
- package/contracts/workers/executor/src/tests/auth.rs +394 -0
- package/contracts/workers/executor/src/tests/executor.rs +410 -0
- package/contracts/workers/executor/src/tests/mod.rs +3 -0
- package/contracts/workers/executor/src/tests/setup.rs +250 -0
- package/contracts/workers/executor-fee-lib/Cargo.toml +7 -1
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +62 -15
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
- package/contracts/workers/executor-fee-lib/src/lib.rs +11 -2
- package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
- package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
- package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
- package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
- package/contracts/workers/executor-helper/Cargo.toml +0 -1
- package/contracts/workers/executor-helper/src/lib.rs +3 -0
- package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
- package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
- package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
- package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
- package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
- package/contracts/workers/price-feed/Cargo.toml +7 -1
- package/contracts/workers/price-feed/src/events.rs +1 -1
- package/contracts/workers/price-feed/src/lib.rs +12 -4
- package/contracts/workers/price-feed/src/price_feed.rs +5 -21
- package/contracts/workers/price-feed/src/storage.rs +1 -1
- package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
- package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
- package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
- package/contracts/workers/price-feed/src/types.rs +1 -1
- package/contracts/workers/worker/src/errors.rs +1 -4
- package/contracts/workers/worker/src/lib.rs +0 -2
- package/contracts/workers/worker/src/storage.rs +32 -29
- package/contracts/workers/worker/src/tests/setup.rs +2 -8
- package/contracts/workers/worker/src/tests/worker.rs +96 -74
- package/contracts/workers/worker/src/worker.rs +75 -75
- package/docs/error-spec.md +55 -0
- package/docs/layerzero-v2-on-stellar.md +447 -0
- package/docs/oapp-guide.md +212 -0
- package/docs/oft-guide.md +314 -0
- package/package.json +3 -3
- package/sdk/.turbo/turbo-test.log +268 -263
- package/sdk/dist/generated/bml.d.ts +12 -4
- package/sdk/dist/generated/bml.js +9 -7
- package/sdk/dist/generated/counter.d.ts +306 -298
- package/sdk/dist/generated/counter.js +48 -46
- package/sdk/dist/generated/dvn.d.ts +450 -411
- package/sdk/dist/generated/dvn.js +66 -64
- package/sdk/dist/generated/dvn_fee_lib.d.ts +294 -338
- package/sdk/dist/generated/dvn_fee_lib.js +33 -64
- package/sdk/dist/generated/endpoint.d.ts +108 -100
- package/sdk/dist/generated/endpoint.js +21 -19
- package/sdk/dist/generated/executor.d.ts +414 -370
- package/sdk/dist/generated/executor.js +58 -55
- package/sdk/dist/generated/executor_fee_lib.d.ts +333 -377
- package/sdk/dist/generated/executor_fee_lib.js +34 -65
- package/sdk/dist/generated/executor_helper.d.ts +26 -190
- package/sdk/dist/generated/executor_helper.js +23 -28
- package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
- package/sdk/dist/generated/layerzero_view.js +294 -0
- package/sdk/dist/generated/oft.d.ts +408 -385
- package/sdk/dist/generated/oft.js +89 -92
- package/sdk/dist/generated/price_feed.d.ts +385 -429
- package/sdk/dist/generated/price_feed.js +50 -81
- package/sdk/dist/generated/sml.d.ts +108 -100
- package/sdk/dist/generated/sml.js +21 -19
- package/sdk/dist/generated/treasury.d.ts +108 -100
- package/sdk/dist/generated/treasury.js +21 -19
- package/sdk/dist/generated/uln302.d.ts +108 -100
- package/sdk/dist/generated/uln302.js +23 -21
- package/sdk/dist/generated/upgrader.d.ts +189 -18
- package/sdk/dist/generated/upgrader.js +84 -4
- package/sdk/dist/index.d.ts +1 -0
- package/sdk/dist/index.js +2 -0
- package/sdk/package.json +1 -1
- package/sdk/src/index.ts +3 -0
- package/sdk/test/oft-sml.test.ts +4 -4
- package/sdk/test/suites/localnet.ts +84 -20
- package/sdk/test/upgrader.test.ts +2 -3
- package/tools/ts-bindings-gen/src/main.rs +2 -1
- package/contracts/ERROR_SPEC.md +0 -44
- package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -175
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -212
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -153
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -294
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
|
@@ -4,8 +4,8 @@ extern crate std;
|
|
|
4
4
|
|
|
5
5
|
use crate::{dvn::LzDVN, tests::key_pair::KeyPair};
|
|
6
6
|
use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, vec, Address, BytesN, Env, Vec};
|
|
7
|
-
use utils::multisig::MultisigClient;
|
|
8
7
|
use std::vec::Vec as StdVec;
|
|
8
|
+
use utils::multisig::MultisigClient;
|
|
9
9
|
|
|
10
10
|
pub const VID: u32 = 1;
|
|
11
11
|
pub const DEFAULT_MULTIPLIER_BPS: u32 = 10000;
|
|
@@ -33,9 +33,7 @@ impl<'a> TestSetup<'a> {
|
|
|
33
33
|
let key_pairs: StdVec<KeyPair> = (0..signer_count).map(|_| KeyPair::generate()).collect();
|
|
34
34
|
|
|
35
35
|
let mut signers: Vec<BytesN<20>> = vec![&env];
|
|
36
|
-
|
|
37
|
-
signers.push_back(kp.signer(&env));
|
|
38
|
-
}
|
|
36
|
+
key_pairs.iter().for_each(|kp| signers.push_back(kp.signer(&env)));
|
|
39
37
|
|
|
40
38
|
let admins: Vec<Address> = vec![&env, Address::generate(&env)];
|
|
41
39
|
let supported_msglibs: Vec<Address> = vec![&env, Address::generate(&env)];
|
|
@@ -71,16 +69,14 @@ impl<'a> TestSetup<'a> {
|
|
|
71
69
|
let key_pairs: StdVec<KeyPair> = (0..signer_count).map(|_| KeyPair::generate()).collect();
|
|
72
70
|
|
|
73
71
|
let mut signers: Vec<BytesN<20>> = vec![&env];
|
|
74
|
-
|
|
75
|
-
signers.push_back(kp.signer(&env));
|
|
76
|
-
}
|
|
72
|
+
key_pairs.iter().for_each(|kp| signers.push_back(kp.signer(&env)));
|
|
77
73
|
|
|
78
74
|
let mut admins: Vec<Address> = vec![&env, Address::generate(&env)];
|
|
79
|
-
|
|
75
|
+
admin_bytes.into_iter().for_each(|bytes| {
|
|
80
76
|
let bytes_n = BytesN::from_array(&env, &bytes);
|
|
81
77
|
let addr = Address::from_payload(&env, AddressPayload::AccountIdPublicKeyEd25519(bytes_n));
|
|
82
78
|
admins.push_back(addr);
|
|
83
|
-
}
|
|
79
|
+
});
|
|
84
80
|
|
|
85
81
|
let supported_msglibs: Vec<Address> = vec![&env, Address::generate(&env)];
|
|
86
82
|
let price_feed: Address = Address::generate(&env);
|
|
@@ -14,11 +14,11 @@ crate-type = ["cdylib", "rlib"]
|
|
|
14
14
|
doctest = false
|
|
15
15
|
|
|
16
16
|
[dependencies]
|
|
17
|
+
cfg-if = { workspace = true }
|
|
17
18
|
soroban-sdk = { workspace = true }
|
|
18
19
|
common-macros = { workspace = true }
|
|
19
|
-
message-lib-common = { workspace = true }
|
|
20
20
|
utils = { workspace = true }
|
|
21
|
-
|
|
21
|
+
fee-lib-interfaces = { workspace = true }
|
|
22
22
|
|
|
23
23
|
[dev-dependencies]
|
|
24
24
|
soroban-sdk = { workspace = true, features = ["testutils"] }
|
|
@@ -1,34 +1,33 @@
|
|
|
1
1
|
use crate::errors::DvnFeeLibError;
|
|
2
2
|
use common_macros::{contract_impl, lz_contract};
|
|
3
|
+
use fee_lib_interfaces::{DvnFeeParams, IDvnFeeLib, LayerZeroPriceFeedClient};
|
|
3
4
|
use soroban_sdk::{assert_with_error, Address, Env};
|
|
4
|
-
use utils::upgradeable::UpgradeableInternal;
|
|
5
|
-
use worker::{DvnFeeParams, IDvnFeeLib, LayerZeroPriceFeedClient};
|
|
6
5
|
|
|
7
6
|
// ============================================================================
|
|
8
7
|
// Constants
|
|
9
8
|
// ============================================================================
|
|
10
9
|
|
|
11
10
|
/// Basis points denominator (10000 = 100%).
|
|
12
|
-
|
|
11
|
+
const BPS_BASE: i128 = 10000;
|
|
13
12
|
|
|
14
13
|
/// Fixed bytes for execute function call.
|
|
15
|
-
|
|
14
|
+
const EXECUTE_FIXED_BYTES: u32 = 260;
|
|
16
15
|
|
|
17
16
|
/// Raw signature bytes length (65 bytes: 64 for signature + 1 for recovery ID).
|
|
18
|
-
|
|
17
|
+
const SIGNATURE_RAW_BYTES: u32 = 65;
|
|
19
18
|
|
|
20
19
|
/// Verify function bytes (padded).
|
|
21
|
-
|
|
20
|
+
const VERIFY_BYTES: u32 = 288;
|
|
22
21
|
|
|
23
22
|
/// Native token decimal rate for XLM (10^7 stroops per XLM).
|
|
24
|
-
|
|
23
|
+
const NATIVE_DECIMALS_RATE: u128 = 10_000_000;
|
|
25
24
|
|
|
26
25
|
/// DVN fee library contract for calculating DVN verification fees.
|
|
27
26
|
///
|
|
28
27
|
/// Provides fee calculation logic based on quorum size, destination gas costs,
|
|
29
28
|
/// and current gas prices from the price feed. Handles fee multipliers and
|
|
30
29
|
/// floor margins.
|
|
31
|
-
#[lz_contract(upgradeable)]
|
|
30
|
+
#[lz_contract(upgradeable(no_migration))]
|
|
32
31
|
pub struct DvnFeeLib;
|
|
33
32
|
|
|
34
33
|
#[contract_impl]
|
|
@@ -66,18 +65,6 @@ impl IDvnFeeLib for DvnFeeLib {
|
|
|
66
65
|
}
|
|
67
66
|
}
|
|
68
67
|
|
|
69
|
-
// ============================================================================
|
|
70
|
-
// Upgradeable Implementation
|
|
71
|
-
// ============================================================================
|
|
72
|
-
|
|
73
|
-
impl UpgradeableInternal for DvnFeeLib {
|
|
74
|
-
type MigrationData = ();
|
|
75
|
-
|
|
76
|
-
fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
|
|
77
|
-
// No migration logic needed for initial upgrade capability
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
68
|
// ============================================================================
|
|
82
69
|
// Internal Helper Functions
|
|
83
70
|
// ============================================================================
|
|
@@ -96,7 +83,7 @@ impl UpgradeableInternal for DvnFeeLib {
|
|
|
96
83
|
///
|
|
97
84
|
/// # Returns
|
|
98
85
|
/// Fee with premium applied (max of multiplier fee and margin fee).
|
|
99
|
-
|
|
86
|
+
fn apply_premium(
|
|
100
87
|
env: &Env,
|
|
101
88
|
fee: i128,
|
|
102
89
|
multiplier_bps: u32,
|
|
@@ -128,7 +115,7 @@ pub(crate) fn apply_premium(
|
|
|
128
115
|
///
|
|
129
116
|
/// # Returns
|
|
130
117
|
/// Total calldata size in bytes.
|
|
131
|
-
|
|
118
|
+
fn get_call_data_size(quorum: u32) -> u32 {
|
|
132
119
|
let mut total_signature_bytes = quorum * SIGNATURE_RAW_BYTES;
|
|
133
120
|
if !total_signature_bytes.is_multiple_of(32) {
|
|
134
121
|
total_signature_bytes = total_signature_bytes - (total_signature_bytes % 32) + 32;
|
|
@@ -141,3 +128,32 @@ fn safe_u128_to_i128(env: &Env, value: u128) -> i128 {
|
|
|
141
128
|
assert_with_error!(env, value <= i128::MAX as u128, DvnFeeLibError::Overflow);
|
|
142
129
|
value as i128
|
|
143
130
|
}
|
|
131
|
+
|
|
132
|
+
/// Test-only module exposing internal items for unit and integration tests.
|
|
133
|
+
#[cfg(test)]
|
|
134
|
+
pub(crate) mod test {
|
|
135
|
+
use super::*;
|
|
136
|
+
|
|
137
|
+
// Re-export constants for testing
|
|
138
|
+
pub const BPS_BASE: i128 = super::BPS_BASE;
|
|
139
|
+
pub const EXECUTE_FIXED_BYTES: u32 = super::EXECUTE_FIXED_BYTES;
|
|
140
|
+
pub const VERIFY_BYTES: u32 = super::VERIFY_BYTES;
|
|
141
|
+
pub const NATIVE_DECIMALS_RATE: u128 = super::NATIVE_DECIMALS_RATE;
|
|
142
|
+
|
|
143
|
+
/// Test-only wrapper for apply_premium to enable testing.
|
|
144
|
+
pub fn apply_premium_for_test(
|
|
145
|
+
env: &Env,
|
|
146
|
+
fee: i128,
|
|
147
|
+
multiplier_bps: u32,
|
|
148
|
+
default_multiplier_bps: u32,
|
|
149
|
+
floor_margin_usd: u128,
|
|
150
|
+
native_price_usd: u128,
|
|
151
|
+
) -> i128 {
|
|
152
|
+
super::apply_premium(env, fee, multiplier_bps, default_multiplier_bps, floor_margin_usd, native_price_usd)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Test-only wrapper for get_call_data_size to enable testing.
|
|
156
|
+
pub fn get_call_data_size_for_test(quorum: u32) -> u32 {
|
|
157
|
+
super::get_call_data_size(quorum)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
#![no_std]
|
|
2
2
|
|
|
3
|
-
pub mod dvn_fee_lib;
|
|
4
3
|
pub mod errors;
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
cfg_if::cfg_if! {
|
|
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
|
+
mod dvn_fee_lib;
|
|
9
|
+
// Export the contract and client for testing purposes
|
|
10
|
+
pub use dvn_fee_lib::{DvnFeeLib, DvnFeeLibClient};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Re-export test helpers module for integration tests
|
|
15
|
+
#[cfg(test)]
|
|
16
|
+
use dvn_fee_lib::test;
|
|
7
17
|
|
|
8
18
|
#[cfg(test)]
|
|
9
19
|
extern crate std;
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
use crate::
|
|
2
|
-
|
|
1
|
+
use crate::test::{
|
|
2
|
+
apply_premium_for_test, get_call_data_size_for_test, BPS_BASE, EXECUTE_FIXED_BYTES, NATIVE_DECIMALS_RATE,
|
|
3
|
+
VERIFY_BYTES,
|
|
3
4
|
};
|
|
5
|
+
use crate::DvnFeeLib;
|
|
6
|
+
use fee_lib_interfaces::{DvnFeeParams, FeeEstimate, IDvnFeeLib};
|
|
4
7
|
use soroban_sdk::{contract, contractimpl, testutils::Address as _, Address, Bytes, Env};
|
|
5
|
-
use worker::{interfaces::FeeEstimate, DvnFeeParams, IDvnFeeLib};
|
|
6
8
|
|
|
7
9
|
#[test]
|
|
8
10
|
fn get_call_data_size_pads_signatures() {
|
|
9
|
-
let size =
|
|
11
|
+
let size = get_call_data_size_for_test(1);
|
|
10
12
|
assert_eq!(size, EXECUTE_FIXED_BYTES + VERIFY_BYTES + 96 + 32);
|
|
11
13
|
|
|
12
|
-
let size =
|
|
14
|
+
let size = get_call_data_size_for_test(2);
|
|
13
15
|
assert_eq!(size, EXECUTE_FIXED_BYTES + VERIFY_BYTES + 160 + 32);
|
|
14
16
|
|
|
15
|
-
let size =
|
|
17
|
+
let size = get_call_data_size_for_test(32);
|
|
16
18
|
assert_eq!(size, EXECUTE_FIXED_BYTES + VERIFY_BYTES + 2080 + 32);
|
|
17
19
|
}
|
|
18
20
|
|
|
@@ -22,7 +24,7 @@ fn apply_premium_multiplier_only_both_zero() {
|
|
|
22
24
|
let fee = 1_000i128;
|
|
23
25
|
let multiplier_bps = 15_000u32;
|
|
24
26
|
// multiplier_bps is non-zero, so default_multiplier_bps is ignored
|
|
25
|
-
let result =
|
|
27
|
+
let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, 0, 0);
|
|
26
28
|
assert_eq!(result, fee * multiplier_bps as i128 / BPS_BASE);
|
|
27
29
|
}
|
|
28
30
|
|
|
@@ -31,7 +33,7 @@ fn apply_premium_multiplier_only_native_price_zero() {
|
|
|
31
33
|
let env = Env::default();
|
|
32
34
|
let fee = 1_000i128;
|
|
33
35
|
let multiplier_bps = 15_000u32;
|
|
34
|
-
let result =
|
|
36
|
+
let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, 100, 0);
|
|
35
37
|
assert_eq!(result, fee * multiplier_bps as i128 / BPS_BASE);
|
|
36
38
|
}
|
|
37
39
|
|
|
@@ -40,7 +42,7 @@ fn apply_premium_multiplier_only_floor_margin_zero() {
|
|
|
40
42
|
let env = Env::default();
|
|
41
43
|
let fee = 1_000i128;
|
|
42
44
|
let multiplier_bps = 15_000u32;
|
|
43
|
-
let result =
|
|
45
|
+
let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, 0, NATIVE_DECIMALS_RATE);
|
|
44
46
|
assert_eq!(result, fee * multiplier_bps as i128 / BPS_BASE);
|
|
45
47
|
}
|
|
46
48
|
|
|
@@ -50,7 +52,7 @@ fn apply_premium_uses_default_when_multiplier_zero() {
|
|
|
50
52
|
let fee = 1_000i128;
|
|
51
53
|
let default_bps = 12_000u32;
|
|
52
54
|
// multiplier_bps is 0, so default_multiplier_bps should be used
|
|
53
|
-
let result =
|
|
55
|
+
let result = apply_premium_for_test(&env, fee, 0, default_bps, 0, 0);
|
|
54
56
|
assert_eq!(result, fee * default_bps as i128 / BPS_BASE);
|
|
55
57
|
}
|
|
56
58
|
|
|
@@ -62,7 +64,7 @@ fn apply_premium_floor_margin_wins() {
|
|
|
62
64
|
let floor_margin_usd = 10u128;
|
|
63
65
|
let native_price_usd = NATIVE_DECIMALS_RATE;
|
|
64
66
|
|
|
65
|
-
let result =
|
|
67
|
+
let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
|
|
66
68
|
assert_eq!(result, fee + floor_margin_usd as i128);
|
|
67
69
|
}
|
|
68
70
|
|
|
@@ -74,7 +76,7 @@ fn apply_premium_multiplier_wins_over_small_floor() {
|
|
|
74
76
|
let floor_margin_usd = 1u128;
|
|
75
77
|
let native_price_usd = NATIVE_DECIMALS_RATE;
|
|
76
78
|
|
|
77
|
-
let result =
|
|
79
|
+
let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
|
|
78
80
|
assert_eq!(result, 1_200);
|
|
79
81
|
}
|
|
80
82
|
|
|
@@ -108,8 +110,7 @@ fn get_fee_panics_when_options_not_empty() {
|
|
|
108
110
|
env.mock_all_auths();
|
|
109
111
|
let owner = Address::generate(&env);
|
|
110
112
|
let fee_lib_addr = env.register(DvnFeeLib, (&owner,));
|
|
111
|
-
let
|
|
112
|
-
options.push_back(1u8);
|
|
113
|
+
let options = Bytes::from_slice(&env, &[1u8]);
|
|
113
114
|
|
|
114
115
|
let params = DvnFeeParams {
|
|
115
116
|
sender: Address::generate(&env),
|
|
@@ -282,7 +283,7 @@ fn apply_premium_panics_on_overflow() {
|
|
|
282
283
|
let env = Env::default();
|
|
283
284
|
let fee = i128::MAX / 2;
|
|
284
285
|
let multiplier_bps = 20_000u32;
|
|
285
|
-
|
|
286
|
+
apply_premium_for_test(&env, fee, multiplier_bps, 10_000, u128::MAX, 1);
|
|
286
287
|
}
|
|
287
288
|
|
|
288
289
|
#[test]
|
|
@@ -293,6 +294,6 @@ fn apply_premium_floor_margin_truncates() {
|
|
|
293
294
|
let floor_margin_usd = 1u128;
|
|
294
295
|
let native_price_usd = NATIVE_DECIMALS_RATE * 3 / 2;
|
|
295
296
|
|
|
296
|
-
let result =
|
|
297
|
+
let result = apply_premium_for_test(&env, fee, multiplier_bps, 10_000, floor_margin_usd, native_price_usd);
|
|
297
298
|
assert_eq!(result, 0);
|
|
298
299
|
}
|
|
@@ -19,11 +19,15 @@ soroban-sdk = { workspace = true }
|
|
|
19
19
|
# workspace dependencies
|
|
20
20
|
utils = { workspace = true }
|
|
21
21
|
worker = { workspace = true }
|
|
22
|
+
fee-lib-interfaces = { workspace = true }
|
|
22
23
|
common-macros = { workspace = true }
|
|
23
24
|
message-lib-common = { workspace = true }
|
|
24
25
|
endpoint-v2 = { workspace = true, features = ["library"] }
|
|
25
26
|
|
|
26
27
|
[dev-dependencies]
|
|
27
28
|
soroban-sdk = { workspace = true, features = ["testutils"] }
|
|
29
|
+
rand = { workspace = true }
|
|
30
|
+
ed25519-dalek = { workspace = true }
|
|
31
|
+
utils = { workspace = true, features = ["testutils"] }
|
|
28
32
|
|
|
29
33
|
|
|
@@ -7,16 +7,17 @@ use crate::{
|
|
|
7
7
|
};
|
|
8
8
|
use common_macros::{contract_impl, lz_contract};
|
|
9
9
|
use endpoint_v2::{FeeRecipient, LayerZeroEndpointV2Client, Origin};
|
|
10
|
+
use fee_lib_interfaces::{ExecutorFeeLibClient, FeeParams};
|
|
10
11
|
use message_lib_common::interfaces::ILayerZeroExecutor;
|
|
11
12
|
use soroban_sdk::{token::TokenClient, vec, Address, Bytes, BytesN, Env, Vec};
|
|
12
|
-
use utils::
|
|
13
|
+
use utils::option_ext::OptionExt;
|
|
13
14
|
use worker::{
|
|
14
|
-
assert_acl, assert_not_paused, assert_supported_message_lib, init_worker, require_admin_auth,
|
|
15
|
-
|
|
15
|
+
assert_acl, assert_not_paused, assert_supported_message_lib, errors::WorkerError, init_worker, require_admin_auth,
|
|
16
|
+
Worker,
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
/// LayerZero Executor contract for cross-chain message execution.
|
|
19
|
-
#[lz_contract(upgradeable)]
|
|
20
|
+
#[lz_contract(upgradeable(no_migration))]
|
|
20
21
|
pub struct LzExecutor;
|
|
21
22
|
|
|
22
23
|
#[contract_impl]
|
|
@@ -68,17 +69,6 @@ impl LzExecutor {
|
|
|
68
69
|
require_admin_auth::<Self>(env, admin);
|
|
69
70
|
TokenClient::new(env, token).transfer(&env.current_contract_address(), to, &amount);
|
|
70
71
|
}
|
|
71
|
-
|
|
72
|
-
/// Sets admin status for an address. Requires owner authorization.
|
|
73
|
-
///
|
|
74
|
-
/// This is the multisig/quorum path for admin management.
|
|
75
|
-
///
|
|
76
|
-
/// # Arguments
|
|
77
|
-
/// * `admin` - The address to set admin status for
|
|
78
|
-
/// * `active` - Whether the address should be an admin
|
|
79
|
-
pub fn set_admin(env: &Env, admin: &Address, active: bool) {
|
|
80
|
-
set_admin_by_owner::<Self>(env, admin, active);
|
|
81
|
-
}
|
|
82
72
|
}
|
|
83
73
|
|
|
84
74
|
// ============================================================================
|
|
@@ -91,9 +81,7 @@ impl IExecutor for LzExecutor {
|
|
|
91
81
|
fn set_dst_config(env: &Env, admin: &Address, params: &Vec<SetDstConfigParam>) {
|
|
92
82
|
require_admin_auth::<Self>(env, admin);
|
|
93
83
|
|
|
94
|
-
|
|
95
|
-
ExecutorStorage::set_dst_config(env, param.dst_eid, ¶m.dst_config);
|
|
96
|
-
}
|
|
84
|
+
params.iter().for_each(|param| ExecutorStorage::set_dst_config(env, param.dst_eid, ¶m.dst_config));
|
|
97
85
|
DstConfigSet { params: params.clone() }.publish(env);
|
|
98
86
|
}
|
|
99
87
|
|
|
@@ -121,9 +109,9 @@ impl IExecutor for LzExecutor {
|
|
|
121
109
|
|
|
122
110
|
// Transfer native tokens from admin to each receiver and track success/failure
|
|
123
111
|
let mut success = vec![env];
|
|
124
|
-
|
|
125
|
-
success.push_back(token_client.try_transfer(admin, ¶m.receiver, ¶m.amount).is_ok())
|
|
126
|
-
}
|
|
112
|
+
native_drop_params.iter().for_each(|param| {
|
|
113
|
+
success.push_back(token_client.try_transfer(admin, ¶m.receiver, ¶m.amount).is_ok())
|
|
114
|
+
});
|
|
127
115
|
|
|
128
116
|
// Emit event with transfer results
|
|
129
117
|
NativeDropApplied {
|
|
@@ -162,7 +150,8 @@ impl ILayerZeroExecutor for LzExecutor {
|
|
|
162
150
|
// `get_fee` already asserts not_paused and acl, so we don't need to do it here again
|
|
163
151
|
|
|
164
152
|
let fee = Self::get_fee(env, send_lib, sender, dst_eid, calldata_size, options);
|
|
165
|
-
|
|
153
|
+
let deposit_address = Self::deposit_address(env).unwrap_or_panic(env, WorkerError::DepositAddressNotSet);
|
|
154
|
+
FeeRecipient { amount: fee, to: deposit_address }
|
|
166
155
|
}
|
|
167
156
|
|
|
168
157
|
/// Calculates the execution fee for a cross-chain message.
|
|
@@ -178,12 +167,14 @@ impl ILayerZeroExecutor for LzExecutor {
|
|
|
178
167
|
assert_acl::<Self>(env, sender);
|
|
179
168
|
|
|
180
169
|
let dst_config = Self::dst_config(env, dst_eid).unwrap_or_panic(env, ExecutorError::EidNotSupported);
|
|
170
|
+
let price_feed = Self::price_feed(env).unwrap_or_panic(env, WorkerError::PriceFeedNotSet);
|
|
171
|
+
let worker_fee_lib = Self::worker_fee_lib(env).unwrap_or_panic(env, WorkerError::WorkerFeeLibNotSet);
|
|
181
172
|
let fee_params = FeeParams {
|
|
182
173
|
sender: sender.clone(),
|
|
183
174
|
dst_eid,
|
|
184
175
|
calldata_size,
|
|
185
176
|
options: options.clone(),
|
|
186
|
-
price_feed
|
|
177
|
+
price_feed,
|
|
187
178
|
default_multiplier_bps: Self::default_multiplier_bps(env),
|
|
188
179
|
lz_receive_base_gas: dst_config.lz_receive_base_gas,
|
|
189
180
|
lz_compose_base_gas: dst_config.lz_compose_base_gas,
|
|
@@ -192,7 +183,7 @@ impl ILayerZeroExecutor for LzExecutor {
|
|
|
192
183
|
multiplier_bps: dst_config.multiplier_bps,
|
|
193
184
|
};
|
|
194
185
|
|
|
195
|
-
ExecutorFeeLibClient::new(env, &
|
|
186
|
+
ExecutorFeeLibClient::new(env, &worker_fee_lib).get_fee(&env.current_contract_address(), &fee_params)
|
|
196
187
|
}
|
|
197
188
|
}
|
|
198
189
|
|
|
@@ -203,18 +194,6 @@ impl ILayerZeroExecutor for LzExecutor {
|
|
|
203
194
|
#[contract_impl(contracttrait)]
|
|
204
195
|
impl Worker for LzExecutor {}
|
|
205
196
|
|
|
206
|
-
// ============================================================================
|
|
207
|
-
// Upgradeable Implementation
|
|
208
|
-
// ============================================================================
|
|
209
|
-
|
|
210
|
-
impl UpgradeableInternal for LzExecutor {
|
|
211
|
-
type MigrationData = ();
|
|
212
|
-
|
|
213
|
-
fn __migrate(_env: &Env, _migration_data: &Self::MigrationData) {
|
|
214
|
-
// No migration logic needed for initial upgrade capability
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
197
|
// ============================================================================
|
|
219
198
|
// Include SubModules
|
|
220
199
|
// ============================================================================
|