@layerzerolabs/protocol-stellar-v2 0.2.8 → 0.2.10
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 +443 -302
- package/.turbo/turbo-lint.log +118 -96
- package/.turbo/turbo-test.log +853 -731
- package/Cargo.lock +120 -37
- package/Cargo.toml +8 -5
- package/contracts/common-macros/src/contract_impl.rs +44 -0
- package/contracts/common-macros/src/lib.rs +86 -40
- package/contracts/common-macros/src/ownable.rs +24 -32
- package/contracts/common-macros/src/storage.rs +95 -120
- package/contracts/common-macros/src/tests/contract_impl.rs +289 -0
- package/contracts/common-macros/src/tests/mod.rs +9 -0
- package/contracts/common-macros/src/tests/ownable.rs +151 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +85 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +30 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap +9 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +1072 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +45 -0
- package/contracts/common-macros/src/tests/storage.rs +485 -0
- package/contracts/common-macros/src/tests/test_helpers.rs +93 -0
- package/contracts/common-macros/src/tests/ttl_configurable.rs +34 -0
- package/contracts/common-macros/src/ttl_configurable.rs +31 -14
- package/contracts/common-macros/src/utils.rs +27 -0
- package/contracts/endpoint-v2/ARCHITECTURE.md +4 -4
- package/contracts/endpoint-v2/src/endpoint_v2.rs +18 -15
- package/contracts/endpoint-v2/src/interfaces/message_lib.rs +2 -3
- package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +5 -3
- package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +2 -2
- package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
- package/contracts/endpoint-v2/src/interfaces/send_lib.rs +4 -4
- package/contracts/endpoint-v2/src/lib.rs +6 -5
- package/contracts/endpoint-v2/src/message_lib_manager.rs +14 -6
- package/contracts/endpoint-v2/src/messaging_channel.rs +6 -2
- package/contracts/endpoint-v2/src/messaging_composer.rs +6 -2
- package/contracts/endpoint-v2/src/storage.rs +10 -7
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +16 -16
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +46 -46
- package/contracts/endpoint-v2/src/tests/mock.rs +2 -2
- package/contracts/endpoint-v2/src/util.rs +8 -2
- package/contracts/message-libs/block-message-lib/Cargo.toml +1 -0
- package/contracts/message-libs/block-message-lib/src/lib.rs +5 -5
- package/contracts/message-libs/message-lib-common/src/errors.rs +8 -8
- package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +0 -1
- package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +3 -3
- package/contracts/message-libs/message-lib-common/src/lib.rs +0 -2
- package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +4 -6
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +2 -2
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +11 -11
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +10 -16
- package/contracts/message-libs/simple-message-lib/src/errors.rs +0 -4
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +49 -34
- package/contracts/message-libs/simple-message-lib/src/storage.rs +3 -7
- package/contracts/message-libs/simple-message-lib/src/test.rs +3 -3
- package/contracts/message-libs/treasury/src/storage.rs +1 -2
- package/contracts/message-libs/treasury/src/tests/setup.rs +3 -2
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +0 -13
- package/contracts/message-libs/treasury/src/treasury.rs +18 -21
- package/contracts/message-libs/uln-302/Cargo.toml +1 -0
- package/contracts/message-libs/uln-302/src/interfaces/mod.rs +4 -4
- package/contracts/message-libs/uln-302/src/interfaces/{receive.rs → receive_uln.rs} +3 -3
- package/contracts/message-libs/uln-302/src/interfaces/{send.rs → send_uln.rs} +8 -80
- package/contracts/message-libs/uln-302/src/lib.rs +5 -4
- package/contracts/message-libs/uln-302/src/{receive.rs → receive_uln.rs} +20 -12
- package/contracts/message-libs/uln-302/src/{send.rs → send_uln.rs} +19 -13
- package/contracts/message-libs/uln-302/src/storage.rs +1 -2
- package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +3 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +30 -30
- package/contracts/message-libs/uln-302/src/tests/setup.rs +12 -11
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +1 -1
- package/contracts/message-libs/uln-302/src/{config_validation.rs → types.rs} +79 -11
- package/contracts/message-libs/uln-302/src/uln302.rs +15 -10
- package/contracts/oapp-macros/Cargo.toml +2 -8
- package/contracts/oapp-macros/src/lib.rs +57 -311
- package/contracts/oapp-macros/src/oapp_core.rs +23 -32
- package/contracts/oapp-macros/src/oapp_full.rs +8 -2
- package/contracts/oapp-macros/src/oapp_options_type3.rs +21 -36
- package/contracts/oapp-macros/src/oapp_receiver.rs +38 -57
- package/contracts/oapp-macros/src/oapp_sender.rs +12 -14
- package/contracts/oapp-macros/src/util.rs +14 -10
- package/contracts/oapps/counter/Cargo.toml +2 -1
- package/contracts/oapps/counter/integration_tests/utils.rs +4 -4
- package/contracts/oapps/counter/src/codec.rs +8 -9
- package/contracts/oapps/counter/src/counter.rs +156 -147
- package/contracts/oapps/counter/src/storage.rs +1 -2
- package/contracts/oapps/counter/src/tests/test_codec.rs +5 -5
- package/contracts/oapps/counter/src/tests/test_counter.rs +11 -13
- package/contracts/oapps/oapp/Cargo.toml +1 -0
- package/contracts/oapps/oapp/src/errors.rs +1 -1
- package/contracts/oapps/oapp/src/lib.rs +3 -0
- package/contracts/oapps/oapp/src/macro_tests/mod.rs +1 -0
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +312 -0
- package/contracts/oapps/oapp/src/oapp_core.rs +52 -53
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +18 -28
- package/contracts/oapps/oapp/src/oapp_receiver.rs +82 -31
- package/contracts/oapps/oapp/src/oapp_sender.rs +55 -13
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +16 -3
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +33 -8
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +6 -9
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +28 -15
- package/contracts/oapps/oft/Cargo.toml +27 -0
- package/contracts/oapps/oft/integration-tests/mod.rs +3 -0
- package/contracts/oapps/oft/integration-tests/setup.rs +320 -0
- package/contracts/oapps/oft/integration-tests/test_with_sml.rs +155 -0
- package/contracts/oapps/oft/integration-tests/utils.rs +201 -0
- package/contracts/oapps/oft/src/codec/mod.rs +2 -0
- package/contracts/oapps/oft/src/codec/oft_compose_msg_codec.rs +55 -0
- package/contracts/oapps/oft/src/codec/oft_msg_codec.rs +62 -0
- package/contracts/oapps/oft/src/constants.rs +5 -0
- package/contracts/oapps/oft/src/errors.rs +8 -0
- package/contracts/oapps/oft/src/events.rs +19 -0
- package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +23 -0
- package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
- package/contracts/oapps/oft/src/lib.rs +22 -0
- package/contracts/oapps/oft/src/macro_tests/mod.rs +2 -0
- package/contracts/oapps/oft/src/macro_tests/test_all_default.rs +41 -0
- package/contracts/oapps/oft/src/macro_tests/test_override.rs +83 -0
- package/contracts/oapps/oft/src/oft.rs +320 -0
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +50 -0
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +50 -0
- package/contracts/oapps/oft/src/oft_types/mod.rs +10 -0
- package/contracts/oapps/oft/src/storage.rs +11 -0
- package/contracts/oapps/oft/src/tests/mod.rs +13 -0
- package/contracts/oapps/oft/src/tests/test_decimals.rs +89 -0
- package/contracts/oapps/oft/src/tests/test_lz_receive.rs +282 -0
- package/contracts/oapps/oft/src/tests/test_oft_compose_msg_codec.rs +68 -0
- package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +136 -0
- package/contracts/oapps/oft/src/tests/test_oft_version.rs +13 -0
- package/contracts/oapps/oft/src/tests/test_quote_oft.rs +159 -0
- package/contracts/oapps/oft/src/tests/test_quote_send.rs +195 -0
- package/contracts/oapps/oft/src/tests/test_resolve_address.rs +37 -0
- package/contracts/oapps/oft/src/tests/test_send.rs +915 -0
- package/contracts/oapps/oft/src/tests/test_token.rs +47 -0
- package/contracts/oapps/oft/src/tests/test_utils.rs +789 -0
- package/contracts/oapps/oft/src/types.rs +38 -0
- package/contracts/oapps/oft/src/utils.rs +67 -0
- package/contracts/oapps/oft-mint-burn/Cargo.toml +26 -0
- package/contracts/oapps/oft-mint-burn/src/lib.rs +3 -0
- package/contracts/oapps/oft-mint-burn/src/oft.rs +28 -0
- package/contracts/oapps/oft-mint-burn/src/tests/mod.rs +1 -0
- package/contracts/utils/src/buffer_reader.rs +8 -9
- package/contracts/utils/src/buffer_writer.rs +11 -5
- package/contracts/utils/src/errors.rs +5 -5
- package/contracts/utils/src/ownable.rs +14 -6
- package/contracts/utils/src/testing_utils.rs +11 -1
- package/contracts/utils/src/tests/buffer_reader.rs +491 -730
- package/contracts/utils/src/tests/buffer_writer.rs +336 -148
- package/contracts/utils/src/tests/bytes_ext.rs +125 -40
- package/contracts/utils/src/tests/mod.rs +3 -0
- package/contracts/utils/src/tests/ownable.rs +379 -27
- package/contracts/utils/src/tests/test_helper.rs +47 -0
- package/contracts/utils/src/tests/testing_utils.rs +555 -0
- package/contracts/utils/src/tests/ttl.rs +421 -0
- package/contracts/utils/src/ttl.rs +29 -89
- package/contracts/workers/dvn/Cargo.toml +31 -0
- package/contracts/workers/dvn/src/auth.rs +66 -0
- package/contracts/workers/dvn/src/dvn.rs +143 -0
- package/contracts/workers/dvn/src/errors.rs +21 -0
- package/contracts/workers/dvn/src/events.rs +19 -0
- package/contracts/workers/dvn/src/interfaces/dvn.rs +12 -0
- package/contracts/workers/dvn/src/interfaces/mod.rs +5 -0
- package/contracts/workers/dvn/src/interfaces/multisig.rs +15 -0
- package/contracts/workers/dvn/src/lib.rs +24 -0
- package/contracts/workers/dvn/src/multisig.rs +127 -0
- package/contracts/workers/dvn/src/storage.rs +35 -0
- package/contracts/workers/dvn/src/tests/auth.rs +237 -0
- package/contracts/workers/dvn/src/tests/dvn.rs +349 -0
- package/contracts/workers/dvn/src/tests/key_pair.rs +66 -0
- package/contracts/workers/dvn/src/tests/mod.rs +5 -0
- package/contracts/workers/dvn/src/tests/multisig/mod.rs +3 -0
- package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +133 -0
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +108 -0
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +109 -0
- package/contracts/workers/dvn/src/tests/setup.rs +109 -0
- package/contracts/workers/dvn/src/types.rs +26 -0
- package/contracts/workers/dvn-fee-lib/Cargo.toml +24 -0
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +113 -0
- package/contracts/workers/dvn-fee-lib/src/errors.rs +8 -0
- package/contracts/workers/dvn-fee-lib/src/lib.rs +17 -0
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +282 -0
- package/contracts/workers/dvn-fee-lib/src/tests/mod.rs +1 -0
- package/contracts/workers/executor/Cargo.toml +10 -7
- package/contracts/workers/executor/src/errors.rs +8 -0
- package/contracts/workers/executor/src/events.rs +4 -7
- package/contracts/workers/executor/src/interfaces/executor.rs +72 -22
- package/contracts/workers/executor/src/interfaces/mod.rs +0 -2
- package/contracts/workers/executor/src/lib.rs +16 -7
- package/contracts/workers/executor/src/lz_executor.rs +308 -0
- package/contracts/workers/executor/src/storage.rs +24 -16
- package/contracts/workers/executor-fee-lib/Cargo.toml +22 -0
- package/contracts/workers/executor-fee-lib/src/errors.rs +15 -0
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +215 -0
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +203 -0
- package/contracts/workers/executor-fee-lib/src/lib.rs +7 -0
- package/contracts/workers/executor-helper/Cargo.toml +29 -0
- package/contracts/workers/executor-helper/src/executor_helper.rs +161 -0
- package/contracts/workers/executor-helper/src/lib.rs +11 -0
- package/contracts/workers/{worker-common → worker}/Cargo.toml +1 -4
- package/contracts/workers/worker/src/errors.rs +24 -0
- package/contracts/workers/worker/src/events.rs +62 -0
- package/contracts/workers/worker/src/interfaces/dvn_fee_lib.rs +75 -0
- package/contracts/workers/worker/src/interfaces/executor_fee_lib.rs +84 -0
- package/contracts/workers/{worker-common → worker}/src/interfaces/mod.rs +2 -2
- package/contracts/workers/worker/src/interfaces/price_feed.rs +85 -0
- package/contracts/workers/worker/src/lib.rs +14 -0
- package/contracts/workers/worker/src/storage.rs +63 -0
- package/contracts/workers/worker/src/worker.rs +459 -0
- package/package.json +3 -3
- package/sdk/dist/generated/bml.d.ts +88 -17
- package/sdk/dist/generated/bml.js +62 -16
- package/sdk/dist/generated/counter.d.ts +281 -102
- package/sdk/dist/generated/counter.js +93 -41
- package/sdk/dist/generated/endpoint.d.ts +128 -105
- package/sdk/dist/generated/endpoint.js +47 -45
- package/sdk/dist/generated/sml.d.ts +212 -69
- package/sdk/dist/generated/sml.js +103 -53
- package/sdk/dist/generated/uln302.d.ts +270 -173
- package/sdk/dist/generated/uln302.js +112 -64
- package/sdk/package.json +11 -11
- package/sdk/test/index.test.ts +147 -42
- package/sdk/test/suites/constants.ts +7 -3
- package/sdk/test/suites/deploy.ts +65 -42
- package/sdk/test/suites/localnet.ts +2 -2
- package/sdk/test/suites/scan.ts +28 -25
- package/sdk/test/utils.ts +199 -0
- package/sdk/tsconfig.json +93 -95
- package/tools/ts-bindings-gen/src/main.rs +2 -0
- package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +0 -310
- package/contracts/common-macros/src/tests.rs +0 -287
- package/contracts/oapp-macros/tests/test_macros.rs +0 -522
- package/contracts/workers/executor/src/executor.rs +0 -347
- package/contracts/workers/executor/src/interfaces/types.rs +0 -51
- package/contracts/workers/worker-common/src/constants.rs +0 -17
- package/contracts/workers/worker-common/src/errors.rs +0 -6
- package/contracts/workers/worker-common/src/events.rs +0 -34
- package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +0 -35
- package/contracts/workers/worker-common/src/interfaces/price_feed.rs +0 -40
- package/contracts/workers/worker-common/src/interfaces/worker.rs +0 -60
- package/contracts/workers/worker-common/src/lib.rs +0 -19
- package/contracts/workers/worker-common/src/storage.rs +0 -32
- package/contracts/workers/worker-common/src/worker_common.rs +0 -166
|
@@ -2,20 +2,20 @@ use crate::tests::endpoint_setup::setup;
|
|
|
2
2
|
use soroban_sdk::{testutils::Address as _, Address};
|
|
3
3
|
use utils::{
|
|
4
4
|
errors::TtlError,
|
|
5
|
-
ttl::{TtlConfig,
|
|
5
|
+
ttl::{TtlConfig, TtlConfigStorage},
|
|
6
6
|
};
|
|
7
7
|
|
|
8
8
|
fn ttl_defaults(env: &soroban_sdk::Env, contract: &Address) -> (TtlConfig, TtlConfig) {
|
|
9
9
|
env.as_contract(contract, || {
|
|
10
10
|
(
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
TtlConfigStorage::instance(env).expect("instance config should exist"),
|
|
12
|
+
TtlConfigStorage::persistent(env).expect("persistent config should exist"),
|
|
13
13
|
)
|
|
14
14
|
})
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
#[test]
|
|
18
|
-
fn
|
|
18
|
+
fn test_set_ttl_configs_success() {
|
|
19
19
|
let context = setup();
|
|
20
20
|
let env = &context.env;
|
|
21
21
|
let endpoint = &context.endpoint_client;
|
|
@@ -30,8 +30,8 @@ fn test_set_ttl_config_success() {
|
|
|
30
30
|
let instance_config = Some(TtlConfig::new(instance_threshold, instance_extend_to));
|
|
31
31
|
let persistent_config = Some(TtlConfig::new(persistent_threshold, persistent_extend_to));
|
|
32
32
|
|
|
33
|
-
context.mock_owner_auth("
|
|
34
|
-
endpoint.
|
|
33
|
+
context.mock_owner_auth("set_ttl_configs", (&instance_config, &persistent_config));
|
|
34
|
+
endpoint.set_ttl_configs(&instance_config, &persistent_config);
|
|
35
35
|
|
|
36
36
|
let (stored_instance, stored_persistent) = ttl_defaults(env, &context.endpoint_client.address);
|
|
37
37
|
|
|
@@ -41,7 +41,7 @@ fn test_set_ttl_config_success() {
|
|
|
41
41
|
|
|
42
42
|
#[test]
|
|
43
43
|
#[should_panic(expected = "Error(Auth, InvalidAction)")]
|
|
44
|
-
fn
|
|
44
|
+
fn test_set_ttl_configs_requires_owner() {
|
|
45
45
|
let context = setup();
|
|
46
46
|
let env = &context.env;
|
|
47
47
|
let endpoint = &context.endpoint_client;
|
|
@@ -50,13 +50,13 @@ fn test_set_ttl_config_requires_owner() {
|
|
|
50
50
|
let instance_config = Some(TtlConfig::new(1, 2));
|
|
51
51
|
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
52
52
|
|
|
53
|
-
context.mock_auth(&attacker, "
|
|
53
|
+
context.mock_auth(&attacker, "set_ttl_configs", (&instance_config, &persistent_config));
|
|
54
54
|
|
|
55
|
-
endpoint.
|
|
55
|
+
endpoint.set_ttl_configs(&instance_config, &persistent_config);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
#[test]
|
|
59
|
-
fn
|
|
59
|
+
fn test_panic_set_ttl_configs_invalid_instance_range() {
|
|
60
60
|
let context = setup();
|
|
61
61
|
let env = &context.env;
|
|
62
62
|
let endpoint = &context.endpoint_client;
|
|
@@ -68,16 +68,16 @@ fn test_panic_set_ttl_config_invalid_instance_range() {
|
|
|
68
68
|
let instance_config = Some(TtlConfig::new(instance_threshold, instance_extend_to));
|
|
69
69
|
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
70
70
|
|
|
71
|
-
context.mock_owner_auth("
|
|
71
|
+
context.mock_owner_auth("set_ttl_configs", (&instance_config, &persistent_config));
|
|
72
72
|
|
|
73
73
|
assert_eq!(
|
|
74
|
-
endpoint.
|
|
74
|
+
endpoint.try_set_ttl_configs(&instance_config, &persistent_config).unwrap_err().unwrap(),
|
|
75
75
|
TtlError::InvalidTtlConfig.into()
|
|
76
76
|
);
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
#[test]
|
|
80
|
-
fn
|
|
80
|
+
fn test_panic_set_ttl_configs_exceeds_max_ttl() {
|
|
81
81
|
let context = setup();
|
|
82
82
|
let env = &context.env;
|
|
83
83
|
let endpoint = &context.endpoint_client;
|
|
@@ -88,10 +88,10 @@ fn test_panic_set_ttl_config_exceeds_max_ttl() {
|
|
|
88
88
|
let instance_config = Some(TtlConfig::new(1, instance_extend_to)); // Invalid: extend_to > max_ttl
|
|
89
89
|
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
90
90
|
|
|
91
|
-
context.mock_owner_auth("
|
|
91
|
+
context.mock_owner_auth("set_ttl_configs", (&instance_config, &persistent_config));
|
|
92
92
|
|
|
93
93
|
assert_eq!(
|
|
94
|
-
endpoint.
|
|
94
|
+
endpoint.try_set_ttl_configs(&instance_config, &persistent_config).unwrap_err().unwrap(),
|
|
95
95
|
TtlError::InvalidTtlConfig.into()
|
|
96
96
|
);
|
|
97
97
|
}
|
|
@@ -101,102 +101,102 @@ fn test_panic_set_ttl_config_exceeds_max_ttl() {
|
|
|
101
101
|
// ============================================================================
|
|
102
102
|
|
|
103
103
|
#[test]
|
|
104
|
-
fn
|
|
104
|
+
fn test_is_ttl_configs_frozen_default_false() {
|
|
105
105
|
let context = setup();
|
|
106
106
|
let endpoint = &context.endpoint_client;
|
|
107
107
|
|
|
108
|
-
assert!(!endpoint.
|
|
108
|
+
assert!(!endpoint.is_ttl_configs_frozen());
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
#[test]
|
|
112
|
-
fn
|
|
112
|
+
fn test_freeze_ttl_configs_success() {
|
|
113
113
|
let context = setup();
|
|
114
114
|
let endpoint = &context.endpoint_client;
|
|
115
115
|
|
|
116
|
-
assert!(!endpoint.
|
|
116
|
+
assert!(!endpoint.is_ttl_configs_frozen());
|
|
117
117
|
|
|
118
|
-
context.mock_owner_auth("
|
|
119
|
-
endpoint.
|
|
118
|
+
context.mock_owner_auth("freeze_ttl_configs", ());
|
|
119
|
+
endpoint.freeze_ttl_configs();
|
|
120
120
|
|
|
121
|
-
assert!(endpoint.
|
|
121
|
+
assert!(endpoint.is_ttl_configs_frozen());
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
#[test]
|
|
125
125
|
#[should_panic(expected = "Error(Auth, InvalidAction)")]
|
|
126
|
-
fn
|
|
126
|
+
fn test_freeze_ttl_configs_requires_owner() {
|
|
127
127
|
let context = setup();
|
|
128
128
|
let env = &context.env;
|
|
129
129
|
let endpoint = &context.endpoint_client;
|
|
130
130
|
let attacker = Address::generate(env);
|
|
131
131
|
|
|
132
|
-
context.mock_auth(&attacker, "
|
|
133
|
-
endpoint.
|
|
132
|
+
context.mock_auth(&attacker, "freeze_ttl_configs", ());
|
|
133
|
+
endpoint.freeze_ttl_configs();
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
#[test]
|
|
137
|
-
fn
|
|
137
|
+
fn test_freeze_ttl_configs_already_frozen() {
|
|
138
138
|
let context = setup();
|
|
139
139
|
let endpoint = &context.endpoint_client;
|
|
140
140
|
|
|
141
141
|
// First freeze
|
|
142
|
-
context.mock_owner_auth("
|
|
143
|
-
endpoint.
|
|
142
|
+
context.mock_owner_auth("freeze_ttl_configs", ());
|
|
143
|
+
endpoint.freeze_ttl_configs();
|
|
144
144
|
|
|
145
145
|
// Try to freeze again
|
|
146
|
-
context.mock_owner_auth("
|
|
147
|
-
assert_eq!(endpoint.
|
|
146
|
+
context.mock_owner_auth("freeze_ttl_configs", ());
|
|
147
|
+
assert_eq!(endpoint.try_freeze_ttl_configs().unwrap_err().unwrap(), TtlError::TtlConfigAlreadyFrozen.into());
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
#[test]
|
|
151
|
-
fn
|
|
151
|
+
fn test_set_ttl_configs_fails_when_frozen() {
|
|
152
152
|
let context = setup();
|
|
153
153
|
let endpoint = &context.endpoint_client;
|
|
154
154
|
|
|
155
155
|
// Freeze first
|
|
156
|
-
context.mock_owner_auth("
|
|
157
|
-
endpoint.
|
|
156
|
+
context.mock_owner_auth("freeze_ttl_configs", ());
|
|
157
|
+
endpoint.freeze_ttl_configs();
|
|
158
158
|
|
|
159
|
-
// Try to set TTL
|
|
159
|
+
// Try to set TTL configs after freeze
|
|
160
160
|
let instance_config = Some(TtlConfig::new(1, 2));
|
|
161
161
|
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
162
162
|
|
|
163
|
-
context.mock_owner_auth("
|
|
163
|
+
context.mock_owner_auth("set_ttl_configs", (&instance_config, &persistent_config));
|
|
164
164
|
assert_eq!(
|
|
165
|
-
endpoint.
|
|
165
|
+
endpoint.try_set_ttl_configs(&instance_config, &persistent_config).unwrap_err().unwrap(),
|
|
166
166
|
TtlError::TtlConfigFrozen.into()
|
|
167
167
|
);
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
#[test]
|
|
171
|
-
fn
|
|
171
|
+
fn test_set_ttl_configs_then_freeze() {
|
|
172
172
|
let context = setup();
|
|
173
173
|
let env = &context.env;
|
|
174
174
|
let endpoint = &context.endpoint_client;
|
|
175
175
|
|
|
176
|
-
// Set custom TTL
|
|
176
|
+
// Set custom TTL configs
|
|
177
177
|
let instance_config = Some(TtlConfig::new(100, 200));
|
|
178
178
|
let persistent_config = Some(TtlConfig::new(300, 400));
|
|
179
179
|
|
|
180
|
-
context.mock_owner_auth("
|
|
181
|
-
endpoint.
|
|
180
|
+
context.mock_owner_auth("set_ttl_configs", (&instance_config, &persistent_config));
|
|
181
|
+
endpoint.set_ttl_configs(&instance_config, &persistent_config);
|
|
182
182
|
|
|
183
183
|
// Freeze
|
|
184
|
-
context.mock_owner_auth("
|
|
185
|
-
endpoint.
|
|
184
|
+
context.mock_owner_auth("freeze_ttl_configs", ());
|
|
185
|
+
endpoint.freeze_ttl_configs();
|
|
186
186
|
|
|
187
|
-
// Verify
|
|
187
|
+
// Verify configs are preserved after freeze
|
|
188
188
|
let (stored_instance, stored_persistent) = ttl_defaults(env, &context.endpoint_client.address);
|
|
189
189
|
assert_eq!(stored_instance, TtlConfig::new(100, 200));
|
|
190
190
|
assert_eq!(stored_persistent, TtlConfig::new(300, 400));
|
|
191
191
|
|
|
192
192
|
// Verify frozen
|
|
193
|
-
assert!(endpoint.
|
|
193
|
+
assert!(endpoint.is_ttl_configs_frozen());
|
|
194
194
|
|
|
195
195
|
// Verify cannot modify after freeze
|
|
196
196
|
let new_instance_config = Some(TtlConfig::new(500, 600));
|
|
197
|
-
context.mock_owner_auth("
|
|
197
|
+
context.mock_owner_auth("set_ttl_configs", (&new_instance_config, &persistent_config));
|
|
198
198
|
assert_eq!(
|
|
199
|
-
endpoint.
|
|
199
|
+
endpoint.try_set_ttl_configs(&new_instance_config, &persistent_config).unwrap_err().unwrap(),
|
|
200
200
|
TtlError::TtlConfigFrozen.into()
|
|
201
201
|
);
|
|
202
202
|
}
|
|
@@ -95,12 +95,12 @@ impl MockSendLib {
|
|
|
95
95
|
|
|
96
96
|
let mut native_fee_recipients = Vec::new(&env);
|
|
97
97
|
if native_fee > 0 {
|
|
98
|
-
native_fee_recipients.push_back(FeeRecipient { amount: native_fee,
|
|
98
|
+
native_fee_recipients.push_back(FeeRecipient { amount: native_fee, to: fee_recipient.clone() });
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
let mut zro_fee_recipients = Vec::new(&env);
|
|
102
102
|
if zro_fee > 0 {
|
|
103
|
-
zro_fee_recipients.push_back(FeeRecipient { amount: zro_fee,
|
|
103
|
+
zro_fee_recipients.push_back(FeeRecipient { amount: zro_fee, to: fee_recipient });
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
// Create a simple encoded payload (just the message for simplicity)
|
|
@@ -21,8 +21,14 @@ pub fn compute_guid(
|
|
|
21
21
|
receiver: &BytesN<32>,
|
|
22
22
|
) -> BytesN<32> {
|
|
23
23
|
let mut writer = BufferWriter::new(env);
|
|
24
|
-
writer
|
|
25
|
-
|
|
24
|
+
let payload = writer
|
|
25
|
+
.write_u64(nonce)
|
|
26
|
+
.write_u32(src_eid)
|
|
27
|
+
.write_address_payload(sender)
|
|
28
|
+
.write_u32(dst_eid)
|
|
29
|
+
.write_bytes_n(receiver)
|
|
30
|
+
.to_bytes();
|
|
31
|
+
keccak256(env, &payload)
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
/// Builds a payload from a GUID and message.
|
|
@@ -12,12 +12,12 @@
|
|
|
12
12
|
|
|
13
13
|
#![no_std]
|
|
14
14
|
|
|
15
|
-
use common_macros::contract_error;
|
|
15
|
+
use common_macros::{contract_error, contract_impl};
|
|
16
16
|
use endpoint_v2::{
|
|
17
17
|
FeesAndPacket, IMessageLib, ISendLib, MessageLibType, MessageLibVersion, MessagingFee, OutboundPacket,
|
|
18
18
|
SetConfigParam,
|
|
19
19
|
};
|
|
20
|
-
use soroban_sdk::{contract,
|
|
20
|
+
use soroban_sdk::{contract, panic_with_error, Address, Bytes, Env, Vec};
|
|
21
21
|
|
|
22
22
|
#[contract_error]
|
|
23
23
|
enum BlockMessageLibError {
|
|
@@ -26,9 +26,9 @@ enum BlockMessageLibError {
|
|
|
26
26
|
|
|
27
27
|
/// Block Message Library contract that rejects all messaging operations.
|
|
28
28
|
#[contract]
|
|
29
|
-
pub struct BlockMessageLib;
|
|
29
|
+
pub struct BlockMessageLib; // TODO: rename to BlockedMessageLib
|
|
30
30
|
|
|
31
|
-
#[
|
|
31
|
+
#[contract_impl]
|
|
32
32
|
impl IMessageLib for BlockMessageLib {
|
|
33
33
|
/// Always panics - config retrieval is not supported.
|
|
34
34
|
fn get_config(env: &Env, _eid: u32, _oapp: &Address, _config_type: u32) -> Bytes {
|
|
@@ -56,7 +56,7 @@ impl IMessageLib for BlockMessageLib {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
#[
|
|
59
|
+
#[contract_impl]
|
|
60
60
|
impl ISendLib for BlockMessageLib {
|
|
61
61
|
/// Always panics - quoting is blocked.
|
|
62
62
|
fn quote(env: &Env, _packet: &OutboundPacket, _options: &Bytes, _pay_in_zro: bool) -> MessagingFee {
|
|
@@ -2,19 +2,19 @@ use common_macros::contract_error;
|
|
|
2
2
|
|
|
3
3
|
#[contract_error]
|
|
4
4
|
pub enum PacketCodecV1Error {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
InvalidPacketHeader = 1001,
|
|
6
|
+
InvalidPacketVersion,
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
#[contract_error]
|
|
10
10
|
pub enum WorkerOptionsError {
|
|
11
|
-
|
|
12
|
-
InvalidWorkerId,
|
|
11
|
+
InvalidBytesLength = 1101,
|
|
13
12
|
InvalidLegacyOptionsType1,
|
|
14
|
-
LegacyOptionsType1GasOverflow,
|
|
15
13
|
InvalidLegacyOptionsType2,
|
|
16
|
-
LegacyOptionsType2GasOverflow,
|
|
17
|
-
LegacyOptionsType2AmountOverflow,
|
|
18
14
|
InvalidOptionType,
|
|
19
|
-
|
|
15
|
+
InvalidOptions,
|
|
16
|
+
InvalidWorkerId,
|
|
17
|
+
LegacyOptionsType1GasOverflow,
|
|
18
|
+
LegacyOptionsType2AmountOverflow,
|
|
19
|
+
LegacyOptionsType2GasOverflow,
|
|
20
20
|
}
|
|
@@ -2,7 +2,6 @@ use endpoint_v2::FeeRecipient;
|
|
|
2
2
|
use soroban_sdk::{contractclient, Address, Bytes, BytesN, Env};
|
|
3
3
|
|
|
4
4
|
/// Interface for Decentralized Verifier Networks (DVNs) that verify cross-chain messages.
|
|
5
|
-
#[allow(clippy::upper_case_acronyms)]
|
|
6
5
|
#[contractclient(name = "LayerZeroDVNClient")]
|
|
7
6
|
pub trait ILayerZeroDVN {
|
|
8
7
|
/// Quotes the fee for verifying a message.
|
|
@@ -30,10 +30,8 @@ pub struct PacketHeader {
|
|
|
30
30
|
/// # Returns
|
|
31
31
|
/// Encoded packet bytes ready for cross-chain transmission
|
|
32
32
|
pub fn encode_packet(env: &Env, packet: &OutboundPacket) -> Bytes {
|
|
33
|
-
let mut
|
|
34
|
-
|
|
35
|
-
result.append(&packet.message);
|
|
36
|
-
result
|
|
33
|
+
let mut writer = BufferWriter::from_bytes(encode_packet_header(env, packet));
|
|
34
|
+
writer.write_bytes_n(&packet.guid).write_bytes(&packet.message).to_bytes()
|
|
37
35
|
}
|
|
38
36
|
|
|
39
37
|
/// Encodes only the packet header from an outbound packet.
|
|
@@ -59,8 +57,8 @@ pub fn encode_packet_header(env: &Env, packet: &OutboundPacket) -> Bytes {
|
|
|
59
57
|
.write_u32(packet.src_eid)
|
|
60
58
|
.write_address_payload(&packet.sender)
|
|
61
59
|
.write_u32(packet.dst_eid)
|
|
62
|
-
.write_bytes_n(&packet.receiver)
|
|
63
|
-
|
|
60
|
+
.write_bytes_n(&packet.receiver)
|
|
61
|
+
.to_bytes()
|
|
64
62
|
}
|
|
65
63
|
|
|
66
64
|
/// Decodes a byte vector into a packet header and validates the format.
|
|
@@ -61,7 +61,7 @@ fn test_payload_functions() {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
#[test]
|
|
64
|
-
#[should_panic(expected = "Error(Contract, #
|
|
64
|
+
#[should_panic(expected = "Error(Contract, #1001)")] // PacketCodecV1Error::InvalidPacketHeader
|
|
65
65
|
fn test_invalid_header_length() {
|
|
66
66
|
let env = Env::default();
|
|
67
67
|
// Create a header with wrong length (too short) - only 3 bytes instead of 81
|
|
@@ -70,7 +70,7 @@ fn test_invalid_header_length() {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
#[test]
|
|
73
|
-
#[should_panic(expected = "Error(Contract, #
|
|
73
|
+
#[should_panic(expected = "Error(Contract, #1002)")] // PacketCodecV1Error::InvalidPacketVersion
|
|
74
74
|
fn test_invalid_packet_version() {
|
|
75
75
|
let env = Env::default();
|
|
76
76
|
// Create a header with correct length but wrong version
|
|
@@ -91,7 +91,7 @@ fn test_decode_legacy_options_type_1() {
|
|
|
91
91
|
assert_eq!(reader.read_u16(), 17);
|
|
92
92
|
assert_eq!(reader.read_u8(), EXECUTOR_OPTION_TYPE_LZRECEIVE);
|
|
93
93
|
assert_eq!(reader.read_u128(), 200000);
|
|
94
|
-
assert_eq!(reader.
|
|
94
|
+
assert_eq!(reader.remaining_len(), 0);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
#[test]
|
|
@@ -218,7 +218,7 @@ fn test_get_matching_options() {
|
|
|
218
218
|
// ============ Error tests ============
|
|
219
219
|
|
|
220
220
|
#[test]
|
|
221
|
-
#[should_panic(expected = "Error(Contract, #
|
|
221
|
+
#[should_panic(expected = "Error(Contract, #1105)")] // WorkerOptionsError::InvalidOptions
|
|
222
222
|
fn test_decode_invalid_options_too_short() {
|
|
223
223
|
let env = Env::default();
|
|
224
224
|
let mut options = Bytes::new(&env);
|
|
@@ -227,7 +227,7 @@ fn test_decode_invalid_options_too_short() {
|
|
|
227
227
|
}
|
|
228
228
|
|
|
229
229
|
#[test]
|
|
230
|
-
#[should_panic(expected = "Error(Contract, #
|
|
230
|
+
#[should_panic(expected = "Error(Contract, #1106)")] // WorkerOptionsError::InvalidWorkerId
|
|
231
231
|
fn test_decode_invalid_worker_id() {
|
|
232
232
|
let env = Env::default();
|
|
233
233
|
let mut options = Bytes::new(&env);
|
|
@@ -237,7 +237,7 @@ fn test_decode_invalid_worker_id() {
|
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
#[test]
|
|
240
|
-
#[should_panic(expected = "Error(Contract, #
|
|
240
|
+
#[should_panic(expected = "Error(Contract, #1107)")] // WorkerOptionsError::LegacyOptionsType1GasOverflow
|
|
241
241
|
fn test_legacy_type1_gas_overflow() {
|
|
242
242
|
let env = Env::default();
|
|
243
243
|
let mut options = Bytes::new(&env);
|
|
@@ -247,7 +247,7 @@ fn test_legacy_type1_gas_overflow() {
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
#[test]
|
|
250
|
-
#[should_panic(expected = "Error(Contract, #
|
|
250
|
+
#[should_panic(expected = "Error(Contract, #1109)")] // WorkerOptionsError::LegacyOptionsType2GasOverflow
|
|
251
251
|
fn test_legacy_type2_gas_overflow() {
|
|
252
252
|
let env = Env::default();
|
|
253
253
|
let mut options = Bytes::new(&env);
|
|
@@ -257,7 +257,7 @@ fn test_legacy_type2_gas_overflow() {
|
|
|
257
257
|
}
|
|
258
258
|
|
|
259
259
|
#[test]
|
|
260
|
-
#[should_panic(expected = "Error(Contract, #
|
|
260
|
+
#[should_panic(expected = "Error(Contract, #1108)")] // WorkerOptionsError::LegacyOptionsType2AmountOverflow
|
|
261
261
|
fn test_legacy_type2_amount_overflow() {
|
|
262
262
|
let env = Env::default();
|
|
263
263
|
let mut options = Bytes::new(&env);
|
|
@@ -267,7 +267,7 @@ fn test_legacy_type2_amount_overflow() {
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
#[test]
|
|
270
|
-
#[should_panic(expected = "Error(Contract, #
|
|
270
|
+
#[should_panic(expected = "Error(Contract, #1102)")] // WorkerOptionsError::InvalidLegacyOptionsType1
|
|
271
271
|
fn test_legacy_type1_invalid_size_too_short() {
|
|
272
272
|
let env = Env::default();
|
|
273
273
|
let mut options = Bytes::new(&env);
|
|
@@ -277,7 +277,7 @@ fn test_legacy_type1_invalid_size_too_short() {
|
|
|
277
277
|
}
|
|
278
278
|
|
|
279
279
|
#[test]
|
|
280
|
-
#[should_panic(expected = "Error(Contract, #
|
|
280
|
+
#[should_panic(expected = "Error(Contract, #1102)")] // WorkerOptionsError::InvalidLegacyOptionsType1
|
|
281
281
|
fn test_legacy_type1_invalid_size_too_long() {
|
|
282
282
|
let env = Env::default();
|
|
283
283
|
let mut options = Bytes::new(&env);
|
|
@@ -289,7 +289,7 @@ fn test_legacy_type1_invalid_size_too_long() {
|
|
|
289
289
|
}
|
|
290
290
|
|
|
291
291
|
#[test]
|
|
292
|
-
#[should_panic(expected = "Error(Contract, #
|
|
292
|
+
#[should_panic(expected = "Error(Contract, #1103)")] // WorkerOptionsError::InvalidLegacyOptionsType2
|
|
293
293
|
fn test_legacy_type2_invalid_size_too_short() {
|
|
294
294
|
let env = Env::default();
|
|
295
295
|
let mut options = Bytes::new(&env);
|
|
@@ -299,7 +299,7 @@ fn test_legacy_type2_invalid_size_too_short() {
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
#[test]
|
|
302
|
-
#[should_panic(expected = "Error(Contract, #
|
|
302
|
+
#[should_panic(expected = "Error(Contract, #1103)")] // WorkerOptionsError::InvalidLegacyOptionsType2
|
|
303
303
|
fn test_legacy_type2_invalid_size_too_long() {
|
|
304
304
|
let env = Env::default();
|
|
305
305
|
let mut options = Bytes::new(&env);
|
|
@@ -309,7 +309,7 @@ fn test_legacy_type2_invalid_size_too_long() {
|
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
#[test]
|
|
312
|
-
#[should_panic(expected = "Error(Contract, #
|
|
312
|
+
#[should_panic(expected = "Error(Contract, #1104)")] // WorkerOptionsError::InvalidOptionType
|
|
313
313
|
fn test_unsupported_option_type() {
|
|
314
314
|
let env = Env::default();
|
|
315
315
|
let mut options = Bytes::new(&env);
|
|
@@ -67,8 +67,7 @@ pub fn split_worker_options(env: &Env, options: &Bytes) -> (Bytes, Map<u32, Byte
|
|
|
67
67
|
pub fn extract_type_3_options(env: &Env, options_reader: &mut BufferReader) -> (Bytes, Map<u32, Bytes>) {
|
|
68
68
|
let mut executor_options = bytes!(env);
|
|
69
69
|
let mut dvn_options = map![env];
|
|
70
|
-
|
|
71
|
-
while options_reader.remaining() > 0 {
|
|
70
|
+
while options_reader.remaining_len() > 0 {
|
|
72
71
|
let worker_id = options_reader.read_u8();
|
|
73
72
|
let option_size = options_reader.read_u16() as u32;
|
|
74
73
|
|
|
@@ -78,11 +77,10 @@ pub fn extract_type_3_options(env: &Env, options_reader: &mut BufferReader) -> (
|
|
|
78
77
|
|
|
79
78
|
match worker_id {
|
|
80
79
|
EXECUTOR_WORKER_ID => executor_options.append(¤t_option),
|
|
81
|
-
DVN_WORKER_ID => append_dvn_option(&mut dvn_options, current_option),
|
|
80
|
+
DVN_WORKER_ID => append_dvn_option(env, &mut dvn_options, current_option),
|
|
82
81
|
_ => panic_with_error!(env, WorkerOptionsError::InvalidWorkerId),
|
|
83
82
|
}
|
|
84
83
|
}
|
|
85
|
-
|
|
86
84
|
(executor_options, dvn_options)
|
|
87
85
|
}
|
|
88
86
|
|
|
@@ -105,7 +103,7 @@ pub fn extract_type_3_options(env: &Env, options_reader: &mut BufferReader) -> (
|
|
|
105
103
|
/// Executor options in Type 3 format
|
|
106
104
|
pub fn convert_legacy_options(env: &Env, options: &mut BufferReader, option_type: u16) -> Bytes {
|
|
107
105
|
let mut executor_options = BufferWriter::new(env);
|
|
108
|
-
let options_size = options.
|
|
106
|
+
let options_size = options.remaining_len();
|
|
109
107
|
|
|
110
108
|
match option_type {
|
|
111
109
|
LEGACY_OPTIONS_TYPE_1 => {
|
|
@@ -113,7 +111,6 @@ pub fn convert_legacy_options(env: &Env, options: &mut BufferReader, option_type
|
|
|
113
111
|
// Execution gas (u256 -> u128)
|
|
114
112
|
let execution_gas =
|
|
115
113
|
options.read_u256().to_u128().unwrap_or_panic(env, WorkerOptionsError::LegacyOptionsType1GasOverflow);
|
|
116
|
-
|
|
117
114
|
append_lz_receive_option(&mut executor_options, execution_gas);
|
|
118
115
|
}
|
|
119
116
|
LEGACY_OPTIONS_TYPE_2 => {
|
|
@@ -129,7 +126,6 @@ pub fn convert_legacy_options(env: &Env, options: &mut BufferReader, option_type
|
|
|
129
126
|
.read_u256()
|
|
130
127
|
.to_u128()
|
|
131
128
|
.unwrap_or_panic(env, WorkerOptionsError::LegacyOptionsType2AmountOverflow);
|
|
132
|
-
|
|
133
129
|
let receiver = left_pad_to_bytes32(env, &options.read_bytes_until_end());
|
|
134
130
|
|
|
135
131
|
append_lz_receive_option(&mut executor_options, execution_gas);
|
|
@@ -139,7 +135,7 @@ pub fn convert_legacy_options(env: &Env, options: &mut BufferReader, option_type
|
|
|
139
135
|
}
|
|
140
136
|
|
|
141
137
|
// Ensure all bytes were consumed
|
|
142
|
-
assert_with_error!(env, options.
|
|
138
|
+
assert_with_error!(env, options.remaining_len() == 0, WorkerOptionsError::InvalidOptions);
|
|
143
139
|
executor_options.to_bytes()
|
|
144
140
|
}
|
|
145
141
|
|
|
@@ -151,15 +147,11 @@ pub fn convert_legacy_options(env: &Env, options: &mut BufferReader, option_type
|
|
|
151
147
|
///
|
|
152
148
|
/// Searches for existing DVN options with the same index and concatenates them,
|
|
153
149
|
/// or creates a new entry if this is the first option for this DVN index.
|
|
154
|
-
fn append_dvn_option(dvn_options: &mut Map<u32, Bytes>, option_bytes: Bytes) {
|
|
150
|
+
fn append_dvn_option(env: &Env, dvn_options: &mut Map<u32, Bytes>, option_bytes: Bytes) {
|
|
155
151
|
let dvn_idx = option_bytes.get(DVN_IDX_OFFSET).unwrap() as u32;
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
dvn_options.set(dvn_idx, existing);
|
|
160
|
-
} else {
|
|
161
|
-
dvn_options.set(dvn_idx, option_bytes);
|
|
162
|
-
}
|
|
152
|
+
let mut existing = dvn_options.get(dvn_idx).unwrap_or(bytes!(env));
|
|
153
|
+
existing.append(&option_bytes);
|
|
154
|
+
dvn_options.set(dvn_idx, existing);
|
|
163
155
|
}
|
|
164
156
|
|
|
165
157
|
/// Appends a LzReceive option to the executor options bytes.
|
|
@@ -188,3 +180,5 @@ fn left_pad_to_bytes32(env: &Env, bytes: &Bytes) -> BytesN<32> {
|
|
|
188
180
|
bytes.copy_into_slice(&mut buf[32 - bytes.len() as usize..]);
|
|
189
181
|
BytesN::from_array(env, &buf)
|
|
190
182
|
}
|
|
183
|
+
|
|
184
|
+
// TODO (ethan): add more negative test cases for worker options
|