@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
package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs
CHANGED
|
@@ -3,7 +3,7 @@ use soroban_sdk::{
|
|
|
3
3
|
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
4
4
|
vec, Address, IntoVal,
|
|
5
5
|
};
|
|
6
|
-
use utils::testing_utils::
|
|
6
|
+
use utils::testing_utils::assert_eq_event;
|
|
7
7
|
|
|
8
8
|
use crate::{
|
|
9
9
|
errors::Uln302Error,
|
|
@@ -44,7 +44,7 @@ fn test_set_default_executor_configs() {
|
|
|
44
44
|
uln302.set_default_executor_configs(&executor_configs);
|
|
45
45
|
|
|
46
46
|
// Assert DefaultExecutorConfigSet event was published with all params
|
|
47
|
-
|
|
47
|
+
assert_eq_event(&env, &uln302.address, DefaultExecutorConfigsSet { params: executor_configs.clone() });
|
|
48
48
|
|
|
49
49
|
let uln302_send_client = SendUln302Client::new(&env, &uln302.address);
|
|
50
50
|
for config_param in executor_configs.clone() {
|
package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs
CHANGED
|
@@ -3,7 +3,7 @@ use soroban_sdk::{
|
|
|
3
3
|
testutils::{MockAuth, MockAuthInvoke},
|
|
4
4
|
vec, IntoVal,
|
|
5
5
|
};
|
|
6
|
-
use utils::testing_utils::
|
|
6
|
+
use utils::testing_utils::assert_eq_event;
|
|
7
7
|
|
|
8
8
|
use crate::{
|
|
9
9
|
errors::Uln302Error,
|
|
@@ -34,7 +34,7 @@ fn test_set_default_send_uln_configs() {
|
|
|
34
34
|
uln302.set_default_send_uln_configs(&oapp_send_uln_configs);
|
|
35
35
|
|
|
36
36
|
// Assert DefaultSendUlnConfigSet event was published with all params
|
|
37
|
-
|
|
37
|
+
assert_eq_event(&env, &uln302.address, DefaultSendUlnConfigsSet { params: oapp_send_uln_configs.clone() });
|
|
38
38
|
|
|
39
39
|
let uln302_send_client = SendUln302Client::new(&env, &uln302.address);
|
|
40
40
|
for config in oapp_send_uln_configs.clone() {
|
|
@@ -18,7 +18,6 @@ oapp-macros = { workspace = true }
|
|
|
18
18
|
|
|
19
19
|
[dev-dependencies]
|
|
20
20
|
soroban-sdk = { workspace = true, features = ["testutils"] }
|
|
21
|
-
assert_unordered = "0.3.5"
|
|
22
21
|
simple-message-lib = { workspace = true }
|
|
23
22
|
message-lib-common = { workspace = true, features = ["testutils"] }
|
|
24
23
|
endpoint-v2 = { workspace = true, features = ["testutils"] }
|
|
@@ -27,12 +26,12 @@ uln302 = { workspace = true, features = ["testutils"] }
|
|
|
27
26
|
dvn = { workspace = true, features = ["testutils"] }
|
|
28
27
|
dvn-fee-lib = { workspace = true }
|
|
29
28
|
executor-fee-lib = { workspace = true }
|
|
30
|
-
worker = { workspace = true }
|
|
31
29
|
treasury = { workspace = true, features = ["testutils"] }
|
|
32
30
|
price-feed = { workspace = true }
|
|
31
|
+
fee-lib-interfaces = { workspace = true }
|
|
33
32
|
executor-helper = { workspace = true }
|
|
34
33
|
# For real DVN signature verification in integration tests
|
|
35
|
-
k256 =
|
|
36
|
-
sha3 =
|
|
37
|
-
rand =
|
|
38
|
-
ed25519-dalek =
|
|
34
|
+
k256 = { workspace = true }
|
|
35
|
+
sha3 = { workspace = true }
|
|
36
|
+
rand = { workspace = true }
|
|
37
|
+
ed25519-dalek = { workspace = true }
|
|
@@ -13,6 +13,7 @@ use endpoint_v2::{EndpointV2, EndpointV2Client};
|
|
|
13
13
|
use executor::{DstConfig as ExecutorDstConfig, ExecutorClient, LzExecutor, SetDstConfigParam};
|
|
14
14
|
use executor_fee_lib::ExecutorFeeLib;
|
|
15
15
|
use executor_helper::{ExecutorHelper, ExecutorHelperClient};
|
|
16
|
+
use fee_lib_interfaces::Price;
|
|
16
17
|
use price_feed::{types::UpdatePrice, LzPriceFeed};
|
|
17
18
|
use soroban_sdk::{
|
|
18
19
|
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
@@ -25,7 +26,6 @@ use uln302::{
|
|
|
25
26
|
Uln302, Uln302Client, UlnConfig,
|
|
26
27
|
};
|
|
27
28
|
use utils::{buffer_reader::BufferReader, buffer_writer::BufferWriter};
|
|
28
|
-
use worker::Price;
|
|
29
29
|
|
|
30
30
|
pub const CONFIRMATIONS: u64 = 1;
|
|
31
31
|
pub const MAX_MESSAGE_SIZE: u32 = 10000;
|
|
@@ -11,6 +11,7 @@ use soroban_sdk::{
|
|
|
11
11
|
Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val, Vec,
|
|
12
12
|
};
|
|
13
13
|
use utils::buffer_reader::BufferReader;
|
|
14
|
+
use utils::testing_utils::decode_event_topics_data;
|
|
14
15
|
|
|
15
16
|
/// Trait for common fields in chain setup structs.
|
|
16
17
|
/// Both SML and ULN302 ChainSetup implement this trait.
|
|
@@ -215,13 +216,15 @@ pub fn validate_packet<'a, C: ChainSetupCommon<'a>>(
|
|
|
215
216
|
|
|
216
217
|
/// Scans for the latest packet_sent event and returns (encoded_payload, options, send_library).
|
|
217
218
|
pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, Bytes, Address)> {
|
|
218
|
-
let events = env.events().all();
|
|
219
|
+
let events = env.events().all().filter_by_contract(endpoint);
|
|
219
220
|
let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
|
|
220
221
|
|
|
221
222
|
// Iterate in reverse to find the most recent packet sent event
|
|
222
|
-
for
|
|
223
|
-
let (
|
|
224
|
-
|
|
223
|
+
for event in events.events().iter().rev() {
|
|
224
|
+
let Some((topics, data)) = decode_event_topics_data(env, event) else {
|
|
225
|
+
continue;
|
|
226
|
+
};
|
|
227
|
+
if topics.contains(packet_sent_symbol) {
|
|
225
228
|
let map: Map<Symbol, Val> = data.into_val(env);
|
|
226
229
|
|
|
227
230
|
let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
|
|
@@ -240,13 +243,15 @@ pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, B
|
|
|
240
243
|
/// Use this only after all messages have been sent in a single "transaction" or collect events incrementally.
|
|
241
244
|
#[allow(dead_code)]
|
|
242
245
|
pub fn scan_all_packet_sent_events(env: &Env, endpoint: &Address) -> Vec<(Bytes, Bytes, Address)> {
|
|
243
|
-
let events = env.events().all();
|
|
246
|
+
let events = env.events().all().filter_by_contract(endpoint);
|
|
244
247
|
let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
|
|
245
248
|
let mut result = Vec::new(env);
|
|
246
249
|
|
|
247
|
-
for
|
|
248
|
-
let (
|
|
249
|
-
|
|
250
|
+
for event in events.events().iter() {
|
|
251
|
+
let Some((topics, data)) = decode_event_topics_data(env, event) else {
|
|
252
|
+
continue;
|
|
253
|
+
};
|
|
254
|
+
if topics.contains(packet_sent_symbol) {
|
|
250
255
|
let map: Map<Symbol, Val> = data.into_val(env);
|
|
251
256
|
|
|
252
257
|
let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
|
|
@@ -265,13 +270,15 @@ pub type ComposeSentEvent = (Address, Address, BytesN<32>, u32, Bytes);
|
|
|
265
270
|
|
|
266
271
|
/// Scans for the latest compose_sent event and returns (from, to, guid, index, message).
|
|
267
272
|
pub fn scan_compose_sent_event(env: &Env, endpoint: &Address) -> Option<ComposeSentEvent> {
|
|
268
|
-
let events = env.events().all();
|
|
273
|
+
let events = env.events().all().filter_by_contract(endpoint);
|
|
269
274
|
let compose_sent_symbol = Symbol::new(env, "compose_sent").to_val();
|
|
270
275
|
|
|
271
276
|
// Iterate in reverse to find the most recent compose sent event
|
|
272
|
-
for
|
|
273
|
-
let (
|
|
274
|
-
|
|
277
|
+
for event in events.events().iter().rev() {
|
|
278
|
+
let Some((topics, data)) = decode_event_topics_data(env, event) else {
|
|
279
|
+
continue;
|
|
280
|
+
};
|
|
281
|
+
if topics.contains(compose_sent_symbol) {
|
|
275
282
|
let map: Map<Symbol, Val> = data.into_val(env);
|
|
276
283
|
let from: Address = topics.get(1).unwrap().into_val(env);
|
|
277
284
|
let to: Address = topics.get(2).unwrap().into_val(env);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//! OApp Message Inspector interface.
|
|
2
|
+
//!
|
|
3
|
+
//! This module defines the `IOAppMsgInspector` trait that external inspector contracts
|
|
4
|
+
//! must implement to validate outgoing LayerZero messages and options.
|
|
5
|
+
//!
|
|
6
|
+
//! ## Usage
|
|
7
|
+
//!
|
|
8
|
+
//! Inspector contracts should implement this trait and panic if inspection fails:
|
|
9
|
+
//!
|
|
10
|
+
//! ```ignore
|
|
11
|
+
//! use oapp::interfaces::IOAppMsgInspector;
|
|
12
|
+
//!
|
|
13
|
+
//! pub struct MyInspector;
|
|
14
|
+
//!
|
|
15
|
+
//! #[contractimpl]
|
|
16
|
+
//! impl IOAppMsgInspector for MyInspector {
|
|
17
|
+
//! fn inspect(env: &Env, oapp: &Address, message: &Bytes, options: &Bytes) {
|
|
18
|
+
//! // Validate message and options
|
|
19
|
+
//! // Panic if invalid
|
|
20
|
+
//! if !is_valid(message, options) {
|
|
21
|
+
//! panic_with_error!(env, MyError::InspectionFailed);
|
|
22
|
+
//! }
|
|
23
|
+
//! }
|
|
24
|
+
//! }
|
|
25
|
+
//! ```
|
|
26
|
+
|
|
27
|
+
use soroban_sdk::{contractclient, Address, Bytes, Env};
|
|
28
|
+
|
|
29
|
+
/// Interface for OApp message inspectors.
|
|
30
|
+
///
|
|
31
|
+
/// Contracts implementing this trait can be set as message inspectors on OFT contracts
|
|
32
|
+
/// to validate outgoing messages and options before they are sent cross-chain.
|
|
33
|
+
///
|
|
34
|
+
/// If inspection fails, the implementation should panic to revert the transaction.
|
|
35
|
+
#[contractclient(name = "OAppMsgInspectorClient")]
|
|
36
|
+
pub trait IOAppMsgInspector {
|
|
37
|
+
/// Inspects the LayerZero message and options before sending.
|
|
38
|
+
///
|
|
39
|
+
/// # Arguments
|
|
40
|
+
/// * `oapp` - The address of the OApp contract sending the message
|
|
41
|
+
/// * `message` - The encoded message payload to be sent
|
|
42
|
+
/// * `options` - The LayerZero options for the message
|
|
43
|
+
///
|
|
44
|
+
/// # Panics
|
|
45
|
+
/// Should panic if the message or options are invalid, reverting the transaction.
|
|
46
|
+
fn inspect(env: &Env, oapp: &Address, message: &Bytes, options: &Bytes);
|
|
47
|
+
}
|
|
@@ -149,10 +149,10 @@ mod test_full_manual_options {
|
|
|
149
149
|
extern crate self as oapp;
|
|
150
150
|
|
|
151
151
|
use endpoint_v2::Origin;
|
|
152
|
-
use oapp::oapp_options_type3::
|
|
152
|
+
use oapp::oapp_options_type3::OAppOptionsType3;
|
|
153
153
|
use oapp::oapp_receiver::LzReceiveInternal;
|
|
154
154
|
use oapp_macros::oapp;
|
|
155
|
-
use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env
|
|
155
|
+
use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
|
|
156
156
|
|
|
157
157
|
#[oapp(custom = [options_type3])]
|
|
158
158
|
struct TestFullManualOptions;
|
|
@@ -354,12 +354,12 @@ mod test_full_manual_all {
|
|
|
354
354
|
use endpoint_v2::Origin;
|
|
355
355
|
use oapp::{
|
|
356
356
|
oapp_core::OAppCore,
|
|
357
|
-
oapp_options_type3::
|
|
357
|
+
oapp_options_type3::OAppOptionsType3,
|
|
358
358
|
oapp_receiver::{LzReceiveInternal, OAppReceiver},
|
|
359
359
|
oapp_sender::OAppSenderInternal,
|
|
360
360
|
};
|
|
361
361
|
use oapp_macros::oapp;
|
|
362
|
-
use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env
|
|
362
|
+
use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
|
|
363
363
|
|
|
364
364
|
#[oapp(custom = [core, sender, receiver, options_type3])]
|
|
365
365
|
struct TestFullManualAll;
|
|
@@ -57,7 +57,7 @@ pub trait OAppCore: Ownable {
|
|
|
57
57
|
/// A tuple containing:
|
|
58
58
|
/// - `sender_version`: The version of the OAppSender
|
|
59
59
|
/// - `receiver_version`: The version of the OAppReceiver
|
|
60
|
-
fn oapp_version(_env: &Env) -> (u64, u64) {
|
|
60
|
+
fn oapp_version(_env: &soroban_sdk::Env) -> (u64, u64) {
|
|
61
61
|
(1, 1)
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -65,7 +65,7 @@ pub trait OAppCore: Ownable {
|
|
|
65
65
|
///
|
|
66
66
|
/// # Returns
|
|
67
67
|
/// The LayerZero endpoint address
|
|
68
|
-
fn endpoint(env: &Env) -> Address {
|
|
68
|
+
fn endpoint(env: &soroban_sdk::Env) -> soroban_sdk::Address {
|
|
69
69
|
OAppCoreStorage::endpoint(env).unwrap()
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -76,7 +76,7 @@ pub trait OAppCore: Ownable {
|
|
|
76
76
|
///
|
|
77
77
|
/// # Returns
|
|
78
78
|
/// The peer address (OApp instance) associated with the corresponding endpoint
|
|
79
|
-
fn peer(env: &Env, eid: u32) -> Option<BytesN<32>> {
|
|
79
|
+
fn peer(env: &soroban_sdk::Env, eid: u32) -> Option<soroban_sdk::BytesN<32>> {
|
|
80
80
|
OAppCoreStorage::peer(env, eid)
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -86,7 +86,7 @@ pub trait OAppCore: Ownable {
|
|
|
86
86
|
/// * `eid` - The endpoint ID
|
|
87
87
|
/// * `peer` - The address of the peer to be associated with the corresponding endpoint, or None to remove the peer
|
|
88
88
|
#[only_auth]
|
|
89
|
-
fn set_peer(env: &Env, eid: u32, peer: &Option<BytesN<32>>) {
|
|
89
|
+
fn set_peer(env: &soroban_sdk::Env, eid: u32, peer: &Option<soroban_sdk::BytesN<32>>) {
|
|
90
90
|
OAppCoreStorage::set_or_remove_peer(env, eid, peer);
|
|
91
91
|
PeerSet { eid, peer: peer.clone() }.publish(env);
|
|
92
92
|
}
|
|
@@ -96,7 +96,7 @@ pub trait OAppCore: Ownable {
|
|
|
96
96
|
/// # Arguments
|
|
97
97
|
/// * `delegate` - The address of the delegate to be set, or None to remove the delegate
|
|
98
98
|
#[only_auth]
|
|
99
|
-
fn set_delegate(env: &Env, delegate: &Option<Address>) {
|
|
99
|
+
fn set_delegate(env: &soroban_sdk::Env, delegate: &Option<soroban_sdk::Address>) {
|
|
100
100
|
endpoint_client::<Self>(env).set_delegate(&env.current_contract_address(), delegate);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use crate::errors::OAppError;
|
|
1
|
+
use crate::{self as oapp, errors::OAppError};
|
|
2
2
|
use common_macros::{contract_trait, only_auth, storage};
|
|
3
3
|
use soroban_sdk::{assert_with_error, contractevent, contracttype, panic_with_error, Bytes, Env, Vec};
|
|
4
4
|
use utils::{buffer_reader::BufferReader, ownable::Ownable};
|
|
@@ -40,7 +40,7 @@ pub trait OAppOptionsType3: Ownable {
|
|
|
40
40
|
///
|
|
41
41
|
/// # Returns
|
|
42
42
|
/// The enforced options for the given endpoint and message type
|
|
43
|
-
fn enforced_options(env: &Env, eid: u32, msg_type: u32) -> Bytes {
|
|
43
|
+
fn enforced_options(env: &soroban_sdk::Env, eid: u32, msg_type: u32) -> soroban_sdk::Bytes {
|
|
44
44
|
OAppOptionsType3Storage::enforced_options(env, eid, msg_type)
|
|
45
45
|
}
|
|
46
46
|
|
|
@@ -55,7 +55,10 @@ pub trait OAppOptionsType3: Ownable {
|
|
|
55
55
|
/// # Arguments
|
|
56
56
|
/// * `options` - A vector of EnforcedOptionParam structures specifying enforced options
|
|
57
57
|
#[only_auth]
|
|
58
|
-
fn set_enforced_options(
|
|
58
|
+
fn set_enforced_options(
|
|
59
|
+
env: &soroban_sdk::Env,
|
|
60
|
+
options: soroban_sdk::Vec<oapp::oapp_options_type3::EnforcedOptionParam>,
|
|
61
|
+
) {
|
|
59
62
|
for option in &options {
|
|
60
63
|
assert_option_type3(env, &option.options);
|
|
61
64
|
OAppOptionsType3Storage::set_enforced_options(env, option.eid, option.msg_type, &option.options);
|
|
@@ -77,7 +80,12 @@ pub trait OAppOptionsType3: Ownable {
|
|
|
77
80
|
///
|
|
78
81
|
/// # Returns
|
|
79
82
|
/// The combination of caller specified options AND enforced options
|
|
80
|
-
fn combine_options(
|
|
83
|
+
fn combine_options(
|
|
84
|
+
env: &soroban_sdk::Env,
|
|
85
|
+
eid: u32,
|
|
86
|
+
msg_type: u32,
|
|
87
|
+
extra_options: &soroban_sdk::Bytes,
|
|
88
|
+
) -> soroban_sdk::Bytes {
|
|
81
89
|
let mut enforced_options = Self::enforced_options(env, eid, msg_type);
|
|
82
90
|
|
|
83
91
|
if enforced_options.is_empty() {
|
|
@@ -78,7 +78,7 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
|
|
|
78
78
|
///
|
|
79
79
|
/// # Returns
|
|
80
80
|
/// True if the path can be initialized, false otherwise
|
|
81
|
-
fn allow_initialize_path(env: &Env, origin: &Origin) -> bool {
|
|
81
|
+
fn allow_initialize_path(env: &soroban_sdk::Env, origin: &endpoint_v2::Origin) -> bool {
|
|
82
82
|
let peer = Self::peer(env, origin.src_eid);
|
|
83
83
|
peer.is_some_and(|peer| peer == origin.sender)
|
|
84
84
|
}
|
|
@@ -96,7 +96,7 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
|
|
|
96
96
|
///
|
|
97
97
|
/// # Returns
|
|
98
98
|
/// The next nonce
|
|
99
|
-
fn next_nonce(_env: &Env, _src_eid: u32, _sender: &BytesN<32>) -> u64 {
|
|
99
|
+
fn next_nonce(_env: &soroban_sdk::Env, _src_eid: u32, _sender: &soroban_sdk::BytesN<32>) -> u64 {
|
|
100
100
|
0
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -116,12 +116,12 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
|
|
|
116
116
|
/// * `extra_data` - Additional arbitrary data provided by the corresponding executor
|
|
117
117
|
/// * `value` - The native token value sent with the message
|
|
118
118
|
fn lz_receive(
|
|
119
|
-
env: &Env,
|
|
120
|
-
executor: &Address,
|
|
121
|
-
origin: &Origin,
|
|
122
|
-
guid: &BytesN<32>,
|
|
123
|
-
message: &Bytes,
|
|
124
|
-
extra_data: &Bytes,
|
|
119
|
+
env: &soroban_sdk::Env,
|
|
120
|
+
executor: &soroban_sdk::Address,
|
|
121
|
+
origin: &endpoint_v2::Origin,
|
|
122
|
+
guid: &soroban_sdk::BytesN<32>,
|
|
123
|
+
message: &soroban_sdk::Bytes,
|
|
124
|
+
extra_data: &soroban_sdk::Bytes,
|
|
125
125
|
value: i128,
|
|
126
126
|
) {
|
|
127
127
|
clear_payload_and_transfer::<Self>(env, executor, origin, guid, message, value);
|
|
@@ -140,7 +140,12 @@ pub trait OAppReceiver: OAppCore + LzReceiveInternal {
|
|
|
140
140
|
///
|
|
141
141
|
/// # Returns
|
|
142
142
|
/// True if the sender is a valid composeMsg sender, false otherwise
|
|
143
|
-
fn is_compose_msg_sender(
|
|
143
|
+
fn is_compose_msg_sender(
|
|
144
|
+
env: &soroban_sdk::Env,
|
|
145
|
+
_origin: &endpoint_v2::Origin,
|
|
146
|
+
_message: &soroban_sdk::Bytes,
|
|
147
|
+
sender: &soroban_sdk::Address,
|
|
148
|
+
) -> bool {
|
|
144
149
|
env.current_contract_address() == *sender
|
|
145
150
|
}
|
|
146
151
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
mod
|
|
2
|
-
mod
|
|
3
|
-
mod
|
|
4
|
-
mod
|
|
1
|
+
mod oapp_core;
|
|
2
|
+
mod oapp_options_type3;
|
|
3
|
+
mod oapp_receiver;
|
|
4
|
+
mod oapp_sender;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
use crate::{self as oapp, oapp_core::PeerSet, oapp_receiver::LzReceiveInternal};
|
|
2
|
+
use endpoint_v2::Origin;
|
|
3
|
+
use soroban_sdk::{
|
|
4
|
+
contract, contractimpl, contracttype,
|
|
5
|
+
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
6
|
+
Address, Bytes, BytesN, Env, IntoVal,
|
|
7
|
+
};
|
|
8
|
+
use utils::testing_utils::assert_eq_event;
|
|
9
|
+
|
|
10
|
+
#[contract]
|
|
11
|
+
pub struct DummyEndpoint;
|
|
12
|
+
|
|
13
|
+
#[derive(Clone)]
|
|
14
|
+
#[contracttype]
|
|
15
|
+
enum DummyEndpointDataKey {
|
|
16
|
+
Delegate(Address),
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#[contractimpl]
|
|
20
|
+
impl DummyEndpoint {
|
|
21
|
+
pub fn set_delegate(env: Env, oapp: &Address, delegate: &Option<Address>) {
|
|
22
|
+
let key = DummyEndpointDataKey::Delegate(oapp.clone());
|
|
23
|
+
match delegate {
|
|
24
|
+
Some(d) => env.storage().persistent().set(&key, d),
|
|
25
|
+
None => env.storage().persistent().remove(&key),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
pub fn get_delegate(env: Env, oapp: Address) -> Option<Address> {
|
|
30
|
+
env.storage().persistent().get(&DummyEndpointDataKey::Delegate(oapp))
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[oapp_macros::oapp]
|
|
35
|
+
pub struct DummyOApp;
|
|
36
|
+
|
|
37
|
+
impl LzReceiveInternal for DummyOApp {
|
|
38
|
+
fn __lz_receive(
|
|
39
|
+
_env: &Env,
|
|
40
|
+
_origin: &Origin,
|
|
41
|
+
_guid: &BytesN<32>,
|
|
42
|
+
_message: &Bytes,
|
|
43
|
+
_extra_data: &Bytes,
|
|
44
|
+
_executor: &Address,
|
|
45
|
+
_value: i128,
|
|
46
|
+
) {
|
|
47
|
+
// Not used in core tests
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#[contractimpl]
|
|
52
|
+
impl DummyOApp {
|
|
53
|
+
pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address) {
|
|
54
|
+
oapp::oapp_core::initialize_oapp::<Self>(env, owner, endpoint, &None);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const REMOTE_EID: u32 = 100;
|
|
59
|
+
const UNSET_EID: u32 = 999;
|
|
60
|
+
|
|
61
|
+
struct TestSetup<'a> {
|
|
62
|
+
env: Env,
|
|
63
|
+
owner: Address,
|
|
64
|
+
endpoint: Address,
|
|
65
|
+
oapp_client: DummyOAppClient<'a>,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fn setup<'a>() -> TestSetup<'a> {
|
|
69
|
+
let env = Env::default();
|
|
70
|
+
|
|
71
|
+
let owner = Address::generate(&env);
|
|
72
|
+
soroban_sdk::log!(&env, "owner: {}", owner);
|
|
73
|
+
let endpoint = env.register(DummyEndpoint, ());
|
|
74
|
+
soroban_sdk::log!(&env, "endpoint: {}", endpoint);
|
|
75
|
+
let oapp = env.register(DummyOApp, (&owner, &endpoint));
|
|
76
|
+
soroban_sdk::log!(&env, "oapp: {}", oapp);
|
|
77
|
+
let oapp_client = DummyOAppClient::new(&env, &oapp);
|
|
78
|
+
TestSetup { env, owner, endpoint, oapp_client }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
fn set_peer_with_auth(
|
|
82
|
+
env: &Env,
|
|
83
|
+
signer: &Address,
|
|
84
|
+
oapp_client: &DummyOAppClient<'_>,
|
|
85
|
+
eid: u32,
|
|
86
|
+
peer: &Option<BytesN<32>>,
|
|
87
|
+
) {
|
|
88
|
+
env.mock_auths(&[MockAuth {
|
|
89
|
+
address: signer,
|
|
90
|
+
invoke: &MockAuthInvoke {
|
|
91
|
+
contract: &oapp_client.address,
|
|
92
|
+
fn_name: "set_peer",
|
|
93
|
+
args: (&eid, peer).into_val(env),
|
|
94
|
+
sub_invokes: &[],
|
|
95
|
+
},
|
|
96
|
+
}]);
|
|
97
|
+
oapp_client.set_peer(&eid, peer);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
fn set_delegate_with_auth(env: &Env, signer: &Address, oapp_client: &DummyOAppClient<'_>, delegate: &Option<Address>) {
|
|
101
|
+
env.mock_auths(&[MockAuth {
|
|
102
|
+
address: signer,
|
|
103
|
+
invoke: &MockAuthInvoke {
|
|
104
|
+
contract: &oapp_client.address,
|
|
105
|
+
fn_name: "set_delegate",
|
|
106
|
+
args: (delegate,).into_val(env),
|
|
107
|
+
sub_invokes: &[],
|
|
108
|
+
},
|
|
109
|
+
}]);
|
|
110
|
+
oapp_client.set_delegate(delegate);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
#[test]
|
|
114
|
+
fn test_constructor_initializes_owner_and_endpoint_and_clears_delegate() {
|
|
115
|
+
let TestSetup { env, owner, endpoint, oapp_client } = setup();
|
|
116
|
+
|
|
117
|
+
// owner initialized via oapp_initialize -> init_owner
|
|
118
|
+
assert_eq!(Some(owner), oapp_client.owner());
|
|
119
|
+
|
|
120
|
+
// endpoint stored via OAppCoreStorage::set_endpoint
|
|
121
|
+
assert_eq!(endpoint, oapp_client.endpoint());
|
|
122
|
+
|
|
123
|
+
// delegate set via oapp_initialize(..., &None) -> endpoint.set_delegate(..., None)
|
|
124
|
+
let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
|
|
125
|
+
assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
#[test]
|
|
129
|
+
fn test_oapp_version_defaults_to_zero() {
|
|
130
|
+
let TestSetup { oapp_client, .. } = setup();
|
|
131
|
+
assert_eq!((1, 1), oapp_client.oapp_version());
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
#[test]
|
|
135
|
+
fn test_peer_lifecycle_set_get_update_remove_and_events() {
|
|
136
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
137
|
+
|
|
138
|
+
// Unset cases
|
|
139
|
+
assert_eq!(None, oapp_client.peer(&UNSET_EID));
|
|
140
|
+
assert_eq!(None, oapp_client.peer(&REMOTE_EID));
|
|
141
|
+
|
|
142
|
+
// Set peer v1
|
|
143
|
+
let peer_v1: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
144
|
+
let peer_v1_option = Some(peer_v1.clone());
|
|
145
|
+
set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v1_option);
|
|
146
|
+
|
|
147
|
+
assert_eq_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v1.clone()) });
|
|
148
|
+
assert_eq!(Some(peer_v1), oapp_client.peer(&REMOTE_EID));
|
|
149
|
+
assert_eq!(None, oapp_client.peer(&UNSET_EID));
|
|
150
|
+
|
|
151
|
+
// Update to peer v2
|
|
152
|
+
let peer_v2: BytesN<32> = BytesN::from_array(&env, &[2; 32]);
|
|
153
|
+
let peer_v2_option = Some(peer_v2.clone());
|
|
154
|
+
set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v2_option);
|
|
155
|
+
|
|
156
|
+
assert_eq_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v2.clone()) });
|
|
157
|
+
assert_eq!(Some(peer_v2), oapp_client.peer(&REMOTE_EID));
|
|
158
|
+
|
|
159
|
+
// Remove peer
|
|
160
|
+
let none_peer: Option<BytesN<32>> = None;
|
|
161
|
+
set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &none_peer);
|
|
162
|
+
assert_eq_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: None });
|
|
163
|
+
assert_eq!(None, oapp_client.peer(&REMOTE_EID));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
#[test]
|
|
167
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
168
|
+
fn test_set_peer_unauthorized() {
|
|
169
|
+
let TestSetup { env, oapp_client, .. } = setup();
|
|
170
|
+
|
|
171
|
+
let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
172
|
+
oapp_client.set_peer(&REMOTE_EID, &Some(test_peer));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
#[test]
|
|
176
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
177
|
+
fn test_set_peer_non_owner_authorized() {
|
|
178
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
179
|
+
let non_owner = Address::generate(&env);
|
|
180
|
+
assert!(non_owner != owner);
|
|
181
|
+
|
|
182
|
+
let peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
183
|
+
let peer_option = Some(peer);
|
|
184
|
+
set_peer_with_auth(&env, &non_owner, &oapp_client, REMOTE_EID, &peer_option);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
#[test]
|
|
188
|
+
fn test_set_delegate_updates_and_clears_endpoint_delegate() {
|
|
189
|
+
let TestSetup { env, owner, endpoint, oapp_client } = setup();
|
|
190
|
+
|
|
191
|
+
let delegate = Address::generate(&env);
|
|
192
|
+
let delegate_option = Some(delegate.clone());
|
|
193
|
+
set_delegate_with_auth(&env, &owner, &oapp_client, &delegate_option);
|
|
194
|
+
|
|
195
|
+
let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
|
|
196
|
+
assert_eq!(Some(delegate), endpoint_client.get_delegate(&oapp_client.address));
|
|
197
|
+
|
|
198
|
+
// Clear delegate
|
|
199
|
+
let none_delegate: Option<Address> = None;
|
|
200
|
+
set_delegate_with_auth(&env, &owner, &oapp_client, &none_delegate);
|
|
201
|
+
assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#[test]
|
|
205
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
206
|
+
fn test_set_delegate_unauthorized() {
|
|
207
|
+
let TestSetup { env, oapp_client, .. } = setup();
|
|
208
|
+
|
|
209
|
+
let delegate = Address::generate(&env);
|
|
210
|
+
oapp_client.set_delegate(&Some(delegate));
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
#[test]
|
|
214
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
215
|
+
fn test_set_delegate_non_owner_authorized() {
|
|
216
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
217
|
+
let non_owner = Address::generate(&env);
|
|
218
|
+
assert!(non_owner != owner);
|
|
219
|
+
|
|
220
|
+
let delegate = Address::generate(&env);
|
|
221
|
+
let delegate_option = Some(delegate);
|
|
222
|
+
set_delegate_with_auth(&env, &non_owner, &oapp_client, &delegate_option);
|
|
223
|
+
}
|