@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
|
@@ -1,16 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
use
|
|
1
|
+
//! Common utilities shared between SML and ULN302 integration tests.
|
|
2
|
+
|
|
3
|
+
extern crate std;
|
|
4
|
+
|
|
5
|
+
use crate::{codec::MsgType, counter::CounterClient, tests::mint_to};
|
|
6
|
+
use endpoint_v2::{EndpointV2Client, MessagingFee, Origin, OutboundPacket};
|
|
6
7
|
use message_lib_common::packet_codec_v1;
|
|
7
8
|
use soroban_sdk::{
|
|
8
9
|
address_payload::AddressPayload,
|
|
9
10
|
testutils::{Events, MockAuth, MockAuthInvoke},
|
|
10
|
-
Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val,
|
|
11
|
+
Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val, Vec,
|
|
11
12
|
};
|
|
13
|
+
use utils::buffer_reader::BufferReader;
|
|
14
|
+
|
|
15
|
+
/// Trait for common fields in chain setup structs.
|
|
16
|
+
/// Both SML and ULN302 ChainSetup implement this trait.
|
|
17
|
+
pub trait ChainSetupCommon<'a> {
|
|
18
|
+
fn counter(&self) -> &CounterClient<'a>;
|
|
19
|
+
fn endpoint(&self) -> &EndpointV2Client<'a>;
|
|
20
|
+
fn native_token(&self) -> &Address;
|
|
21
|
+
fn owner(&self) -> &Address;
|
|
22
|
+
/// Validates a packet using the message library's verification mechanism.
|
|
23
|
+
/// SML calls validate_packet, ULN302 does DVN verify + commit.
|
|
24
|
+
fn validate_packet(&self, env: &Env, packet_event: &(Bytes, Bytes, Address)) -> OutboundPacket;
|
|
25
|
+
}
|
|
12
26
|
|
|
13
|
-
///
|
|
27
|
+
/// Converts an Address into its 32-byte payload.
|
|
14
28
|
pub fn address_to_bytes32(address: &Address) -> BytesN<32> {
|
|
15
29
|
match address.to_payload().unwrap() {
|
|
16
30
|
AddressPayload::AccountIdPublicKeyEd25519(payload) => payload,
|
|
@@ -18,13 +32,76 @@ pub fn address_to_bytes32(address: &Address) -> BytesN<32> {
|
|
|
18
32
|
}
|
|
19
33
|
}
|
|
20
34
|
|
|
21
|
-
|
|
22
|
-
|
|
35
|
+
/// Sets the ZRO token on the endpoint with owner authorization.
|
|
36
|
+
pub fn set_zro(env: &Env, owner: &Address, endpoint: &EndpointV2Client<'_>, zro_token: &Address) {
|
|
37
|
+
env.mock_auths(&[MockAuth {
|
|
38
|
+
address: owner,
|
|
39
|
+
invoke: &MockAuthInvoke {
|
|
40
|
+
contract: &endpoint.address,
|
|
41
|
+
fn_name: "set_zro",
|
|
42
|
+
args: (zro_token,).into_val(env),
|
|
43
|
+
sub_invokes: &[],
|
|
44
|
+
},
|
|
45
|
+
}]);
|
|
46
|
+
endpoint.set_zro(zro_token);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// Registers a message library on the endpoint with owner authorization.
|
|
50
|
+
pub fn register_library(env: &Env, owner: &Address, endpoint: &EndpointV2Client<'_>, lib: &Address) {
|
|
51
|
+
env.mock_auths(&[MockAuth {
|
|
52
|
+
address: owner,
|
|
53
|
+
invoke: &MockAuthInvoke {
|
|
54
|
+
contract: &endpoint.address,
|
|
55
|
+
fn_name: "register_library",
|
|
56
|
+
args: (lib,).into_val(env),
|
|
57
|
+
sub_invokes: &[],
|
|
58
|
+
},
|
|
59
|
+
}]);
|
|
60
|
+
endpoint.register_library(lib);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// Sets the peer address for a counter on a destination EID.
|
|
64
|
+
pub fn set_peer(env: &Env, owner: &Address, counter: &CounterClient<'_>, dst_eid: u32, peer: &BytesN<32>) {
|
|
65
|
+
let peer_option = Some(peer.clone());
|
|
66
|
+
env.mock_auths(&[MockAuth {
|
|
67
|
+
address: owner,
|
|
68
|
+
invoke: &MockAuthInvoke {
|
|
69
|
+
contract: &counter.address,
|
|
70
|
+
fn_name: "set_peer",
|
|
71
|
+
args: (&dst_eid, &peer_option).into_val(env),
|
|
72
|
+
sub_invokes: &[],
|
|
73
|
+
},
|
|
74
|
+
}]);
|
|
75
|
+
counter.set_peer(&dst_eid, &peer_option);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Decodes an outbound packet emitted by the endpoint.
|
|
79
|
+
pub fn decode_packet(env: &Env, encoded_packet: &Bytes) -> OutboundPacket {
|
|
80
|
+
let header = packet_codec_v1::decode_packet_header(env, &encoded_packet.slice(0..packet_codec_v1::HEADER_LENGTH));
|
|
81
|
+
let payload = encoded_packet.slice(packet_codec_v1::HEADER_LENGTH..);
|
|
82
|
+
|
|
83
|
+
let mut payload_reader = BufferReader::new(&payload);
|
|
84
|
+
let guid = payload_reader.read_bytes_n::<32>();
|
|
85
|
+
let message = payload_reader.read_bytes_until_end();
|
|
86
|
+
|
|
87
|
+
OutboundPacket {
|
|
88
|
+
nonce: header.nonce,
|
|
89
|
+
src_eid: header.src_eid,
|
|
90
|
+
sender: Address::from_payload(env, AddressPayload::ContractIdHash(header.sender)),
|
|
91
|
+
dst_eid: header.dst_eid,
|
|
92
|
+
receiver: header.receiver,
|
|
93
|
+
guid,
|
|
94
|
+
message,
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
pub fn quote<'a, C: ChainSetupCommon<'a>>(chain: &C, dst_eid: u32, msg_type: MsgType, options: &Bytes) -> MessagingFee {
|
|
99
|
+
chain.counter().quote(&dst_eid, &(msg_type as u32), options, &false)
|
|
23
100
|
}
|
|
24
101
|
|
|
25
|
-
pub fn increment(
|
|
102
|
+
pub fn increment<'a, C: ChainSetupCommon<'a>>(
|
|
26
103
|
env: &Env,
|
|
27
|
-
chain: &
|
|
104
|
+
chain: &C,
|
|
28
105
|
sender: &Address,
|
|
29
106
|
dst_eid: u32,
|
|
30
107
|
msg_type: MsgType,
|
|
@@ -35,87 +112,89 @@ pub fn increment(
|
|
|
35
112
|
env.mock_auths(&[MockAuth {
|
|
36
113
|
address: sender,
|
|
37
114
|
invoke: &MockAuthInvoke {
|
|
38
|
-
contract: &chain.counter.address,
|
|
115
|
+
contract: &chain.counter().address,
|
|
39
116
|
fn_name: "increment",
|
|
40
117
|
args: (sender, &dst_eid, &msg_type, options, fee).into_val(env),
|
|
41
118
|
sub_invokes: &[MockAuthInvoke {
|
|
42
|
-
contract:
|
|
119
|
+
contract: chain.native_token(),
|
|
43
120
|
fn_name: "transfer",
|
|
44
|
-
args: (sender, &chain.endpoint.address, &fee.native_fee).into_val(env),
|
|
121
|
+
args: (sender, &chain.endpoint().address, &fee.native_fee).into_val(env),
|
|
45
122
|
sub_invokes: &[],
|
|
46
123
|
}],
|
|
47
124
|
},
|
|
48
125
|
}]);
|
|
49
|
-
chain.counter.increment(sender, &dst_eid, &msg_type, options, fee);
|
|
126
|
+
chain.counter().increment(sender, &dst_eid, &msg_type, options, fee);
|
|
50
127
|
}
|
|
51
128
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
let payload_hash = packet_codec_v1::payload_hash(env, &packet);
|
|
56
|
-
|
|
57
|
-
env.mock_auths(&[MockAuth {
|
|
58
|
-
address: &chain.owner,
|
|
59
|
-
invoke: &MockAuthInvoke {
|
|
60
|
-
contract: &chain.sml.address,
|
|
61
|
-
fn_name: "validate_packet",
|
|
62
|
-
args: (&encoded_header, &payload_hash).into_val(env),
|
|
63
|
-
sub_invokes: &[],
|
|
64
|
-
},
|
|
65
|
-
}]);
|
|
66
|
-
chain.sml.validate_packet(&encoded_header, &payload_hash);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
pub fn lz_receive(
|
|
129
|
+
/// Execute lz_receive on the counter contract.
|
|
130
|
+
/// Automatically mints native tokens to the executor if value > 0.
|
|
131
|
+
pub fn lz_receive<'a, C: ChainSetupCommon<'a>>(
|
|
70
132
|
env: &Env,
|
|
71
|
-
chain: &
|
|
133
|
+
chain: &C,
|
|
72
134
|
executor: &Address,
|
|
73
135
|
packet: &OutboundPacket,
|
|
74
136
|
value: i128,
|
|
75
|
-
_aba: bool,
|
|
76
137
|
) {
|
|
138
|
+
// Mint native tokens to executor if value > 0
|
|
139
|
+
if value > 0 {
|
|
140
|
+
mint_to(env, chain.owner(), chain.native_token(), executor, value);
|
|
141
|
+
}
|
|
142
|
+
|
|
77
143
|
let origin = Origin { src_eid: packet.src_eid, sender: address_to_bytes32(&packet.sender), nonce: packet.nonce };
|
|
78
144
|
|
|
79
145
|
let sub_invokes_with_transfer = [MockAuthInvoke {
|
|
80
|
-
contract:
|
|
146
|
+
contract: chain.native_token(),
|
|
81
147
|
fn_name: "transfer",
|
|
82
|
-
args: (executor, &chain.counter.address, &value).into_val(env),
|
|
148
|
+
args: (executor, &chain.counter().address, &value).into_val(env),
|
|
83
149
|
sub_invokes: &[],
|
|
84
150
|
}];
|
|
85
151
|
|
|
86
152
|
env.mock_auths(&[MockAuth {
|
|
87
153
|
address: executor,
|
|
88
154
|
invoke: &MockAuthInvoke {
|
|
89
|
-
contract: &chain.counter.address,
|
|
155
|
+
contract: &chain.counter().address,
|
|
90
156
|
fn_name: "lz_receive",
|
|
91
157
|
args: (executor, &origin, &packet.guid, &packet.message, &Bytes::new(env), &value).into_val(env),
|
|
92
158
|
sub_invokes: if value > 0 { &sub_invokes_with_transfer } else { &[] },
|
|
93
159
|
},
|
|
94
160
|
}]);
|
|
95
|
-
chain.counter.lz_receive(executor, &origin, &packet.guid, &packet.message, &Bytes::new(env), &value);
|
|
161
|
+
chain.counter().lz_receive(executor, &origin, &packet.guid, &packet.message, &Bytes::new(env), &value);
|
|
96
162
|
}
|
|
97
163
|
|
|
98
|
-
|
|
164
|
+
/// Execute lz_compose on the counter contract.
|
|
165
|
+
/// Automatically mints native tokens to the executor if value > 0.
|
|
166
|
+
pub fn lz_compose<'a, C: ChainSetupCommon<'a>>(
|
|
167
|
+
env: &Env,
|
|
168
|
+
chain: &C,
|
|
169
|
+
executor: &Address,
|
|
170
|
+
packet: &OutboundPacket,
|
|
171
|
+
value: i128,
|
|
172
|
+
) {
|
|
173
|
+
// Mint native tokens to executor if value > 0
|
|
174
|
+
if value > 0 {
|
|
175
|
+
mint_to(env, chain.owner(), chain.native_token(), executor, value);
|
|
176
|
+
}
|
|
177
|
+
|
|
99
178
|
let sub_invokes_with_transfer = [MockAuthInvoke {
|
|
100
|
-
contract:
|
|
101
|
-
fn_name: "
|
|
102
|
-
args: (executor,
|
|
179
|
+
contract: chain.native_token(),
|
|
180
|
+
fn_name: "transfer",
|
|
181
|
+
args: (executor, &chain.counter().address, &value).into_val(env),
|
|
103
182
|
sub_invokes: &[],
|
|
104
183
|
}];
|
|
105
184
|
|
|
106
185
|
env.mock_auths(&[MockAuth {
|
|
107
186
|
address: executor,
|
|
108
187
|
invoke: &MockAuthInvoke {
|
|
109
|
-
contract: &chain.counter.address,
|
|
188
|
+
contract: &chain.counter().address,
|
|
110
189
|
fn_name: "lz_compose",
|
|
111
|
-
args: (executor, &chain.counter.address, &packet.guid, &0_u32, &packet.message, &Bytes::new(env), &value)
|
|
190
|
+
args: (executor, &chain.counter().address, &packet.guid, &0_u32, &packet.message, &Bytes::new(env), &value)
|
|
112
191
|
.into_val(env),
|
|
113
192
|
sub_invokes: if value > 0 { &sub_invokes_with_transfer } else { &[] },
|
|
114
193
|
},
|
|
115
194
|
}]);
|
|
116
|
-
chain.counter.lz_compose(
|
|
195
|
+
chain.counter().lz_compose(
|
|
117
196
|
executor,
|
|
118
|
-
&chain.counter.address,
|
|
197
|
+
&chain.counter().address,
|
|
119
198
|
&packet.guid,
|
|
120
199
|
&0,
|
|
121
200
|
&packet.message,
|
|
@@ -124,11 +203,24 @@ pub fn lz_compose(env: &Env, chain: &ChainSetup<'_>, executor: &Address, packet:
|
|
|
124
203
|
);
|
|
125
204
|
}
|
|
126
205
|
|
|
127
|
-
|
|
206
|
+
/// Validates a packet using the chain's message library verification mechanism.
|
|
207
|
+
/// This is a convenience wrapper around the trait method.
|
|
208
|
+
pub fn validate_packet<'a, C: ChainSetupCommon<'a>>(
|
|
209
|
+
env: &Env,
|
|
210
|
+
chain: &C,
|
|
211
|
+
packet_event: &(Bytes, Bytes, Address),
|
|
212
|
+
) -> OutboundPacket {
|
|
213
|
+
chain.validate_packet(env, packet_event)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/// Scans for the latest packet_sent event and returns (encoded_payload, options, send_library).
|
|
128
217
|
pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, Bytes, Address)> {
|
|
129
|
-
let
|
|
130
|
-
|
|
131
|
-
|
|
218
|
+
let events = env.events().all();
|
|
219
|
+
let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
|
|
220
|
+
|
|
221
|
+
// Iterate in reverse to find the most recent packet sent event
|
|
222
|
+
for i in (0..events.len()).rev() {
|
|
223
|
+
let (emitter, topics, data) = events.get(i).unwrap();
|
|
132
224
|
if emitter == *endpoint && topics.contains(packet_sent_symbol) {
|
|
133
225
|
let map: Map<Symbol, Val> = data.into_val(env);
|
|
134
226
|
|
|
@@ -136,9 +228,60 @@ pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, B
|
|
|
136
228
|
let options: Bytes = map.get(Symbol::new(env, "options")).unwrap().into_val(env);
|
|
137
229
|
let send_library: Address = map.get(Symbol::new(env, "send_library")).unwrap().into_val(env);
|
|
138
230
|
|
|
139
|
-
|
|
231
|
+
return Some((encoded_payload, options, send_library));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
None
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/// Scans for ALL packet_sent events from an endpoint and returns them in chronological order.
|
|
239
|
+
/// NOTE: In Soroban test environment, events from previous contract calls may be cleared.
|
|
240
|
+
/// Use this only after all messages have been sent in a single "transaction" or collect events incrementally.
|
|
241
|
+
#[allow(dead_code)]
|
|
242
|
+
pub fn scan_all_packet_sent_events(env: &Env, endpoint: &Address) -> Vec<(Bytes, Bytes, Address)> {
|
|
243
|
+
let events = env.events().all();
|
|
244
|
+
let packet_sent_symbol = Symbol::new(env, "packet_sent").to_val();
|
|
245
|
+
let mut result = Vec::new(env);
|
|
246
|
+
|
|
247
|
+
for i in 0..events.len() {
|
|
248
|
+
let (emitter, topics, data) = events.get(i).unwrap();
|
|
249
|
+
if emitter == *endpoint && topics.contains(packet_sent_symbol) {
|
|
250
|
+
let map: Map<Symbol, Val> = data.into_val(env);
|
|
251
|
+
|
|
252
|
+
let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
|
|
253
|
+
let options: Bytes = map.get(Symbol::new(env, "options")).unwrap().into_val(env);
|
|
254
|
+
let send_library: Address = map.get(Symbol::new(env, "send_library")).unwrap().into_val(env);
|
|
255
|
+
|
|
256
|
+
result.push_back((encoded_payload, options, send_library));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
result
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/// Compose sent event data: (from, to, guid, index, message)
|
|
264
|
+
pub type ComposeSentEvent = (Address, Address, BytesN<32>, u32, Bytes);
|
|
265
|
+
|
|
266
|
+
/// Scans for the latest compose_sent event and returns (from, to, guid, index, message).
|
|
267
|
+
pub fn scan_compose_sent_event(env: &Env, endpoint: &Address) -> Option<ComposeSentEvent> {
|
|
268
|
+
let events = env.events().all();
|
|
269
|
+
let compose_sent_symbol = Symbol::new(env, "compose_sent").to_val();
|
|
270
|
+
|
|
271
|
+
// Iterate in reverse to find the most recent compose sent event
|
|
272
|
+
for i in (0..events.len()).rev() {
|
|
273
|
+
let (emitter, topics, data) = events.get(i).unwrap();
|
|
274
|
+
if emitter == *endpoint && topics.contains(compose_sent_symbol) {
|
|
275
|
+
let map: Map<Symbol, Val> = data.into_val(env);
|
|
276
|
+
let from: Address = topics.get(1).unwrap().into_val(env);
|
|
277
|
+
let to: Address = topics.get(2).unwrap().into_val(env);
|
|
278
|
+
let guid: BytesN<32> = topics.get(3).unwrap().into_val(env);
|
|
279
|
+
let index: u32 = topics.get(4).unwrap().into_val(env);
|
|
280
|
+
let message: Bytes = map.get(Symbol::new(env, "message")).unwrap().into_val(env);
|
|
281
|
+
|
|
282
|
+
return Some((from, to, guid, index, message));
|
|
140
283
|
}
|
|
141
284
|
}
|
|
142
285
|
|
|
143
|
-
|
|
286
|
+
None
|
|
144
287
|
}
|
|
@@ -4,33 +4,32 @@ use crate::{
|
|
|
4
4
|
options,
|
|
5
5
|
storage::CounterStorage,
|
|
6
6
|
};
|
|
7
|
-
use common_macros::{contract_impl,
|
|
7
|
+
use common_macros::{contract_impl, only_auth};
|
|
8
8
|
use endpoint_v2::{
|
|
9
9
|
ILayerZeroComposer, LayerZeroEndpointV2Client, MessagingChannelClient, MessagingComposerClient, MessagingFee,
|
|
10
10
|
Origin,
|
|
11
11
|
};
|
|
12
12
|
use oapp::{
|
|
13
|
-
oapp_core::{
|
|
14
|
-
oapp_receiver::{
|
|
15
|
-
oapp_sender::
|
|
13
|
+
oapp_core::{initialize_oapp, OAppCore},
|
|
14
|
+
oapp_receiver::{LzReceiveInternal, OAppReceiver},
|
|
15
|
+
oapp_sender::OAppSenderInternal,
|
|
16
16
|
};
|
|
17
|
-
use oapp_macros::
|
|
17
|
+
use oapp_macros::oapp;
|
|
18
18
|
use soroban_sdk::{assert_with_error, panic_with_error, token::TokenClient, Address, Bytes, BytesN, Env};
|
|
19
19
|
|
|
20
|
-
#[oapp]
|
|
21
|
-
#[oapp_manual_impl(receiver)]
|
|
20
|
+
#[oapp(custom = [receiver])]
|
|
22
21
|
pub struct Counter;
|
|
23
22
|
|
|
24
23
|
#[contract_impl]
|
|
25
24
|
impl Counter {
|
|
26
25
|
pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address, delegate: &Address) {
|
|
27
|
-
|
|
26
|
+
initialize_oapp::<Self>(env, owner, endpoint, &Some(delegate.clone()));
|
|
28
27
|
let endpoint_client = LayerZeroEndpointV2Client::new(env, endpoint);
|
|
29
28
|
CounterStorage::set_eid(env, &endpoint_client.eid());
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
pub fn quote(env: &Env, dst_eid: u32, msg_type: u32, options: &Bytes, pay_in_zro: bool) -> MessagingFee {
|
|
33
|
-
Self::
|
|
32
|
+
Self::__quote(env, dst_eid, &codec::encode(env, (msg_type as u8).into(), Self::eid(env)), options, pay_in_zro)
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
pub fn increment(env: &Env, caller: &Address, dst_eid: u32, msg_type: u32, options: &Bytes, fee: &MessagingFee) {
|
|
@@ -42,19 +41,19 @@ impl Counter {
|
|
|
42
41
|
|
|
43
42
|
// Send the message
|
|
44
43
|
let message = codec::encode(env, (msg_type as u8).into(), Self::eid(env));
|
|
45
|
-
Self::
|
|
44
|
+
Self::__lz_send(env, dst_eid, &message, options, caller, fee, caller);
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
// ============================================================================================
|
|
49
48
|
// Owner functions
|
|
50
49
|
// ============================================================================================
|
|
51
50
|
|
|
52
|
-
#[
|
|
51
|
+
#[only_auth]
|
|
53
52
|
pub fn set_ordered_nonce(env: &Env, ordered_nonce: bool) {
|
|
54
53
|
CounterStorage::set_ordered_nonce(env, &ordered_nonce);
|
|
55
54
|
}
|
|
56
55
|
|
|
57
|
-
#[
|
|
56
|
+
#[only_auth]
|
|
58
57
|
pub fn skip_inbound_nonce(env: &Env, src_eid: u32, sender: &BytesN<32>, nonce: u64) {
|
|
59
58
|
let contract_address = env.current_contract_address();
|
|
60
59
|
|
|
@@ -109,30 +108,19 @@ impl Counter {
|
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
// ============================================================================================
|
|
112
|
-
//
|
|
111
|
+
// LzReceiveInternal implementation
|
|
113
112
|
// ============================================================================================
|
|
114
113
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
fn next_nonce(env: &Env, src_eid: u32, sender: &BytesN<32>) -> u64 {
|
|
118
|
-
if CounterStorage::ordered_nonce(env) {
|
|
119
|
-
CounterStorage::max_received_nonce(env, src_eid, sender) + 1
|
|
120
|
-
} else {
|
|
121
|
-
0
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
fn lz_receive(
|
|
114
|
+
impl LzReceiveInternal for Counter {
|
|
115
|
+
fn __lz_receive(
|
|
126
116
|
env: &Env,
|
|
127
|
-
executor: &Address,
|
|
128
117
|
origin: &Origin,
|
|
129
118
|
guid: &BytesN<32>,
|
|
130
119
|
message: &Bytes,
|
|
131
120
|
_extra_data: &Bytes,
|
|
121
|
+
_executor: &Address,
|
|
132
122
|
value: i128,
|
|
133
123
|
) {
|
|
134
|
-
oapp_receiver::verify_and_clear_payload::<Self>(env, executor, origin, guid, message, value);
|
|
135
|
-
|
|
136
124
|
// handle the message
|
|
137
125
|
Self::__accept_nonce(env, origin.src_eid, &origin.sender, origin.nonce);
|
|
138
126
|
|
|
@@ -166,12 +154,12 @@ impl OAppReceiver for Counter {
|
|
|
166
154
|
|
|
167
155
|
// Send the response message
|
|
168
156
|
let options = options::executor_lz_receive_option(env, 200000, 10);
|
|
169
|
-
Self::
|
|
157
|
+
Self::__lz_send(
|
|
170
158
|
env,
|
|
171
|
-
&contract_address,
|
|
172
159
|
origin.src_eid,
|
|
173
160
|
&codec::encode_with_value(env, MsgType::Vanilla, Self::eid(env), 10),
|
|
174
161
|
&options,
|
|
162
|
+
&contract_address,
|
|
175
163
|
&MessagingFee { native_fee: value, zro_fee: 0 },
|
|
176
164
|
&contract_address,
|
|
177
165
|
);
|
|
@@ -180,6 +168,21 @@ impl OAppReceiver for Counter {
|
|
|
180
168
|
}
|
|
181
169
|
}
|
|
182
170
|
|
|
171
|
+
// ============================================================================================
|
|
172
|
+
// Custom OAppReceiver implementation
|
|
173
|
+
// ============================================================================================
|
|
174
|
+
|
|
175
|
+
#[contract_impl(contracttrait)]
|
|
176
|
+
impl OAppReceiver for Counter {
|
|
177
|
+
fn next_nonce(env: &Env, src_eid: u32, sender: &BytesN<32>) -> u64 {
|
|
178
|
+
if CounterStorage::ordered_nonce(env) {
|
|
179
|
+
CounterStorage::max_received_nonce(env, src_eid, sender) + 1
|
|
180
|
+
} else {
|
|
181
|
+
0
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
183
186
|
// ============================================================================================
|
|
184
187
|
// ILayerZeroComposer implementation
|
|
185
188
|
// ============================================================================================
|
|
@@ -196,28 +199,18 @@ impl ILayerZeroComposer for Counter {
|
|
|
196
199
|
_extra_data: &Bytes,
|
|
197
200
|
value: i128,
|
|
198
201
|
) {
|
|
199
|
-
executor
|
|
202
|
+
// Clear compose message, transfer value, and require executor auth
|
|
203
|
+
clear_compose_and_transfer::<Self>(env, executor, from, guid, index, message, value);
|
|
200
204
|
|
|
201
205
|
let msg_type = codec::msg_type(message);
|
|
202
206
|
if msg_type != MsgType::Composed && msg_type != MsgType::ComposedABA {
|
|
203
207
|
panic_with_error!(env, CounterError::InvalidMsgType);
|
|
204
208
|
}
|
|
205
209
|
|
|
206
|
-
let curr_address = env.current_contract_address();
|
|
207
|
-
let endpoint_address = Self::endpoint(env);
|
|
208
|
-
|
|
209
|
-
// Transfer value from executor to current contract
|
|
210
|
-
if value > 0 {
|
|
211
|
-
let native_token = LayerZeroEndpointV2Client::new(env, &endpoint_address).native_token();
|
|
212
|
-
TokenClient::new(env, &native_token).transfer_from(executor, executor, &curr_address, &value);
|
|
213
|
-
}
|
|
214
210
|
// Assert the value is sufficient
|
|
215
211
|
let expected_msg_value = codec::value(env, message);
|
|
216
212
|
assert_with_error!(env, value >= expected_msg_value, CounterError::InsufficientValue);
|
|
217
213
|
|
|
218
|
-
// Clear the compose message
|
|
219
|
-
MessagingComposerClient::new(env, &endpoint_address).clear_compose(&curr_address, from, guid, &index, message);
|
|
220
|
-
|
|
221
214
|
// Increment the composed count
|
|
222
215
|
CounterStorage::set_composed_count(env, &(Self::composed_count(env) + 1));
|
|
223
216
|
|
|
@@ -229,15 +222,46 @@ impl ILayerZeroComposer for Counter {
|
|
|
229
222
|
CounterStorage::set_outbound_count(env, src_eid, &(Self::outbound_count(env, src_eid) + 1));
|
|
230
223
|
|
|
231
224
|
// Send the response message
|
|
232
|
-
|
|
225
|
+
let curr_address = env.current_contract_address();
|
|
226
|
+
Self::__lz_send(
|
|
233
227
|
env,
|
|
234
|
-
&curr_address,
|
|
235
228
|
src_eid,
|
|
236
229
|
&codec::encode(env, MsgType::Vanilla, Self::eid(env)),
|
|
237
230
|
&options::executor_lz_receive_option(env, 200000, 0),
|
|
231
|
+
&curr_address,
|
|
238
232
|
&MessagingFee { native_fee: value, zro_fee: 0 },
|
|
239
233
|
&curr_address,
|
|
240
234
|
);
|
|
241
235
|
}
|
|
242
236
|
}
|
|
243
237
|
}
|
|
238
|
+
|
|
239
|
+
/// Clears a compose message and transfers native token value from executor to the OApp.
|
|
240
|
+
///
|
|
241
|
+
/// This helper handles the common pattern in `lz_compose` implementations:
|
|
242
|
+
/// 1. Requires executor authorization
|
|
243
|
+
/// 2. Clears the compose message from the endpoint
|
|
244
|
+
/// 3. Transfers native token from executor to OApp if value > 0
|
|
245
|
+
pub fn clear_compose_and_transfer<T: OAppCore>(
|
|
246
|
+
env: &Env,
|
|
247
|
+
executor: &Address,
|
|
248
|
+
from: &Address,
|
|
249
|
+
guid: &BytesN<32>,
|
|
250
|
+
index: u32,
|
|
251
|
+
message: &Bytes,
|
|
252
|
+
value: i128,
|
|
253
|
+
) {
|
|
254
|
+
executor.require_auth();
|
|
255
|
+
|
|
256
|
+
let curr_address = env.current_contract_address();
|
|
257
|
+
let endpoint = T::endpoint(env);
|
|
258
|
+
|
|
259
|
+
// Clear the compose message
|
|
260
|
+
MessagingComposerClient::new(env, &endpoint).clear_compose(&curr_address, from, guid, &index, message);
|
|
261
|
+
|
|
262
|
+
// Transfer value from executor to current contract
|
|
263
|
+
if value > 0 {
|
|
264
|
+
let native_token = LayerZeroEndpointV2Client::new(env, &endpoint).native_token();
|
|
265
|
+
TokenClient::new(env, &native_token).transfer(executor, &curr_address, &value);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
@@ -22,16 +22,3 @@ pub fn mint_to(env: &Env, owner: &Address, native_token: &Address, to: &Address,
|
|
|
22
22
|
sac.mint(to, &amount);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
pub fn approve(env: &Env, from: &Address, native_token: &Address, amount: i128) {
|
|
26
|
-
env.mock_auths(&[MockAuth {
|
|
27
|
-
address: from,
|
|
28
|
-
invoke: &MockAuthInvoke {
|
|
29
|
-
contract: native_token,
|
|
30
|
-
fn_name: "approve",
|
|
31
|
-
args: (from, from, amount, 10_u32).into_val(env),
|
|
32
|
-
sub_invokes: &[],
|
|
33
|
-
},
|
|
34
|
-
}]);
|
|
35
|
-
let sac = StellarAssetClient::new(env, native_token);
|
|
36
|
-
sac.approve(from, from, &amount, &10_u32);
|
|
37
|
-
}
|
|
@@ -11,7 +11,7 @@ use crate::{
|
|
|
11
11
|
codec::{self, MsgType},
|
|
12
12
|
counter::{Counter, CounterClient},
|
|
13
13
|
errors::CounterError,
|
|
14
|
-
tests::
|
|
14
|
+
tests::mint_to,
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
struct TestSetup<'a> {
|
|
@@ -252,11 +252,10 @@ fn test_lz_compose() {
|
|
|
252
252
|
let extra_data = Bytes::new(&env);
|
|
253
253
|
|
|
254
254
|
mint_to(&env, &owner, &native_token, &executor, value as i128);
|
|
255
|
-
approve(&env, &executor, &native_token, value as i128);
|
|
256
255
|
let sub_invokes_with_transfer = MockAuthInvoke {
|
|
257
256
|
contract: &native_token,
|
|
258
|
-
fn_name: "
|
|
259
|
-
args: (&executor, &
|
|
257
|
+
fn_name: "transfer",
|
|
258
|
+
args: (&executor, &counter.address, &(value as i128)).into_val(&env),
|
|
260
259
|
sub_invokes: &[],
|
|
261
260
|
};
|
|
262
261
|
env.mock_auths(&[MockAuth {
|
|
@@ -304,11 +303,10 @@ fn test_lz_compose_aba() {
|
|
|
304
303
|
|
|
305
304
|
setup_mock_peer(&env, &owner, &counter, origin.src_eid);
|
|
306
305
|
mint_to(&env, &owner, &native_token, &executor, value as i128);
|
|
307
|
-
approve(&env, &executor, &native_token, value as i128);
|
|
308
306
|
let sub_invokes_with_transfer = MockAuthInvoke {
|
|
309
307
|
contract: &native_token,
|
|
310
|
-
fn_name: "
|
|
311
|
-
args: (&executor, &
|
|
308
|
+
fn_name: "transfer",
|
|
309
|
+
args: (&executor, &counter.address, &(value as i128)).into_val(&env),
|
|
312
310
|
sub_invokes: &[],
|
|
313
311
|
};
|
|
314
312
|
env.mock_auths(&[MockAuth {
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
use common_macros::contract_error;
|
|
2
2
|
|
|
3
|
+
// OApp library error codes: 2000-2099
|
|
4
|
+
// See ERROR_SPEC.md for allocation rules
|
|
5
|
+
|
|
6
|
+
/// OAppError: 2000-2099
|
|
3
7
|
#[contract_error]
|
|
4
8
|
pub enum OAppError {
|
|
5
9
|
InvalidOptions = 2000,
|
|
6
10
|
NoPeer,
|
|
7
11
|
OnlyPeer,
|
|
8
|
-
|
|
12
|
+
ZroTokenUnavailable,
|
|
9
13
|
}
|