@layerzerolabs/protocol-stellar-v2 0.2.15 → 0.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +365 -297
- package/.turbo/turbo-lint.log +142 -110
- package/.turbo/turbo-test.log +1273 -1222
- package/Cargo.lock +20 -5
- package/Cargo.toml +4 -1
- package/contracts/ERROR_SPEC.md +44 -0
- package/contracts/common-macros/src/auth.rs +113 -0
- package/contracts/common-macros/src/contract_ttl.rs +84 -0
- package/contracts/common-macros/src/lib.rs +181 -30
- package/contracts/common-macros/src/lz_contract.rs +83 -0
- package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
- package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
- package/contracts/common-macros/src/tests/mod.rs +2 -2
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
- package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
- package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +3 -3
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -21
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +2 -2
- package/contracts/common-macros/src/ttl_configurable.rs +19 -34
- package/contracts/common-macros/src/ttl_extendable.rs +36 -0
- package/contracts/common-macros/src/upgradeable.rs +5 -5
- package/contracts/common-macros/src/utils.rs +9 -0
- package/contracts/endpoint-v2/src/constants.rs +4 -4
- package/contracts/endpoint-v2/src/endpoint_v2.rs +38 -40
- package/contracts/endpoint-v2/src/errors.rs +4 -3
- package/contracts/endpoint-v2/src/events.rs +1 -1
- package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
- package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
- package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
- package/contracts/endpoint-v2/src/storage.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +3 -3
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +3 -3
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +3 -3
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +1 -1
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +3 -3
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +1 -1
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +4 -4
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +1 -1
- package/contracts/layerzero-views/src/layerzero_view.rs +3 -6
- package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +2 -2
- package/contracts/macro-integration-tests/tests/runtime/ownable/{only_owner_guard.rs → only_auth_guard.rs} +1 -1
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +1 -1
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +1 -1
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +0 -1
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.rs → only_auth_missing_env.rs} +3 -3
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.stderr → only_auth_missing_env.stderr} +4 -4
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +2 -3
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/{only_owner_env_param_variants.rs → only_auth_env_param_variants.rs} +9 -9
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +6 -6
- package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +3 -3
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +1 -2
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +1 -2
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +9 -9
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +1 -1
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +1 -1
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +2 -2
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
- package/contracts/message-libs/treasury/src/errors.rs +2 -2
- package/contracts/message-libs/treasury/src/events.rs +1 -1
- package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
- package/contracts/message-libs/treasury/src/storage.rs +1 -1
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
- package/contracts/message-libs/treasury/src/treasury.rs +14 -16
- package/contracts/message-libs/uln-302/src/receive_uln.rs +13 -2
- package/contracts/message-libs/uln-302/src/send_uln.rs +24 -4
- package/contracts/message-libs/uln-302/src/uln302.rs +6 -24
- package/contracts/oapps/counter/Cargo.toml +14 -1
- package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
- package/contracts/oapps/counter/integration_tests/{setup.rs → setup_sml.rs} +48 -80
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
- package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
- package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
- package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
- package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
- package/contracts/oapps/counter/src/counter.rs +67 -43
- package/contracts/oapps/counter/src/tests/mod.rs +0 -13
- package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
- package/contracts/oapps/oapp/src/errors.rs +5 -1
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +93 -78
- package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
- package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
- package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -8
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -17
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -7
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -15
- package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
- package/contracts/oapps/oapp-macros/src/lib.rs +113 -56
- package/contracts/oapps/oft/Cargo.toml +10 -7
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
- package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
- package/contracts/oapps/oft/integration-tests/setup.rs +29 -110
- package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -14
- package/contracts/oapps/oft/src/extensions/pausable.rs +4 -4
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +5 -5
- package/contracts/oapps/oft/src/lib.rs +11 -13
- package/contracts/oapps/oft/src/oft.rs +147 -225
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -13
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +31 -14
- package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
- package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
- package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
- package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +129 -30
- package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
- package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
- package/contracts/oapps/oft-core/src/errors.rs +13 -0
- package/contracts/oapps/oft-core/src/lib.rs +18 -0
- package/contracts/oapps/oft-core/src/oft_core.rs +439 -0
- package/contracts/oapps/{oft → oft-core}/src/storage.rs +2 -0
- package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
- package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +2 -2
- package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
- package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -5
- package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
- package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +78 -37
- package/contracts/oapps/oft-core/src/types.rs +58 -0
- package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
- package/contracts/upgrader/src/lib.rs +4 -4
- package/contracts/utils/src/auth.rs +44 -0
- package/contracts/utils/src/errors.rs +31 -5
- package/contracts/utils/src/lib.rs +3 -0
- package/contracts/utils/src/multisig.rs +211 -0
- package/contracts/utils/src/ownable.rs +137 -13
- package/contracts/utils/src/tests/buffer_reader.rs +6 -6
- package/contracts/utils/src/tests/buffer_writer.rs +6 -6
- package/contracts/utils/src/tests/bytes_ext.rs +2 -4
- package/contracts/utils/src/tests/mod.rs +1 -0
- package/contracts/utils/src/tests/multisig.rs +731 -0
- package/contracts/utils/src/tests/option_ext.rs +2 -5
- package/contracts/utils/src/tests/ownable.rs +456 -7
- package/contracts/utils/src/tests/ttl_configurable.rs +27 -16
- package/contracts/utils/src/tests/upgradeable.rs +4 -2
- package/contracts/utils/src/ttl_configurable.rs +23 -8
- package/contracts/utils/src/ttl_extendable.rs +27 -0
- package/contracts/utils/src/upgradeable.rs +2 -0
- package/contracts/workers/dvn/Cargo.toml +1 -1
- package/contracts/workers/dvn/src/auth.rs +7 -7
- package/contracts/workers/dvn/src/dvn.rs +10 -38
- package/contracts/workers/dvn/src/errors.rs +0 -7
- package/contracts/workers/dvn/src/events.rs +1 -14
- package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
- package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
- package/contracts/workers/dvn/src/storage.rs +3 -13
- package/contracts/workers/dvn/src/tests/auth.rs +4 -4
- package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
- package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
- package/contracts/workers/dvn/src/tests/setup.rs +5 -5
- package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -6
- package/contracts/workers/executor/src/auth.rs +80 -16
- package/contracts/workers/executor/src/executor.rs +5 -31
- package/contracts/workers/executor/src/storage.rs +2 -9
- package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +3 -6
- package/contracts/workers/executor-helper/Cargo.toml +1 -1
- package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
- package/contracts/workers/price-feed/Cargo.toml +1 -1
- package/contracts/workers/price-feed/src/price_feed.rs +7 -10
- package/contracts/workers/worker/src/errors.rs +4 -0
- package/contracts/workers/worker/src/tests/worker.rs +7 -6
- package/contracts/workers/worker/src/worker.rs +20 -16
- package/package.json +7 -5
- package/sdk/.turbo/turbo-build.log +1 -0
- package/sdk/.turbo/turbo-test.log +1019 -0
- package/sdk/dist/generated/bml.d.ts +95 -8
- package/sdk/dist/generated/bml.js +95 -36
- package/sdk/dist/generated/counter.d.ts +289 -44
- package/sdk/dist/generated/counter.js +119 -49
- package/sdk/dist/generated/dvn.d.ts +312 -229
- package/sdk/dist/generated/dvn.js +144 -83
- package/sdk/dist/generated/dvn_fee_lib.d.ts +258 -63
- package/sdk/dist/generated/dvn_fee_lib.js +95 -26
- package/sdk/dist/generated/endpoint.d.ts +219 -24
- package/sdk/dist/generated/endpoint.js +108 -41
- package/sdk/dist/generated/executor.d.ts +239 -87
- package/sdk/dist/generated/executor.js +135 -63
- package/sdk/dist/generated/executor_fee_lib.d.ts +278 -74
- package/sdk/dist/generated/executor_fee_lib.js +135 -59
- package/sdk/dist/generated/executor_helper.d.ts +163 -21
- package/sdk/dist/generated/executor_helper.js +124 -52
- package/sdk/dist/generated/oft.d.ts +1842 -0
- package/sdk/dist/generated/oft.js +345 -0
- package/sdk/dist/generated/price_feed.d.ts +258 -63
- package/sdk/dist/generated/price_feed.js +95 -26
- package/sdk/dist/generated/sml.d.ts +235 -34
- package/sdk/dist/generated/sml.js +126 -53
- package/sdk/dist/generated/treasury.d.ts +1016 -0
- package/sdk/dist/generated/treasury.js +248 -0
- package/sdk/dist/generated/uln302.d.ts +235 -34
- package/sdk/dist/generated/uln302.js +126 -53
- package/sdk/dist/generated/upgrader.d.ts +17 -2
- package/sdk/dist/generated/upgrader.js +19 -1
- package/sdk/dist/index.d.ts +2 -1
- package/sdk/dist/index.js +2 -1
- package/sdk/package.json +6 -3
- package/sdk/src/index.ts +2 -1
- package/sdk/test/counter-sml.test.ts +376 -0
- package/sdk/test/counter-uln.test.ts +493 -0
- package/sdk/test/{oft.test.ts → oft-sml.test.ts} +196 -321
- package/sdk/test/suites/constants.ts +22 -2
- package/sdk/test/suites/globalSetup.ts +450 -0
- package/sdk/test/suites/localnet.ts +23 -6
- package/sdk/test/upgrader.test.ts +7 -16
- package/sdk/test/utils.ts +558 -85
- package/sdk/turbo.json +8 -0
- package/sdk/vitest.config.ts +21 -0
- package/tools/ts-bindings-gen/Cargo.toml +2 -0
- package/tools/ts-bindings-gen/src/main.rs +52 -4
- package/contracts/common-macros/src/contract_impl.rs +0 -52
- package/contracts/common-macros/src/ownable.rs +0 -41
- package/contracts/common-macros/src/tests/contract_impl.rs +0 -386
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -12
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +0 -50
- package/contracts/oapps/oapp-macros/src/oapp_core.rs +0 -41
- package/contracts/oapps/oapp-macros/src/oapp_full.rs +0 -21
- package/contracts/oapps/oapp-macros/src/oapp_options_type3.rs +0 -31
- package/contracts/oapps/oapp-macros/src/oapp_receiver.rs +0 -48
- package/contracts/oapps/oapp-macros/src/oapp_sender.rs +0 -21
- package/contracts/oapps/oapp-macros/src/util.rs +0 -107
- package/contracts/oapps/oft/src/constants.rs +0 -5
- package/contracts/oapps/oft/src/default_oft_impl.rs +0 -152
- package/contracts/oapps/oft/src/errors.rs +0 -8
- package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
- package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
- package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
- package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -903
- package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -749
- package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -432
- package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1078
- package/contracts/oapps/oft/src/types.rs +0 -38
- package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
- package/contracts/oapps/oft-std/src/lib.rs +0 -16
- package/contracts/oapps/oft-std/src/oft.rs +0 -156
- package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
- package/contracts/workers/dvn/src/multisig.rs +0 -157
- package/sdk/dist/generated/oft_std.d.ts +0 -1544
- package/sdk/dist/generated/oft_std.js +0 -271
- package/sdk/test/index.test.ts +0 -375
- /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
- /package/sdk/test/suites/{testUpgradeable.ts → dummyContractClient.ts} +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
//! Key generation utilities for DVN initialization in integration tests.
|
|
2
|
+
//!
|
|
3
|
+
//! Generates secp256k1 addresses (for DVN multisig) and Ed25519 addresses (for admin).
|
|
4
|
+
|
|
5
|
+
use ed25519_dalek::SigningKey as Ed25519SigningKey;
|
|
6
|
+
use k256::ecdsa::{SigningKey, VerifyingKey};
|
|
7
|
+
use rand::thread_rng;
|
|
8
|
+
use sha3::{Digest, Keccak256};
|
|
9
|
+
use soroban_sdk::{address_payload::AddressPayload, Address, BytesN, Env};
|
|
10
|
+
|
|
11
|
+
/// Generates an Ethereum-style address from a secp256k1 key (for DVN multisig signer).
|
|
12
|
+
#[derive(Clone)]
|
|
13
|
+
pub struct Secp256k1KeyPair {
|
|
14
|
+
/// The derived Ethereum-style address (last 20 bytes of keccak256(pubkey))
|
|
15
|
+
pub eth_address: [u8; 20],
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
impl Secp256k1KeyPair {
|
|
19
|
+
/// Generate a new random secp256k1 address.
|
|
20
|
+
pub fn generate() -> Self {
|
|
21
|
+
let signing_key = SigningKey::random(&mut thread_rng());
|
|
22
|
+
let eth_address = Self::derive_eth_address(&signing_key);
|
|
23
|
+
Self { eth_address }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fn derive_eth_address(signing_key: &SigningKey) -> [u8; 20] {
|
|
27
|
+
let verifying_key: &VerifyingKey = signing_key.verifying_key();
|
|
28
|
+
let pubkey_bytes = verifying_key.to_encoded_point(false);
|
|
29
|
+
let pubkey_uncompressed = pubkey_bytes.as_bytes();
|
|
30
|
+
|
|
31
|
+
let mut hasher = Keccak256::new();
|
|
32
|
+
hasher.update(&pubkey_uncompressed[1..65]);
|
|
33
|
+
let hash = hasher.finalize();
|
|
34
|
+
|
|
35
|
+
let mut eth_address = [0u8; 20];
|
|
36
|
+
eth_address.copy_from_slice(&hash[12..32]);
|
|
37
|
+
eth_address
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// Get the signer address as BytesN<20> for use in Soroban.
|
|
41
|
+
pub fn signer(&self, env: &Env) -> BytesN<20> {
|
|
42
|
+
BytesN::from_array(env, &self.eth_address)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// Generates an Ed25519 address (for DVN admin).
|
|
47
|
+
pub struct Ed25519KeyPair {
|
|
48
|
+
signing_key: Ed25519SigningKey,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
impl Ed25519KeyPair {
|
|
52
|
+
/// Generate a new random Ed25519 key pair.
|
|
53
|
+
pub fn generate() -> Self {
|
|
54
|
+
Self { signing_key: Ed25519SigningKey::generate(&mut thread_rng()) }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// Get the public key as a Soroban Address.
|
|
58
|
+
pub fn address(&self, env: &Env) -> Address {
|
|
59
|
+
let bytes_n = BytesN::from_array(env, &self.signing_key.verifying_key().to_bytes());
|
|
60
|
+
Address::from_payload(env, AddressPayload::AccountIdPublicKeyEd25519(bytes_n))
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -1,35 +1,27 @@
|
|
|
1
|
-
use crate::
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
use crate::{
|
|
2
|
+
codec::MsgType,
|
|
3
|
+
integration_tests::{setup_sml::*, utils::*},
|
|
4
|
+
tests::mint_to,
|
|
5
|
+
};
|
|
4
6
|
use soroban_sdk::{testutils::Address as _, Address, Bytes};
|
|
5
7
|
|
|
6
8
|
#[test]
|
|
7
9
|
fn test_increment_vanilla() {
|
|
8
|
-
let TestSetup { env, chain_a, chain_b } =
|
|
10
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup();
|
|
9
11
|
|
|
10
|
-
wire_endpoint(&env, &[&chain_a, &chain_b]);
|
|
11
|
-
wire_counter(&env, &[&chain_a, &chain_b]);
|
|
12
|
-
|
|
13
|
-
// on Chain A, quote and increment
|
|
14
12
|
let sender = Address::generate(&env);
|
|
15
13
|
let options = Bytes::new(&env);
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
let fee = quote(&chain_a, chain_b.eid, msg_type, &options);
|
|
14
|
+
let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
|
|
19
15
|
|
|
20
16
|
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
|
|
21
|
-
increment(&env, &chain_a, &sender, chain_b.eid,
|
|
22
|
-
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
17
|
+
increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
|
|
23
18
|
|
|
24
|
-
|
|
25
|
-
validate_packet(&env, &chain_b, &packet_event);
|
|
26
|
-
let packet = decode_packet(&env, &packet_event.0);
|
|
19
|
+
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
20
|
+
let packet = validate_packet(&env, &chain_b, &packet_event);
|
|
27
21
|
|
|
28
|
-
// deliver the message on Chain B
|
|
29
22
|
let executor = Address::generate(&env);
|
|
30
|
-
lz_receive(&env, &chain_b, &executor, &packet, 0
|
|
23
|
+
lz_receive(&env, &chain_b, &executor, &packet, 0);
|
|
31
24
|
|
|
32
|
-
// state assertion
|
|
33
25
|
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
34
26
|
assert_eq!(chain_b.counter.count(), 1);
|
|
35
27
|
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
@@ -37,12 +29,8 @@ fn test_increment_vanilla() {
|
|
|
37
29
|
|
|
38
30
|
#[test]
|
|
39
31
|
fn test_increment_aba() {
|
|
40
|
-
let TestSetup { env, chain_a, chain_b } =
|
|
41
|
-
|
|
42
|
-
wire_endpoint(&env, &[&chain_a, &chain_b]);
|
|
43
|
-
wire_counter(&env, &[&chain_a, &chain_b]);
|
|
32
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup();
|
|
44
33
|
|
|
45
|
-
// on Chain A, quote and increment
|
|
46
34
|
let sender = Address::generate(&env);
|
|
47
35
|
let msg_type = MsgType::ABA;
|
|
48
36
|
let options = Bytes::new(&env);
|
|
@@ -53,24 +41,18 @@ fn test_increment_aba() {
|
|
|
53
41
|
|
|
54
42
|
// validate packet on Chain B
|
|
55
43
|
let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
56
|
-
validate_packet(&env, &chain_b, &packet_event_chain_a);
|
|
57
|
-
let packet_chain_a = decode_packet(&env, &packet_event_chain_a.0);
|
|
44
|
+
let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
|
|
58
45
|
|
|
59
46
|
// deliver the message on Chain B and execute lz_receive
|
|
60
47
|
let executor = Address::generate(&env);
|
|
61
|
-
|
|
62
|
-
approve(&env, &executor, &chain_b.native_token, fee.native_fee);
|
|
63
|
-
lz_receive(&env, &chain_b, &executor, &packet_chain_a, fee.native_fee, true);
|
|
48
|
+
lz_receive(&env, &chain_b, &executor, &packet_chain_a, fee.native_fee);
|
|
64
49
|
|
|
65
50
|
// validate packet on Chain A
|
|
66
51
|
let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
|
|
67
|
-
validate_packet(&env, &chain_a, &packet_event_chain_b);
|
|
68
|
-
let packet_chain_b = decode_packet(&env, &packet_event_chain_b.0);
|
|
52
|
+
let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
|
|
69
53
|
|
|
70
|
-
mint_to(&env, &chain_a.owner, &chain_a.native_token, &executor, fee.native_fee);
|
|
71
|
-
approve(&env, &executor, &chain_a.native_token, fee.native_fee);
|
|
72
54
|
// deliver the message on Chain A and execute lz_receive
|
|
73
|
-
lz_receive(&env, &chain_a, &executor, &packet_chain_b, fee.native_fee
|
|
55
|
+
lz_receive(&env, &chain_a, &executor, &packet_chain_b, fee.native_fee);
|
|
74
56
|
|
|
75
57
|
// state assertion
|
|
76
58
|
assert_eq!(chain_a.counter.count(), 1);
|
|
@@ -84,12 +66,8 @@ fn test_increment_aba() {
|
|
|
84
66
|
|
|
85
67
|
#[test]
|
|
86
68
|
fn test_increment_composed() {
|
|
87
|
-
let TestSetup { env, chain_a, chain_b } =
|
|
69
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup();
|
|
88
70
|
|
|
89
|
-
wire_endpoint(&env, &[&chain_a, &chain_b]);
|
|
90
|
-
wire_counter(&env, &[&chain_a, &chain_b]);
|
|
91
|
-
|
|
92
|
-
// increment
|
|
93
71
|
let sender = Address::generate(&env);
|
|
94
72
|
let msg_type = MsgType::Composed;
|
|
95
73
|
let options = Bytes::new(&env);
|
|
@@ -100,12 +78,11 @@ fn test_increment_composed() {
|
|
|
100
78
|
|
|
101
79
|
// validate packet on Chain B
|
|
102
80
|
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
103
|
-
validate_packet(&env, &chain_b, &packet_event);
|
|
104
|
-
let packet = decode_packet(&env, &packet_event.0);
|
|
81
|
+
let packet = validate_packet(&env, &chain_b, &packet_event);
|
|
105
82
|
|
|
106
83
|
// deliver the message on Chain B and execute lz_receive
|
|
107
84
|
let executor = Address::generate(&env);
|
|
108
|
-
lz_receive(&env, &chain_b, &executor, &packet, 0
|
|
85
|
+
lz_receive(&env, &chain_b, &executor, &packet, 0);
|
|
109
86
|
|
|
110
87
|
// execute lz_compose
|
|
111
88
|
lz_compose(&env, &chain_b, &executor, &packet, 0);
|
|
@@ -119,12 +96,8 @@ fn test_increment_composed() {
|
|
|
119
96
|
|
|
120
97
|
#[test]
|
|
121
98
|
fn test_increment_composed_aba() {
|
|
122
|
-
let TestSetup { env, chain_a, chain_b } =
|
|
123
|
-
|
|
124
|
-
wire_endpoint(&env, &[&chain_a, &chain_b]);
|
|
125
|
-
wire_counter(&env, &[&chain_a, &chain_b]);
|
|
99
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup();
|
|
126
100
|
|
|
127
|
-
// on Chain A, quote and increment
|
|
128
101
|
let sender = Address::generate(&env);
|
|
129
102
|
let msg_type = MsgType::ComposedABA;
|
|
130
103
|
let options = Bytes::new(&env);
|
|
@@ -135,24 +108,20 @@ fn test_increment_composed_aba() {
|
|
|
135
108
|
|
|
136
109
|
// validate packet on Chain B
|
|
137
110
|
let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
138
|
-
validate_packet(&env, &chain_b, &packet_event_chain_a);
|
|
139
|
-
let packet_chain_a = decode_packet(&env, &packet_event_chain_a.0);
|
|
111
|
+
let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
|
|
140
112
|
|
|
141
113
|
// deliver the message on Chain B and execute lz_receive
|
|
142
114
|
let executor = Address::generate(&env);
|
|
143
|
-
lz_receive(&env, &chain_b, &executor, &packet_chain_a, 0
|
|
115
|
+
lz_receive(&env, &chain_b, &executor, &packet_chain_a, 0);
|
|
144
116
|
// supply native token for lz_send(inside lz_compose) on Chain B
|
|
145
|
-
mint_to(&env, &chain_b.owner, &chain_b.native_token, &executor, fee.native_fee);
|
|
146
|
-
approve(&env, &executor, &chain_b.native_token, fee.native_fee);
|
|
147
117
|
lz_compose(&env, &chain_b, &executor, &packet_chain_a, fee.native_fee);
|
|
148
118
|
|
|
149
119
|
// validate packet on Chain A(packet emitted on Chain B)
|
|
150
120
|
let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
|
|
151
|
-
validate_packet(&env, &chain_a, &packet_event_chain_b);
|
|
152
|
-
let packet_chain_b = decode_packet(&env, &packet_event_chain_b.0);
|
|
121
|
+
let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
|
|
153
122
|
|
|
154
123
|
// deliver the message on Chain A and execute lz_receive
|
|
155
|
-
lz_receive(&env, &chain_a, &executor, &packet_chain_b, 0
|
|
124
|
+
lz_receive(&env, &chain_a, &executor, &packet_chain_b, 0);
|
|
156
125
|
|
|
157
126
|
// state assertion
|
|
158
127
|
assert_eq!(chain_a.counter.count(), 1);
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
extern crate std;
|
|
2
|
+
|
|
3
|
+
use crate::{
|
|
4
|
+
codec::MsgType,
|
|
5
|
+
integration_tests::{setup_uln::*, utils::*},
|
|
6
|
+
tests::mint_to,
|
|
7
|
+
};
|
|
8
|
+
use message_lib_common::packet_codec_v1;
|
|
9
|
+
use soroban_sdk::{
|
|
10
|
+
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
11
|
+
Address, IntoVal,
|
|
12
|
+
};
|
|
13
|
+
use uln302::ReceiveUln302Client;
|
|
14
|
+
|
|
15
|
+
#[test]
|
|
16
|
+
fn test_increment_vanilla() {
|
|
17
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
|
|
18
|
+
|
|
19
|
+
let sender = Address::generate(&env);
|
|
20
|
+
let options = create_default_options(&env);
|
|
21
|
+
let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
|
|
22
|
+
|
|
23
|
+
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
|
|
24
|
+
increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
|
|
25
|
+
|
|
26
|
+
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
27
|
+
let packet = validate_packet(&env, &chain_b, &packet_event);
|
|
28
|
+
|
|
29
|
+
// Execute via executor using the packet options value.
|
|
30
|
+
let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
|
|
31
|
+
let admin = Address::generate(&env);
|
|
32
|
+
lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
|
|
33
|
+
|
|
34
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
35
|
+
assert_eq!(chain_b.counter.count(), 1);
|
|
36
|
+
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#[test]
|
|
40
|
+
fn test_increment_aba() {
|
|
41
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
|
|
42
|
+
|
|
43
|
+
let sender = Address::generate(&env);
|
|
44
|
+
let msg_type = MsgType::ABA;
|
|
45
|
+
|
|
46
|
+
// Quote return fee first, then embed it as value in the send options.
|
|
47
|
+
let return_options = create_aba_return_options(&env);
|
|
48
|
+
let fee_b_to_a = quote(&chain_b, chain_a.eid, MsgType::Vanilla, &return_options);
|
|
49
|
+
let fee_with_buffer = fee_b_to_a.native_fee + fee_b_to_a.native_fee / 100; // 1% buffer
|
|
50
|
+
// ABA message doesn't use lz_compose, so pass 0 for lz_compose params
|
|
51
|
+
let options = create_options_with_gas_and_value(&env, 100000, fee_with_buffer as u128, 0, 0);
|
|
52
|
+
|
|
53
|
+
let fee_a_to_b = quote(&chain_a, chain_b.eid, msg_type, &options);
|
|
54
|
+
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee_a_to_b.native_fee);
|
|
55
|
+
increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee_a_to_b);
|
|
56
|
+
|
|
57
|
+
// validate packet on Chain B
|
|
58
|
+
let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
59
|
+
let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
|
|
60
|
+
|
|
61
|
+
// Deliver the message on Chain B via executor_helper using the packet options value.
|
|
62
|
+
let executor_value_b = get_executor_value_from_options(&env, &packet_event_chain_a.1);
|
|
63
|
+
let admin = Address::generate(&env);
|
|
64
|
+
lz_receive_via_executor(&env, &chain_b, &admin, &packet_chain_a, executor_value_b);
|
|
65
|
+
|
|
66
|
+
// validate packet on Chain A
|
|
67
|
+
let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
|
|
68
|
+
let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
|
|
69
|
+
|
|
70
|
+
// Extract executor value from the actual packet options
|
|
71
|
+
let executor_value = get_executor_value_from_options(&env, &packet_event_chain_b.1);
|
|
72
|
+
// deliver the message on Chain A via executor_helper
|
|
73
|
+
lz_receive_via_executor(&env, &chain_a, &admin, &packet_chain_b, executor_value);
|
|
74
|
+
|
|
75
|
+
// state assertion
|
|
76
|
+
assert_eq!(chain_a.counter.count(), 1);
|
|
77
|
+
assert_eq!(chain_a.counter.inbound_count(&chain_b.eid), 1);
|
|
78
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
79
|
+
|
|
80
|
+
assert_eq!(chain_b.counter.count(), 1);
|
|
81
|
+
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
82
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#[test]
|
|
86
|
+
fn test_increment_composed() {
|
|
87
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
|
|
88
|
+
|
|
89
|
+
let sender = Address::generate(&env);
|
|
90
|
+
let msg_type = MsgType::Composed;
|
|
91
|
+
// Composed message needs lzCompose gas for execution
|
|
92
|
+
let options = create_options_with_gas(&env, 100000, 100000);
|
|
93
|
+
|
|
94
|
+
let fee = quote(&chain_a, chain_b.eid, msg_type, &options);
|
|
95
|
+
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
|
|
96
|
+
increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee);
|
|
97
|
+
|
|
98
|
+
// validate packet on Chain B
|
|
99
|
+
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
100
|
+
let packet = validate_packet(&env, &chain_b, &packet_event);
|
|
101
|
+
|
|
102
|
+
// deliver the message on Chain B via executor_helper
|
|
103
|
+
let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
|
|
104
|
+
let admin = Address::generate(&env);
|
|
105
|
+
lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
|
|
106
|
+
|
|
107
|
+
// scan compose_sent event emitted by lz_receive
|
|
108
|
+
let compose_event = scan_compose_sent_event(&env, &chain_b.endpoint.address);
|
|
109
|
+
assert!(compose_event.is_some(), "compose_sent event should be emitted");
|
|
110
|
+
let (from, to, guid, index, _message) = compose_event.unwrap();
|
|
111
|
+
assert_eq!(from, chain_b.counter.address);
|
|
112
|
+
assert_eq!(to, chain_b.counter.address);
|
|
113
|
+
assert_eq!(guid, packet.guid);
|
|
114
|
+
assert_eq!(index, 0);
|
|
115
|
+
|
|
116
|
+
// execute lz_compose via executor_helper
|
|
117
|
+
let compose_value_b = get_compose_value_from_options(&env, &packet_event.1);
|
|
118
|
+
lz_compose_via_executor(&env, &chain_b, &admin, &packet, compose_value_b);
|
|
119
|
+
|
|
120
|
+
// state assertion
|
|
121
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
122
|
+
assert_eq!(chain_b.counter.count(), 1);
|
|
123
|
+
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
124
|
+
assert_eq!(chain_b.counter.composed_count(), 1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#[test]
|
|
128
|
+
fn test_increment_composed_aba() {
|
|
129
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::Single);
|
|
130
|
+
|
|
131
|
+
let sender = Address::generate(&env);
|
|
132
|
+
let msg_type = MsgType::ComposedABA;
|
|
133
|
+
|
|
134
|
+
// Quote return fee first, then embed it as value in the send options.
|
|
135
|
+
let return_options = create_composed_aba_return_options(&env);
|
|
136
|
+
let fee_b_to_a = quote(&chain_b, chain_a.eid, MsgType::Vanilla, &return_options);
|
|
137
|
+
let fee_with_buffer = fee_b_to_a.native_fee + fee_b_to_a.native_fee / 100; // 1% buffer
|
|
138
|
+
// ComposedABA uses lz_compose to send the return message, so include lzCompose gas and value
|
|
139
|
+
let options = create_options_with_gas_and_value(&env, 100000, 0, 100000, fee_with_buffer as u128);
|
|
140
|
+
|
|
141
|
+
let fee_a_to_b = quote(&chain_a, chain_b.eid, msg_type, &options);
|
|
142
|
+
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee_a_to_b.native_fee);
|
|
143
|
+
increment(&env, &chain_a, &sender, chain_b.eid, msg_type, &options, &fee_a_to_b);
|
|
144
|
+
|
|
145
|
+
// validate packet on Chain B
|
|
146
|
+
let packet_event_chain_a = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
147
|
+
let packet_chain_a = validate_packet(&env, &chain_b, &packet_event_chain_a);
|
|
148
|
+
|
|
149
|
+
// Deliver the message on Chain B via executor_helper using the packet options value.
|
|
150
|
+
let executor_value_b = get_executor_value_from_options(&env, &packet_event_chain_a.1);
|
|
151
|
+
let admin = Address::generate(&env);
|
|
152
|
+
lz_receive_via_executor(&env, &chain_b, &admin, &packet_chain_a, executor_value_b);
|
|
153
|
+
|
|
154
|
+
// scan compose_sent event emitted by lz_receive
|
|
155
|
+
let compose_event = scan_compose_sent_event(&env, &chain_b.endpoint.address);
|
|
156
|
+
assert!(compose_event.is_some(), "compose_sent event should be emitted");
|
|
157
|
+
let (from, to, guid, index, _message) = compose_event.unwrap();
|
|
158
|
+
assert_eq!(from, chain_b.counter.address);
|
|
159
|
+
assert_eq!(to, chain_b.counter.address);
|
|
160
|
+
assert_eq!(guid, packet_chain_a.guid);
|
|
161
|
+
assert_eq!(index, 0);
|
|
162
|
+
|
|
163
|
+
// execute lz_compose on Chain B (lz_send happens inside)
|
|
164
|
+
let compose_value_b = get_compose_value_from_options(&env, &packet_event_chain_a.1);
|
|
165
|
+
lz_compose_via_executor(&env, &chain_b, &admin, &packet_chain_a, compose_value_b);
|
|
166
|
+
|
|
167
|
+
// validate packet on Chain A (packet emitted on Chain B)
|
|
168
|
+
let packet_event_chain_b = scan_packet_sent_event(&env, &chain_b.endpoint.address).unwrap();
|
|
169
|
+
let packet_chain_b = validate_packet(&env, &chain_a, &packet_event_chain_b);
|
|
170
|
+
|
|
171
|
+
// Extract executor value from the actual packet options
|
|
172
|
+
let executor_value = get_executor_value_from_options(&env, &packet_event_chain_b.1);
|
|
173
|
+
// deliver the message on Chain A via executor_helper
|
|
174
|
+
lz_receive_via_executor(&env, &chain_a, &admin, &packet_chain_b, executor_value);
|
|
175
|
+
|
|
176
|
+
// state assertion
|
|
177
|
+
assert_eq!(chain_a.counter.count(), 1);
|
|
178
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
179
|
+
assert_eq!(chain_a.counter.inbound_count(&chain_b.eid), 1);
|
|
180
|
+
|
|
181
|
+
assert_eq!(chain_b.counter.count(), 1);
|
|
182
|
+
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
183
|
+
assert_eq!(chain_b.counter.outbound_count(&chain_a.eid), 1);
|
|
184
|
+
assert_eq!(chain_b.counter.composed_count(), 1);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ============================================================================
|
|
188
|
+
// Multi-DVN Verification Tests
|
|
189
|
+
// ============================================================================
|
|
190
|
+
|
|
191
|
+
/// Multi-DVN: both DVNs required (no optional threshold)
|
|
192
|
+
#[test]
|
|
193
|
+
fn test_multi_dvn_two_required() {
|
|
194
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::TwoRequired);
|
|
195
|
+
|
|
196
|
+
// Send a message A → B
|
|
197
|
+
let sender = Address::generate(&env);
|
|
198
|
+
let options = create_default_options(&env);
|
|
199
|
+
let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
|
|
200
|
+
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
|
|
201
|
+
increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
|
|
202
|
+
|
|
203
|
+
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
204
|
+
let packet = decode_packet(&env, &packet_event.0);
|
|
205
|
+
let encoded_header = packet_codec_v1::encode_packet_header(&env, &packet);
|
|
206
|
+
let payload_hash = packet_codec_v1::payload_hash(&env, &packet);
|
|
207
|
+
|
|
208
|
+
let receive_uln302 = ReceiveUln302Client::new(&env, &chain_b.uln302.address);
|
|
209
|
+
|
|
210
|
+
// Verify with first DVN only - should NOT be verifiable yet (need 2 DVNs)
|
|
211
|
+
env.mock_auths(&[MockAuth {
|
|
212
|
+
address: &chain_b.dvn.address,
|
|
213
|
+
invoke: &MockAuthInvoke {
|
|
214
|
+
contract: &chain_b.uln302.address,
|
|
215
|
+
fn_name: "verify",
|
|
216
|
+
args: (&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
|
|
217
|
+
sub_invokes: &[],
|
|
218
|
+
},
|
|
219
|
+
}]);
|
|
220
|
+
receive_uln302.verify(&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
|
|
221
|
+
|
|
222
|
+
// Check verifiable status - should be false (only 1 of 2 required DVNs verified)
|
|
223
|
+
let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
|
|
224
|
+
assert!(!is_verifiable, "Should NOT be verifiable with only 1 DVN");
|
|
225
|
+
|
|
226
|
+
// Verify with second DVN
|
|
227
|
+
env.mock_auths(&[MockAuth {
|
|
228
|
+
address: &chain_b.dvn2.address,
|
|
229
|
+
invoke: &MockAuthInvoke {
|
|
230
|
+
contract: &chain_b.uln302.address,
|
|
231
|
+
fn_name: "verify",
|
|
232
|
+
args: (&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
|
|
233
|
+
sub_invokes: &[],
|
|
234
|
+
},
|
|
235
|
+
}]);
|
|
236
|
+
receive_uln302.verify(&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
|
|
237
|
+
|
|
238
|
+
// Now should be verifiable (both required DVNs verified)
|
|
239
|
+
let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
|
|
240
|
+
assert!(is_verifiable, "Should be verifiable with both DVNs");
|
|
241
|
+
|
|
242
|
+
// Commit and deliver
|
|
243
|
+
receive_uln302.commit_verification(&encoded_header, &payload_hash);
|
|
244
|
+
|
|
245
|
+
let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
|
|
246
|
+
let admin = Address::generate(&env);
|
|
247
|
+
lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
|
|
248
|
+
|
|
249
|
+
// State assertions
|
|
250
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
251
|
+
assert_eq!(chain_b.counter.count(), 1);
|
|
252
|
+
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/// Multi-DVN: duplicate DVN in required+optional (optional threshold = 1)
|
|
256
|
+
#[test]
|
|
257
|
+
fn test_multi_dvn_duplicate_required_optional() {
|
|
258
|
+
let TestSetup { env, chain_a, chain_b } = wired_setup_with_dvn_mode(DvnMode::DuplicateOptional);
|
|
259
|
+
|
|
260
|
+
// Send a message A → B
|
|
261
|
+
let sender = Address::generate(&env);
|
|
262
|
+
let options = create_default_options(&env);
|
|
263
|
+
let fee = quote(&chain_a, chain_b.eid, MsgType::Vanilla, &options);
|
|
264
|
+
mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, fee.native_fee);
|
|
265
|
+
increment(&env, &chain_a, &sender, chain_b.eid, MsgType::Vanilla, &options, &fee);
|
|
266
|
+
|
|
267
|
+
let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
|
|
268
|
+
let packet = decode_packet(&env, &packet_event.0);
|
|
269
|
+
let encoded_header = packet_codec_v1::encode_packet_header(&env, &packet);
|
|
270
|
+
let payload_hash = packet_codec_v1::payload_hash(&env, &packet);
|
|
271
|
+
|
|
272
|
+
let receive_uln302 = ReceiveUln302Client::new(&env, &chain_b.uln302.address);
|
|
273
|
+
|
|
274
|
+
// Verify with DVN only - because DVN is present in both required and optional lists (optional threshold = 1),
|
|
275
|
+
// this alone should satisfy verifiability.
|
|
276
|
+
env.mock_auths(&[MockAuth {
|
|
277
|
+
address: &chain_b.dvn.address,
|
|
278
|
+
invoke: &MockAuthInvoke {
|
|
279
|
+
contract: &chain_b.uln302.address,
|
|
280
|
+
fn_name: "verify",
|
|
281
|
+
args: (&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
|
|
282
|
+
sub_invokes: &[],
|
|
283
|
+
},
|
|
284
|
+
}]);
|
|
285
|
+
receive_uln302.verify(&chain_b.dvn.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
|
|
286
|
+
|
|
287
|
+
let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
|
|
288
|
+
assert!(is_verifiable, "Should be verifiable with duplicate DVN satisfying required + optional");
|
|
289
|
+
|
|
290
|
+
// Optionally verify with dvn2 (not required, but matches SUI pattern)
|
|
291
|
+
env.mock_auths(&[MockAuth {
|
|
292
|
+
address: &chain_b.dvn2.address,
|
|
293
|
+
invoke: &MockAuthInvoke {
|
|
294
|
+
contract: &chain_b.uln302.address,
|
|
295
|
+
fn_name: "verify",
|
|
296
|
+
args: (&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS).into_val(&env),
|
|
297
|
+
sub_invokes: &[],
|
|
298
|
+
},
|
|
299
|
+
}]);
|
|
300
|
+
receive_uln302.verify(&chain_b.dvn2.address, &encoded_header, &payload_hash, &CONFIRMATIONS);
|
|
301
|
+
|
|
302
|
+
let is_verifiable = receive_uln302.verifiable(&encoded_header, &payload_hash);
|
|
303
|
+
assert!(is_verifiable, "Should be verifiable once optional threshold is met");
|
|
304
|
+
|
|
305
|
+
receive_uln302.commit_verification(&encoded_header, &payload_hash);
|
|
306
|
+
|
|
307
|
+
let executor_value_b = get_executor_value_from_options(&env, &packet_event.1);
|
|
308
|
+
let admin = Address::generate(&env);
|
|
309
|
+
lz_receive_via_executor(&env, &chain_b, &admin, &packet, executor_value_b);
|
|
310
|
+
|
|
311
|
+
assert_eq!(chain_a.counter.outbound_count(&chain_b.eid), 1);
|
|
312
|
+
assert_eq!(chain_b.counter.count(), 1);
|
|
313
|
+
assert_eq!(chain_b.counter.inbound_count(&chain_a.eid), 1);
|
|
314
|
+
}
|