@layerzerolabs/protocol-stellar-v2 0.2.8
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 +727 -0
- package/.turbo/turbo-lint.log +158 -0
- package/.turbo/turbo-test.log +796 -0
- package/Cargo.lock +2237 -0
- package/Cargo.toml +63 -0
- package/clippy.toml +7 -0
- package/contracts/common-macros/Cargo.toml +20 -0
- package/contracts/common-macros/src/error.rs +53 -0
- package/contracts/common-macros/src/event.rs +16 -0
- package/contracts/common-macros/src/lib.rs +255 -0
- package/contracts/common-macros/src/ownable.rs +63 -0
- package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +310 -0
- package/contracts/common-macros/src/storage.rs +439 -0
- package/contracts/common-macros/src/tests.rs +287 -0
- package/contracts/common-macros/src/ttl_configurable.rs +60 -0
- package/contracts/endpoint-v2/ARCHITECTURE.md +233 -0
- package/contracts/endpoint-v2/Cargo.toml +30 -0
- package/contracts/endpoint-v2/src/constants.rs +52 -0
- package/contracts/endpoint-v2/src/endpoint_v2.rs +305 -0
- package/contracts/endpoint-v2/src/errors.rs +29 -0
- package/contracts/endpoint-v2/src/events.rs +207 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_composer.rs +26 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +170 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_receiver.rs +43 -0
- package/contracts/endpoint-v2/src/interfaces/message_lib.rs +62 -0
- package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +220 -0
- package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +121 -0
- package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +63 -0
- package/contracts/endpoint-v2/src/interfaces/mod.rs +17 -0
- package/contracts/endpoint-v2/src/interfaces/send_lib.rs +70 -0
- package/contracts/endpoint-v2/src/lib.rs +22 -0
- package/contracts/endpoint-v2/src/message_lib_manager.rs +315 -0
- package/contracts/endpoint-v2/src/messaging_channel.rs +218 -0
- package/contracts/endpoint-v2/src/messaging_composer.rs +76 -0
- package/contracts/endpoint-v2/src/storage.rs +78 -0
- package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +131 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +237 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +42 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +76 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +211 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +18 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +10 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +10 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +424 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +144 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +72 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +29 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +513 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +43 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +27 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +30 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +202 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +59 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +172 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +23 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +10 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +131 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +35 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +28 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +79 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +246 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +285 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +180 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +405 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +80 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +131 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +358 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +316 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +288 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +316 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +388 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +307 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +10 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +239 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +324 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +242 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +232 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +212 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +213 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +269 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +173 -0
- package/contracts/endpoint-v2/src/tests/mock.rs +132 -0
- package/contracts/endpoint-v2/src/tests/mod.rs +12 -0
- package/contracts/endpoint-v2/src/tests/util/build_payload.rs +126 -0
- package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +82 -0
- package/contracts/endpoint-v2/src/tests/util/keccak256.rs +115 -0
- package/contracts/endpoint-v2/src/tests/util/mod.rs +3 -0
- package/contracts/endpoint-v2/src/util.rs +52 -0
- package/contracts/message-libs/Cargo.toml +12 -0
- package/contracts/message-libs/block-message-lib/Cargo.toml +19 -0
- package/contracts/message-libs/block-message-lib/src/lib.rs +70 -0
- package/contracts/message-libs/lib.rs +2 -0
- package/contracts/message-libs/message-lib-common/Cargo.toml +24 -0
- package/contracts/message-libs/message-lib-common/src/errors.rs +20 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +55 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/executor.rs +46 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +7 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/treasury.rs +17 -0
- package/contracts/message-libs/message-lib-common/src/lib.rs +14 -0
- package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +99 -0
- package/contracts/message-libs/message-lib-common/src/testing_utils.rs +27 -0
- package/contracts/message-libs/message-lib-common/src/tests/mod.rs +2 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +162 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +319 -0
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +190 -0
- package/contracts/message-libs/simple-message-lib/Cargo.toml +26 -0
- package/contracts/message-libs/simple-message-lib/src/errors.rs +11 -0
- package/contracts/message-libs/simple-message-lib/src/lib.rs +14 -0
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +136 -0
- package/contracts/message-libs/simple-message-lib/src/storage.rs +27 -0
- package/contracts/message-libs/simple-message-lib/src/test.rs +280 -0
- package/contracts/message-libs/treasury/Cargo.toml +27 -0
- package/contracts/message-libs/treasury/src/errors.rs +10 -0
- package/contracts/message-libs/treasury/src/events.rs +28 -0
- package/contracts/message-libs/treasury/src/interfaces/mod.rs +3 -0
- package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +20 -0
- package/contracts/message-libs/treasury/src/lib.rs +20 -0
- package/contracts/message-libs/treasury/src/storage.rs +18 -0
- package/contracts/message-libs/treasury/src/tests/mod.rs +2 -0
- package/contracts/message-libs/treasury/src/tests/setup.rs +112 -0
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +562 -0
- package/contracts/message-libs/treasury/src/treasury.rs +140 -0
- package/contracts/message-libs/uln-302/Cargo.toml +28 -0
- package/contracts/message-libs/uln-302/src/config_validation.rs +173 -0
- package/contracts/message-libs/uln-302/src/errors.rs +29 -0
- package/contracts/message-libs/uln-302/src/events.rs +72 -0
- package/contracts/message-libs/uln-302/src/interfaces/mod.rs +5 -0
- package/contracts/message-libs/uln-302/src/interfaces/receive.rs +82 -0
- package/contracts/message-libs/uln-302/src/interfaces/send.rs +159 -0
- package/contracts/message-libs/uln-302/src/lib.rs +20 -0
- package/contracts/message-libs/uln-302/src/receive.rs +199 -0
- package/contracts/message-libs/uln-302/src/send.rs +349 -0
- package/contracts/message-libs/uln-302/src/storage.rs +47 -0
- package/contracts/message-libs/uln-302/src/tests/config/mod.rs +2 -0
- package/contracts/message-libs/uln-302/src/tests/config/oapp_uln_config.rs +291 -0
- package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +163 -0
- package/contracts/message-libs/uln-302/src/tests/mod.rs +7 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/commit_verification.rs +183 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/confirmations.rs +128 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +104 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/mod.rs +66 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +79 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +463 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +173 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +132 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +117 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/mod.rs +6 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/quote.rs +586 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +834 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +95 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +80 -0
- package/contracts/message-libs/uln-302/src/tests/setup.rs +268 -0
- package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +47 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +51 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +51 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_oapp_executor_config.rs +48 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +4 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +998 -0
- package/contracts/message-libs/uln-302/src/uln302.rs +117 -0
- package/contracts/oapp-macros/Cargo.toml +21 -0
- package/contracts/oapp-macros/src/lib.rs +408 -0
- package/contracts/oapp-macros/src/oapp_core.rs +49 -0
- package/contracts/oapp-macros/src/oapp_full.rs +15 -0
- package/contracts/oapp-macros/src/oapp_options_type3.rs +46 -0
- package/contracts/oapp-macros/src/oapp_receiver.rs +67 -0
- package/contracts/oapp-macros/src/oapp_sender.rs +23 -0
- package/contracts/oapp-macros/src/util.rs +103 -0
- package/contracts/oapp-macros/tests/test_macros.rs +522 -0
- package/contracts/oapps/Cargo.toml +12 -0
- package/contracts/oapps/counter/Cargo.toml +24 -0
- package/contracts/oapps/counter/integration_tests/mod.rs +3 -0
- package/contracts/oapps/counter/integration_tests/setup.rs +201 -0
- package/contracts/oapps/counter/integration_tests/test_with_sml.rs +166 -0
- package/contracts/oapps/counter/integration_tests/utils.rs +144 -0
- package/contracts/oapps/counter/src/codec.rs +63 -0
- package/contracts/oapps/counter/src/counter.rs +235 -0
- package/contracts/oapps/counter/src/errors.rs +9 -0
- package/contracts/oapps/counter/src/lib.rs +16 -0
- package/contracts/oapps/counter/src/options.rs +30 -0
- package/contracts/oapps/counter/src/storage.rs +33 -0
- package/contracts/oapps/counter/src/tests/mod.rs +37 -0
- package/contracts/oapps/counter/src/tests/test_codec.rs +64 -0
- package/contracts/oapps/counter/src/tests/test_counter.rs +390 -0
- package/contracts/oapps/counter/src/u256_ext.rs +21 -0
- package/contracts/oapps/lib.rs +2 -0
- package/contracts/oapps/oapp/Cargo.toml +21 -0
- package/contracts/oapps/oapp/src/errors.rs +9 -0
- package/contracts/oapps/oapp/src/lib.rs +10 -0
- package/contracts/oapps/oapp/src/oapp_core.rs +92 -0
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +89 -0
- package/contracts/oapps/oapp/src/oapp_receiver.rs +72 -0
- package/contracts/oapps/oapp/src/oapp_sender.rs +66 -0
- package/contracts/oapps/oapp/src/tests/mod.rs +4 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +162 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +180 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +157 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +283 -0
- package/contracts/utils/Cargo.toml +21 -0
- package/contracts/utils/src/buffer_reader.rs +143 -0
- package/contracts/utils/src/buffer_writer.rs +117 -0
- package/contracts/utils/src/bytes_ext.rs +19 -0
- package/contracts/utils/src/errors.rs +30 -0
- package/contracts/utils/src/lib.rs +15 -0
- package/contracts/utils/src/option_ext.rs +38 -0
- package/contracts/utils/src/ownable.rs +88 -0
- package/contracts/utils/src/testing_utils.rs +100 -0
- package/contracts/utils/src/tests/buffer_reader.rs +1006 -0
- package/contracts/utils/src/tests/buffer_writer.rs +330 -0
- package/contracts/utils/src/tests/bytes_ext.rs +77 -0
- package/contracts/utils/src/tests/mod.rs +4 -0
- package/contracts/utils/src/tests/ownable.rs +149 -0
- package/contracts/utils/src/ttl.rs +164 -0
- package/contracts/workers/Cargo.toml +13 -0
- package/contracts/workers/executor/Cargo.toml +26 -0
- package/contracts/workers/executor/src/events.rs +22 -0
- package/contracts/workers/executor/src/executor.rs +347 -0
- package/contracts/workers/executor/src/interfaces/executor.rs +40 -0
- package/contracts/workers/executor/src/interfaces/mod.rs +5 -0
- package/contracts/workers/executor/src/interfaces/types.rs +51 -0
- package/contracts/workers/executor/src/lib.rs +10 -0
- package/contracts/workers/executor/src/storage.rs +23 -0
- package/contracts/workers/lib.rs +2 -0
- package/contracts/workers/worker-common/Cargo.toml +18 -0
- package/contracts/workers/worker-common/src/constants.rs +17 -0
- package/contracts/workers/worker-common/src/errors.rs +6 -0
- package/contracts/workers/worker-common/src/events.rs +34 -0
- package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +35 -0
- package/contracts/workers/worker-common/src/interfaces/mod.rs +7 -0
- package/contracts/workers/worker-common/src/interfaces/price_feed.rs +40 -0
- package/contracts/workers/worker-common/src/interfaces/worker.rs +60 -0
- package/contracts/workers/worker-common/src/lib.rs +19 -0
- package/contracts/workers/worker-common/src/storage.rs +32 -0
- package/contracts/workers/worker-common/src/worker_common.rs +166 -0
- package/package.json +25 -0
- package/rust-toolchain.toml +4 -0
- package/rustfmt.toml +17 -0
- package/sdk/.turbo/turbo-build.log +4 -0
- package/sdk/dist/generated/bml.d.ts +452 -0
- package/sdk/dist/generated/bml.js +72 -0
- package/sdk/dist/generated/counter.d.ts +824 -0
- package/sdk/dist/generated/counter.js +125 -0
- package/sdk/dist/generated/endpoint.d.ts +1676 -0
- package/sdk/dist/generated/endpoint.js +216 -0
- package/sdk/dist/generated/sml.d.ts +810 -0
- package/sdk/dist/generated/sml.js +132 -0
- package/sdk/dist/generated/uln302.d.ts +1227 -0
- package/sdk/dist/generated/uln302.js +185 -0
- package/sdk/dist/index.d.ts +5 -0
- package/sdk/dist/index.js +5 -0
- package/sdk/node_modules/.bin/tsc +21 -0
- package/sdk/node_modules/.bin/tsserver +21 -0
- package/sdk/node_modules/.bin/vitest +21 -0
- package/sdk/node_modules/.bin/zx +21 -0
- package/sdk/package.json +40 -0
- package/sdk/src/index.ts +5 -0
- package/sdk/test/index.test.ts +271 -0
- package/sdk/test/suites/constants.ts +13 -0
- package/sdk/test/suites/deploy.ts +277 -0
- package/sdk/test/suites/localnet.ts +42 -0
- package/sdk/test/suites/scan.ts +189 -0
- package/sdk/tsconfig.json +106 -0
- package/tools/ts-bindings-gen/Cargo.toml +14 -0
- package/tools/ts-bindings-gen/src/main.rs +147 -0
- package/turbo.json +12 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
use crate::tests::endpoint_setup::setup;
|
|
2
|
+
use soroban_sdk::{testutils::Address as _, Address};
|
|
3
|
+
use utils::{
|
|
4
|
+
errors::TtlError,
|
|
5
|
+
ttl::{TtlConfig, TtlConfigData},
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
fn ttl_defaults(env: &soroban_sdk::Env, contract: &Address) -> (TtlConfig, TtlConfig) {
|
|
9
|
+
env.as_contract(contract, || {
|
|
10
|
+
(
|
|
11
|
+
TtlConfigData::instance(env).expect("instance config should exist"),
|
|
12
|
+
TtlConfigData::persistent(env).expect("persistent config should exist"),
|
|
13
|
+
)
|
|
14
|
+
})
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#[test]
|
|
18
|
+
fn test_set_ttl_config_success() {
|
|
19
|
+
let context = setup();
|
|
20
|
+
let env = &context.env;
|
|
21
|
+
let endpoint = &context.endpoint_client;
|
|
22
|
+
|
|
23
|
+
let max_ttl = env.as_contract(&context.endpoint_client.address, || env.storage().max_ttl());
|
|
24
|
+
|
|
25
|
+
let instance_threshold = max_ttl / 4;
|
|
26
|
+
let instance_extend_to = instance_threshold + 1;
|
|
27
|
+
let persistent_threshold = max_ttl / 5;
|
|
28
|
+
let persistent_extend_to = persistent_threshold + 2;
|
|
29
|
+
|
|
30
|
+
let instance_config = Some(TtlConfig::new(instance_threshold, instance_extend_to));
|
|
31
|
+
let persistent_config = Some(TtlConfig::new(persistent_threshold, persistent_extend_to));
|
|
32
|
+
|
|
33
|
+
context.mock_owner_auth("set_ttl_config", (&instance_config, &persistent_config, &None::<TtlConfig>));
|
|
34
|
+
endpoint.set_ttl_config(&instance_config, &persistent_config, &None);
|
|
35
|
+
|
|
36
|
+
let (stored_instance, stored_persistent) = ttl_defaults(env, &context.endpoint_client.address);
|
|
37
|
+
|
|
38
|
+
assert_eq!(stored_instance, TtlConfig::new(instance_threshold, instance_extend_to));
|
|
39
|
+
assert_eq!(stored_persistent, TtlConfig::new(persistent_threshold, persistent_extend_to));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#[test]
|
|
43
|
+
#[should_panic(expected = "Error(Auth, InvalidAction)")]
|
|
44
|
+
fn test_set_ttl_config_requires_owner() {
|
|
45
|
+
let context = setup();
|
|
46
|
+
let env = &context.env;
|
|
47
|
+
let endpoint = &context.endpoint_client;
|
|
48
|
+
let attacker = Address::generate(env);
|
|
49
|
+
|
|
50
|
+
let instance_config = Some(TtlConfig::new(1, 2));
|
|
51
|
+
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
52
|
+
|
|
53
|
+
context.mock_auth(&attacker, "set_ttl_config", (&instance_config, &persistent_config));
|
|
54
|
+
|
|
55
|
+
endpoint.set_ttl_config(&instance_config, &persistent_config, &None);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
#[test]
|
|
59
|
+
fn test_panic_set_ttl_config_invalid_instance_range() {
|
|
60
|
+
let context = setup();
|
|
61
|
+
let env = &context.env;
|
|
62
|
+
let endpoint = &context.endpoint_client;
|
|
63
|
+
|
|
64
|
+
let max_ttl = env.as_contract(&context.endpoint_client.address, || env.storage().max_ttl());
|
|
65
|
+
let instance_threshold = max_ttl / 4 + 2;
|
|
66
|
+
let instance_extend_to = instance_threshold - 1; // Invalid: extend_to < threshold
|
|
67
|
+
|
|
68
|
+
let instance_config = Some(TtlConfig::new(instance_threshold, instance_extend_to));
|
|
69
|
+
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
70
|
+
|
|
71
|
+
context.mock_owner_auth("set_ttl_config", (&instance_config, &persistent_config, &None::<TtlConfig>));
|
|
72
|
+
|
|
73
|
+
assert_eq!(
|
|
74
|
+
endpoint.try_set_ttl_config(&instance_config, &persistent_config, &None).unwrap_err().unwrap(),
|
|
75
|
+
TtlError::InvalidTtlConfig.into()
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#[test]
|
|
80
|
+
fn test_panic_set_ttl_config_exceeds_max_ttl() {
|
|
81
|
+
let context = setup();
|
|
82
|
+
let env = &context.env;
|
|
83
|
+
let endpoint = &context.endpoint_client;
|
|
84
|
+
|
|
85
|
+
let max_ttl = env.as_contract(&context.endpoint_client.address, || env.storage().max_ttl());
|
|
86
|
+
let instance_extend_to = max_ttl.checked_add(1).expect("max_ttl is at u32::MAX");
|
|
87
|
+
|
|
88
|
+
let instance_config = Some(TtlConfig::new(1, instance_extend_to)); // Invalid: extend_to > max_ttl
|
|
89
|
+
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
90
|
+
|
|
91
|
+
context.mock_owner_auth("set_ttl_config", (&instance_config, &persistent_config, &None::<TtlConfig>));
|
|
92
|
+
|
|
93
|
+
assert_eq!(
|
|
94
|
+
endpoint.try_set_ttl_config(&instance_config, &persistent_config, &None).unwrap_err().unwrap(),
|
|
95
|
+
TtlError::InvalidTtlConfig.into()
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ============================================================================
|
|
100
|
+
// Frozen TTL Config Tests
|
|
101
|
+
// ============================================================================
|
|
102
|
+
|
|
103
|
+
#[test]
|
|
104
|
+
fn test_is_ttl_config_frozen_default_false() {
|
|
105
|
+
let context = setup();
|
|
106
|
+
let endpoint = &context.endpoint_client;
|
|
107
|
+
|
|
108
|
+
assert!(!endpoint.is_ttl_config_frozen());
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
#[test]
|
|
112
|
+
fn test_freeze_ttl_config_success() {
|
|
113
|
+
let context = setup();
|
|
114
|
+
let endpoint = &context.endpoint_client;
|
|
115
|
+
|
|
116
|
+
assert!(!endpoint.is_ttl_config_frozen());
|
|
117
|
+
|
|
118
|
+
context.mock_owner_auth("freeze_ttl_config", ());
|
|
119
|
+
endpoint.freeze_ttl_config();
|
|
120
|
+
|
|
121
|
+
assert!(endpoint.is_ttl_config_frozen());
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
#[test]
|
|
125
|
+
#[should_panic(expected = "Error(Auth, InvalidAction)")]
|
|
126
|
+
fn test_freeze_ttl_config_requires_owner() {
|
|
127
|
+
let context = setup();
|
|
128
|
+
let env = &context.env;
|
|
129
|
+
let endpoint = &context.endpoint_client;
|
|
130
|
+
let attacker = Address::generate(env);
|
|
131
|
+
|
|
132
|
+
context.mock_auth(&attacker, "freeze_ttl_config", ());
|
|
133
|
+
endpoint.freeze_ttl_config();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
#[test]
|
|
137
|
+
fn test_freeze_ttl_config_already_frozen() {
|
|
138
|
+
let context = setup();
|
|
139
|
+
let endpoint = &context.endpoint_client;
|
|
140
|
+
|
|
141
|
+
// First freeze
|
|
142
|
+
context.mock_owner_auth("freeze_ttl_config", ());
|
|
143
|
+
endpoint.freeze_ttl_config();
|
|
144
|
+
|
|
145
|
+
// Try to freeze again
|
|
146
|
+
context.mock_owner_auth("freeze_ttl_config", ());
|
|
147
|
+
assert_eq!(endpoint.try_freeze_ttl_config().unwrap_err().unwrap(), TtlError::TtlConfigAlreadyFrozen.into());
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#[test]
|
|
151
|
+
fn test_set_ttl_config_fails_when_frozen() {
|
|
152
|
+
let context = setup();
|
|
153
|
+
let endpoint = &context.endpoint_client;
|
|
154
|
+
|
|
155
|
+
// Freeze first
|
|
156
|
+
context.mock_owner_auth("freeze_ttl_config", ());
|
|
157
|
+
endpoint.freeze_ttl_config();
|
|
158
|
+
|
|
159
|
+
// Try to set TTL config after freeze
|
|
160
|
+
let instance_config = Some(TtlConfig::new(1, 2));
|
|
161
|
+
let persistent_config = Some(TtlConfig::new(1, 2));
|
|
162
|
+
|
|
163
|
+
context.mock_owner_auth("set_ttl_config", (&instance_config, &persistent_config, &None::<TtlConfig>));
|
|
164
|
+
assert_eq!(
|
|
165
|
+
endpoint.try_set_ttl_config(&instance_config, &persistent_config, &None).unwrap_err().unwrap(),
|
|
166
|
+
TtlError::TtlConfigFrozen.into()
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#[test]
|
|
171
|
+
fn test_set_ttl_config_then_freeze() {
|
|
172
|
+
let context = setup();
|
|
173
|
+
let env = &context.env;
|
|
174
|
+
let endpoint = &context.endpoint_client;
|
|
175
|
+
|
|
176
|
+
// Set custom TTL config
|
|
177
|
+
let instance_config = Some(TtlConfig::new(100, 200));
|
|
178
|
+
let persistent_config = Some(TtlConfig::new(300, 400));
|
|
179
|
+
|
|
180
|
+
context.mock_owner_auth("set_ttl_config", (&instance_config, &persistent_config, &None::<TtlConfig>));
|
|
181
|
+
endpoint.set_ttl_config(&instance_config, &persistent_config, &None);
|
|
182
|
+
|
|
183
|
+
// Freeze
|
|
184
|
+
context.mock_owner_auth("freeze_ttl_config", ());
|
|
185
|
+
endpoint.freeze_ttl_config();
|
|
186
|
+
|
|
187
|
+
// Verify config is preserved after freeze
|
|
188
|
+
let (stored_instance, stored_persistent) = ttl_defaults(env, &context.endpoint_client.address);
|
|
189
|
+
assert_eq!(stored_instance, TtlConfig::new(100, 200));
|
|
190
|
+
assert_eq!(stored_persistent, TtlConfig::new(300, 400));
|
|
191
|
+
|
|
192
|
+
// Verify frozen
|
|
193
|
+
assert!(endpoint.is_ttl_config_frozen());
|
|
194
|
+
|
|
195
|
+
// Verify cannot modify after freeze
|
|
196
|
+
let new_instance_config = Some(TtlConfig::new(500, 600));
|
|
197
|
+
context.mock_owner_auth("set_ttl_config", (&new_instance_config, &persistent_config, &None::<TtlConfig>));
|
|
198
|
+
assert_eq!(
|
|
199
|
+
endpoint.try_set_ttl_config(&new_instance_config, &persistent_config, &None).unwrap_err().unwrap(),
|
|
200
|
+
TtlError::TtlConfigFrozen.into()
|
|
201
|
+
);
|
|
202
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
use crate::{tests::endpoint_setup::setup, Origin};
|
|
2
|
+
use soroban_sdk::{testutils::Address as _, BytesN};
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
fn test_verifiable_with_new_path() {
|
|
6
|
+
let context = setup();
|
|
7
|
+
let endpoint_client = &context.endpoint_client;
|
|
8
|
+
let receiver = soroban_sdk::Address::generate(&context.env);
|
|
9
|
+
let src_eid = 2;
|
|
10
|
+
let sender = BytesN::from_array(&context.env, &[1u8; 32]);
|
|
11
|
+
let origin = Origin { src_eid, sender, nonce: 1 };
|
|
12
|
+
|
|
13
|
+
// For a new path (lazy nonce is 0), nonce 1 > 0 should be verifiable
|
|
14
|
+
let result = endpoint_client.verifiable(&origin, &receiver);
|
|
15
|
+
assert!(result);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
#[test]
|
|
19
|
+
fn test_verifiable_with_higher_nonce() {
|
|
20
|
+
let context = setup();
|
|
21
|
+
let endpoint_client = &context.endpoint_client;
|
|
22
|
+
let receiver = soroban_sdk::Address::generate(&context.env);
|
|
23
|
+
let src_eid = 2;
|
|
24
|
+
let sender = BytesN::from_array(&context.env, &[1u8; 32]);
|
|
25
|
+
let origin = Origin { src_eid, sender, nonce: 10 };
|
|
26
|
+
|
|
27
|
+
// For a new path (lazy nonce is 0), nonce 10 > 0 should be verifiable
|
|
28
|
+
let result = endpoint_client.verifiable(&origin, &receiver);
|
|
29
|
+
assert!(result);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#[test]
|
|
33
|
+
fn test_verifiable_after_skip() {
|
|
34
|
+
let context = setup();
|
|
35
|
+
let env = &context.env;
|
|
36
|
+
let endpoint_client = &context.endpoint_client;
|
|
37
|
+
let receiver = soroban_sdk::Address::generate(env);
|
|
38
|
+
let src_eid = 2;
|
|
39
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
40
|
+
|
|
41
|
+
// Skip nonce 1
|
|
42
|
+
use soroban_sdk::{testutils::MockAuth, testutils::MockAuthInvoke, IntoVal};
|
|
43
|
+
env.mock_auths(&[MockAuth {
|
|
44
|
+
address: &receiver,
|
|
45
|
+
invoke: &MockAuthInvoke {
|
|
46
|
+
contract: &endpoint_client.address,
|
|
47
|
+
fn_name: "skip",
|
|
48
|
+
args: (&receiver, &receiver, &src_eid, &sender, &1u64).into_val(env),
|
|
49
|
+
sub_invokes: &[],
|
|
50
|
+
},
|
|
51
|
+
}]);
|
|
52
|
+
endpoint_client.skip(&receiver, &receiver, &src_eid, &sender, &1);
|
|
53
|
+
|
|
54
|
+
// Now lazy_nonce = 1, nonce 2 > 1 should be verifiable
|
|
55
|
+
let origin = Origin { src_eid, sender, nonce: 2 };
|
|
56
|
+
let result = endpoint_client.verifiable(&origin, &receiver);
|
|
57
|
+
assert!(result);
|
|
58
|
+
}
|
|
59
|
+
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
use crate::util::build_payload;
|
|
2
|
+
use crate::{
|
|
3
|
+
events::PacketVerified,
|
|
4
|
+
storage,
|
|
5
|
+
tests::{endpoint_setup::setup, mock::MockReceiver},
|
|
6
|
+
util::keccak256,
|
|
7
|
+
Origin,
|
|
8
|
+
};
|
|
9
|
+
use soroban_sdk::{
|
|
10
|
+
testutils::{MockAuth, MockAuthInvoke},
|
|
11
|
+
vec, Bytes, BytesN, IntoVal,
|
|
12
|
+
};
|
|
13
|
+
use utils::testing_utils::assert_event;
|
|
14
|
+
|
|
15
|
+
#[test]
|
|
16
|
+
fn test_verify_success() {
|
|
17
|
+
let context = setup();
|
|
18
|
+
let env = &context.env;
|
|
19
|
+
let endpoint_client = &context.endpoint_client;
|
|
20
|
+
|
|
21
|
+
let src_eid = 2u32;
|
|
22
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
23
|
+
let receiver = env.register(MockReceiver, ());
|
|
24
|
+
let nonce = 1u64;
|
|
25
|
+
|
|
26
|
+
// Setup receive library
|
|
27
|
+
let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
|
|
28
|
+
context.mock_owner_auth("register_library", (&receive_lib,));
|
|
29
|
+
endpoint_client.register_library(&receive_lib);
|
|
30
|
+
context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
|
|
31
|
+
endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
|
|
32
|
+
|
|
33
|
+
// Create payload hash
|
|
34
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
35
|
+
let guid = BytesN::from_array(env, &[5u8; 32]);
|
|
36
|
+
let payload = build_payload(env, &guid, &message);
|
|
37
|
+
let payload_hash = keccak256(env, &payload);
|
|
38
|
+
|
|
39
|
+
let origin = Origin { src_eid, sender: sender.clone(), nonce };
|
|
40
|
+
|
|
41
|
+
// Verify initial state - inbound payload hash should not exist
|
|
42
|
+
let initial_hash = env.as_contract(&endpoint_client.address, || {
|
|
43
|
+
storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
|
|
44
|
+
});
|
|
45
|
+
assert_eq!(initial_hash, None, "Initial inbound payload hash should be None");
|
|
46
|
+
|
|
47
|
+
// Mock auth for receive_lib
|
|
48
|
+
env.mock_auths(&[MockAuth {
|
|
49
|
+
address: &receive_lib,
|
|
50
|
+
invoke: &MockAuthInvoke {
|
|
51
|
+
contract: &endpoint_client.address,
|
|
52
|
+
fn_name: "verify",
|
|
53
|
+
args: (&receive_lib, &origin, &receiver, &payload_hash).into_val(env),
|
|
54
|
+
sub_invokes: &[],
|
|
55
|
+
},
|
|
56
|
+
}]);
|
|
57
|
+
|
|
58
|
+
endpoint_client.verify(&receive_lib, &origin, &receiver, &payload_hash);
|
|
59
|
+
|
|
60
|
+
// Verify PacketVerified event was published
|
|
61
|
+
assert_event(
|
|
62
|
+
env,
|
|
63
|
+
&endpoint_client.address,
|
|
64
|
+
PacketVerified { origin: origin.clone(), receiver: receiver.clone(), payload_hash: payload_hash.clone() },
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
// Verify inbound payload hash was stored via public interface
|
|
68
|
+
let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
|
|
69
|
+
assert_eq!(stored_hash, Some(payload_hash.clone()));
|
|
70
|
+
|
|
71
|
+
// Assert storage change directly
|
|
72
|
+
let stored_hash_direct = env.as_contract(&endpoint_client.address, || {
|
|
73
|
+
storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce)
|
|
74
|
+
});
|
|
75
|
+
assert_eq!(stored_hash_direct, Some(payload_hash), "Storage should contain the inbound payload hash");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#[test]
|
|
79
|
+
fn test_verify_stores_payload_hash() {
|
|
80
|
+
let context = setup();
|
|
81
|
+
let env = &context.env;
|
|
82
|
+
let endpoint_client = &context.endpoint_client;
|
|
83
|
+
|
|
84
|
+
let src_eid = 2u32;
|
|
85
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
86
|
+
let receiver = env.register(MockReceiver, ());
|
|
87
|
+
let nonce = 1u64;
|
|
88
|
+
|
|
89
|
+
// Setup receive library
|
|
90
|
+
let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
|
|
91
|
+
context.mock_owner_auth("register_library", (&receive_lib,));
|
|
92
|
+
endpoint_client.register_library(&receive_lib);
|
|
93
|
+
context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
|
|
94
|
+
endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
|
|
95
|
+
|
|
96
|
+
// Create payload hash
|
|
97
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
98
|
+
let guid = BytesN::from_array(env, &[5u8; 32]);
|
|
99
|
+
let payload = build_payload(env, &guid, &message);
|
|
100
|
+
let payload_hash = keccak256(env, &payload);
|
|
101
|
+
|
|
102
|
+
let origin = Origin { src_eid, sender: sender.clone(), nonce };
|
|
103
|
+
|
|
104
|
+
// Mock auth for receive_lib
|
|
105
|
+
env.mock_auths(&[MockAuth {
|
|
106
|
+
address: &receive_lib,
|
|
107
|
+
invoke: &MockAuthInvoke {
|
|
108
|
+
contract: &endpoint_client.address,
|
|
109
|
+
fn_name: "verify",
|
|
110
|
+
args: (&receive_lib, &origin, &receiver, &payload_hash).into_val(env),
|
|
111
|
+
sub_invokes: &[],
|
|
112
|
+
},
|
|
113
|
+
}]);
|
|
114
|
+
|
|
115
|
+
endpoint_client.verify(&receive_lib, &origin, &receiver, &payload_hash);
|
|
116
|
+
|
|
117
|
+
// Verify inbound payload hash was stored
|
|
118
|
+
let stored_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
|
|
119
|
+
assert_eq!(stored_hash, Some(payload_hash));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
#[test]
|
|
123
|
+
fn test_verify_multiple_nonces() {
|
|
124
|
+
let context = setup();
|
|
125
|
+
let env = &context.env;
|
|
126
|
+
let endpoint_client = &context.endpoint_client;
|
|
127
|
+
|
|
128
|
+
let src_eid = 2u32;
|
|
129
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
130
|
+
let receiver = env.register(MockReceiver, ());
|
|
131
|
+
|
|
132
|
+
// Setup receive library
|
|
133
|
+
let receive_lib = context.setup_mock_receive_lib(vec![env, src_eid]);
|
|
134
|
+
context.mock_owner_auth("register_library", (&receive_lib,));
|
|
135
|
+
endpoint_client.register_library(&receive_lib);
|
|
136
|
+
context.mock_owner_auth("set_default_receive_library", (&src_eid, &receive_lib, &0u64));
|
|
137
|
+
endpoint_client.set_default_receive_library(&src_eid, &receive_lib, &0);
|
|
138
|
+
|
|
139
|
+
// Verify nonce 1
|
|
140
|
+
let payload_hash1 = BytesN::from_array(env, &[1u8; 32]);
|
|
141
|
+
let origin1 = Origin { src_eid, sender: sender.clone(), nonce: 1 };
|
|
142
|
+
env.mock_auths(&[MockAuth {
|
|
143
|
+
address: &receive_lib,
|
|
144
|
+
invoke: &MockAuthInvoke {
|
|
145
|
+
contract: &endpoint_client.address,
|
|
146
|
+
fn_name: "verify",
|
|
147
|
+
args: (&receive_lib, &origin1, &receiver, &payload_hash1).into_val(env),
|
|
148
|
+
sub_invokes: &[],
|
|
149
|
+
},
|
|
150
|
+
}]);
|
|
151
|
+
endpoint_client.verify(&receive_lib, &origin1, &receiver, &payload_hash1);
|
|
152
|
+
|
|
153
|
+
// Verify nonce 2
|
|
154
|
+
let payload_hash2 = BytesN::from_array(env, &[2u8; 32]);
|
|
155
|
+
let origin2 = Origin { src_eid, sender: sender.clone(), nonce: 2 };
|
|
156
|
+
env.mock_auths(&[MockAuth {
|
|
157
|
+
address: &receive_lib,
|
|
158
|
+
invoke: &MockAuthInvoke {
|
|
159
|
+
contract: &endpoint_client.address,
|
|
160
|
+
fn_name: "verify",
|
|
161
|
+
args: (&receive_lib, &origin2, &receiver, &payload_hash2).into_val(env),
|
|
162
|
+
sub_invokes: &[],
|
|
163
|
+
},
|
|
164
|
+
}]);
|
|
165
|
+
endpoint_client.verify(&receive_lib, &origin2, &receiver, &payload_hash2);
|
|
166
|
+
|
|
167
|
+
// Verify both payload hashes were stored
|
|
168
|
+
let stored_hash1 = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &1);
|
|
169
|
+
let stored_hash2 = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &2);
|
|
170
|
+
assert_eq!(stored_hash1, Some(payload_hash1));
|
|
171
|
+
assert_eq!(stored_hash2, Some(payload_hash2));
|
|
172
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
use crate::tests::endpoint_setup::setup;
|
|
2
|
+
|
|
3
|
+
#[test]
|
|
4
|
+
fn test_zro_when_not_set() {
|
|
5
|
+
let context = setup();
|
|
6
|
+
let endpoint_client = &context.endpoint_client;
|
|
7
|
+
|
|
8
|
+
let zro_token = endpoint_client.zro();
|
|
9
|
+
assert_eq!(zro_token, None);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#[test]
|
|
13
|
+
fn test_zro_after_set() {
|
|
14
|
+
let context = setup();
|
|
15
|
+
let endpoint_client = &context.endpoint_client;
|
|
16
|
+
|
|
17
|
+
// Set ZRO token
|
|
18
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
19
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
20
|
+
|
|
21
|
+
let zro_token = endpoint_client.zro();
|
|
22
|
+
assert_eq!(zro_token, Some(context.zro_token_client.address));
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
mod register_library;
|
|
2
|
+
mod require_registered;
|
|
3
|
+
mod require_supported_eid;
|
|
4
|
+
mod set_config;
|
|
5
|
+
mod set_default_receive_lib_timeout;
|
|
6
|
+
mod set_default_receive_library;
|
|
7
|
+
mod set_default_send_library;
|
|
8
|
+
mod set_receive_library;
|
|
9
|
+
mod set_receive_library_timeout;
|
|
10
|
+
mod set_send_library;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
use crate::{
|
|
2
|
+
events::LibraryRegistered,
|
|
3
|
+
storage,
|
|
4
|
+
tests::{
|
|
5
|
+
endpoint_setup::setup,
|
|
6
|
+
mock::{MockMessageLib, MockValidMessageLib},
|
|
7
|
+
},
|
|
8
|
+
};
|
|
9
|
+
use soroban_sdk::{testutils::Address as _, vec, Address};
|
|
10
|
+
use utils::testing_utils::assert_event;
|
|
11
|
+
|
|
12
|
+
use crate::errors::EndpointError;
|
|
13
|
+
|
|
14
|
+
#[test]
|
|
15
|
+
fn test_register_library() {
|
|
16
|
+
let context = setup();
|
|
17
|
+
let env = &context.env;
|
|
18
|
+
let endpoint_client = &context.endpoint_client;
|
|
19
|
+
|
|
20
|
+
// mock a valid message lib
|
|
21
|
+
let lib = env.register(MockValidMessageLib, ());
|
|
22
|
+
|
|
23
|
+
// Verify initial state - library count should be 0
|
|
24
|
+
let initial_count =
|
|
25
|
+
env.as_contract(&endpoint_client.address, || storage::EndpointStorage::registered_library_count(env));
|
|
26
|
+
assert_eq!(initial_count, 0, "Initial library count should be 0");
|
|
27
|
+
|
|
28
|
+
// Mock owner auth for register_library
|
|
29
|
+
context.mock_owner_auth("register_library", (&lib,));
|
|
30
|
+
|
|
31
|
+
endpoint_client.register_library(&lib);
|
|
32
|
+
|
|
33
|
+
// Assert event was published
|
|
34
|
+
assert_event(env, &endpoint_client.address, LibraryRegistered { new_lib: lib.clone() });
|
|
35
|
+
|
|
36
|
+
// Assert public interface methods work
|
|
37
|
+
assert!(endpoint_client.is_registered_library(&lib));
|
|
38
|
+
|
|
39
|
+
let libraries = endpoint_client.get_registered_libraries(&0, &1);
|
|
40
|
+
assert_eq!(libraries, vec![&env, lib.clone()]);
|
|
41
|
+
|
|
42
|
+
// Assert storage changes directly
|
|
43
|
+
let lib_clone = lib.clone();
|
|
44
|
+
env.as_contract(&endpoint_client.address, || {
|
|
45
|
+
// Verify library was assigned ID 0 (first library)
|
|
46
|
+
let library_id = storage::EndpointStorage::library_to_index(env, &lib_clone);
|
|
47
|
+
assert_eq!(library_id, Some(0), "Library should be assigned ID 0");
|
|
48
|
+
|
|
49
|
+
// Verify ID 0 maps back to the library
|
|
50
|
+
let stored_lib = storage::EndpointStorage::index_to_library(env, 0);
|
|
51
|
+
assert_eq!(stored_lib, Some(lib_clone.clone()), "ID 0 should map to the registered library");
|
|
52
|
+
|
|
53
|
+
// Verify library count was incremented
|
|
54
|
+
let new_count = storage::EndpointStorage::registered_library_count(env);
|
|
55
|
+
assert_eq!(new_count, 1, "Library count should be incremented to 1");
|
|
56
|
+
|
|
57
|
+
// Verify has_library_to_id returns true
|
|
58
|
+
let has_library = storage::EndpointStorage::has_library_to_index(env, &lib_clone);
|
|
59
|
+
assert!(has_library, "has_library_to_id should return true for registered library");
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
#[test]
|
|
64
|
+
fn test_register_library_is_already_registered() {
|
|
65
|
+
let context = setup();
|
|
66
|
+
let env = &context.env;
|
|
67
|
+
let endpoint_client = &context.endpoint_client;
|
|
68
|
+
|
|
69
|
+
// mock a valid message lib
|
|
70
|
+
let lib = env.register(MockValidMessageLib, ());
|
|
71
|
+
|
|
72
|
+
// First registration with owner auth
|
|
73
|
+
context.mock_owner_auth("register_library", (&lib,));
|
|
74
|
+
endpoint_client.register_library(&lib);
|
|
75
|
+
|
|
76
|
+
// Try to register the same library again with owner auth
|
|
77
|
+
context.mock_owner_auth("register_library", (&lib,));
|
|
78
|
+
let result = endpoint_client.try_register_library(&lib);
|
|
79
|
+
|
|
80
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::AlreadyRegistered.into());
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#[test]
|
|
84
|
+
fn test_register_library_is_unsupported_interface() {
|
|
85
|
+
let context = setup();
|
|
86
|
+
let env = &context.env;
|
|
87
|
+
let endpoint_client = &context.endpoint_client;
|
|
88
|
+
|
|
89
|
+
let random_lib_address = Address::generate(env);
|
|
90
|
+
|
|
91
|
+
// Mock owner auth for register_library
|
|
92
|
+
context.mock_owner_auth("register_library", (&random_lib_address,));
|
|
93
|
+
|
|
94
|
+
let result = endpoint_client.try_register_library(&random_lib_address);
|
|
95
|
+
assert!(result.is_err());
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#[test]
|
|
99
|
+
fn test_register_library_owner_auth() {
|
|
100
|
+
let context = setup();
|
|
101
|
+
let env = &context.env;
|
|
102
|
+
let endpoint_client = &context.endpoint_client;
|
|
103
|
+
|
|
104
|
+
// Deploy a mock message library contract
|
|
105
|
+
let lib = env.register(MockMessageLib, ());
|
|
106
|
+
|
|
107
|
+
// Mock owner auth for register_library
|
|
108
|
+
context.mock_owner_auth("register_library", (&lib,));
|
|
109
|
+
|
|
110
|
+
// should succeed
|
|
111
|
+
endpoint_client.register_library(&lib);
|
|
112
|
+
|
|
113
|
+
let library = endpoint_client.get_registered_libraries(&0, &1);
|
|
114
|
+
assert_eq!(library, vec![env, lib]);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
#[test]
|
|
118
|
+
#[should_panic(expected = "Error(Auth, InvalidAction)")]
|
|
119
|
+
fn test_register_library_without_owner_auth() {
|
|
120
|
+
let context = setup();
|
|
121
|
+
let env = &context.env;
|
|
122
|
+
let endpoint_client = &context.endpoint_client;
|
|
123
|
+
|
|
124
|
+
let lib = Address::generate(env);
|
|
125
|
+
let non_owner = Address::generate(env);
|
|
126
|
+
|
|
127
|
+
// Mock auth for non-owner
|
|
128
|
+
context.mock_auth(&non_owner, "register_library", (&lib,));
|
|
129
|
+
|
|
130
|
+
endpoint_client.register_library(&lib);
|
|
131
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
use crate::{
|
|
2
|
+
tests::{endpoint_setup::setup, mock::MockValidMessageLib},
|
|
3
|
+
EndpointV2,
|
|
4
|
+
};
|
|
5
|
+
use soroban_sdk::{testutils::Address as _, Address};
|
|
6
|
+
|
|
7
|
+
// Unit tests for require functions
|
|
8
|
+
|
|
9
|
+
#[test]
|
|
10
|
+
#[should_panic(expected = "Error(Contract, #15)")] // EndpointError::OnlyRegisteredLib
|
|
11
|
+
fn test_require_registered_with_unregistered_lib() {
|
|
12
|
+
let context = setup();
|
|
13
|
+
let env = &context.env;
|
|
14
|
+
let endpoint_client = &context.endpoint_client;
|
|
15
|
+
let unregistered_lib = Address::generate(env);
|
|
16
|
+
|
|
17
|
+
env.as_contract(&endpoint_client.address, || EndpointV2::require_registered(env, &unregistered_lib));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
#[test]
|
|
21
|
+
fn test_require_registered_with_registered_lib() {
|
|
22
|
+
let context = setup();
|
|
23
|
+
let env = &context.env;
|
|
24
|
+
let endpoint_client = &context.endpoint_client;
|
|
25
|
+
|
|
26
|
+
// Register a valid message lib
|
|
27
|
+
let lib = env.register(MockValidMessageLib, ());
|
|
28
|
+
|
|
29
|
+
// Mock owner auth for register_library
|
|
30
|
+
context.mock_owner_auth("register_library", (&lib,));
|
|
31
|
+
endpoint_client.register_library(&lib);
|
|
32
|
+
|
|
33
|
+
// Should not panic
|
|
34
|
+
env.as_contract(&endpoint_client.address, || EndpointV2::require_registered(env, &lib));
|
|
35
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
use crate::{tests::endpoint_setup::setup, EndpointV2, MessageLibType};
|
|
2
|
+
use soroban_sdk::{testutils::Address as _, vec, Address};
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
#[should_panic(expected = "Error(Contract, #22)")] // EndpointError::UnsupportedEid
|
|
6
|
+
fn test_require_supported_eid_with_unsupported() {
|
|
7
|
+
let context = setup();
|
|
8
|
+
let env = &context.env;
|
|
9
|
+
let endpoint_client = &context.endpoint_client;
|
|
10
|
+
|
|
11
|
+
let unsupported_eid = context.eid + 1;
|
|
12
|
+
let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
|
|
13
|
+
env.as_contract(&endpoint_client.address, || EndpointV2::require_supported_eid(env, &send_lib, unsupported_eid));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
#[test]
|
|
17
|
+
#[should_panic(expected = "trying to get non-existing value for contract instance")]
|
|
18
|
+
fn test_require_supported_eid_with_non_deployed_lib() {
|
|
19
|
+
let context = setup();
|
|
20
|
+
let env = &context.env;
|
|
21
|
+
let endpoint_client = &context.endpoint_client;
|
|
22
|
+
|
|
23
|
+
// Address that doesn't have a contract deployed
|
|
24
|
+
let non_existent_lib = Address::generate(env);
|
|
25
|
+
env.as_contract(&endpoint_client.address, || {
|
|
26
|
+
EndpointV2::require_supported_eid(env, &non_existent_lib, context.eid)
|
|
27
|
+
});
|
|
28
|
+
}
|