@layerzerolabs/protocol-stellar-v2 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +727 -0
- package/.turbo/turbo-lint.log +158 -0
- package/.turbo/turbo-test.log +796 -0
- package/Cargo.lock +2237 -0
- package/Cargo.toml +63 -0
- package/clippy.toml +7 -0
- package/contracts/common-macros/Cargo.toml +20 -0
- package/contracts/common-macros/src/error.rs +53 -0
- package/contracts/common-macros/src/event.rs +16 -0
- package/contracts/common-macros/src/lib.rs +255 -0
- package/contracts/common-macros/src/ownable.rs +63 -0
- package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +310 -0
- package/contracts/common-macros/src/storage.rs +439 -0
- package/contracts/common-macros/src/tests.rs +287 -0
- package/contracts/common-macros/src/ttl_configurable.rs +60 -0
- package/contracts/endpoint-v2/ARCHITECTURE.md +233 -0
- package/contracts/endpoint-v2/Cargo.toml +30 -0
- package/contracts/endpoint-v2/src/constants.rs +52 -0
- package/contracts/endpoint-v2/src/endpoint_v2.rs +305 -0
- package/contracts/endpoint-v2/src/errors.rs +29 -0
- package/contracts/endpoint-v2/src/events.rs +207 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_composer.rs +26 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +170 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_receiver.rs +43 -0
- package/contracts/endpoint-v2/src/interfaces/message_lib.rs +62 -0
- package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +220 -0
- package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +121 -0
- package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +63 -0
- package/contracts/endpoint-v2/src/interfaces/mod.rs +17 -0
- package/contracts/endpoint-v2/src/interfaces/send_lib.rs +70 -0
- package/contracts/endpoint-v2/src/lib.rs +22 -0
- package/contracts/endpoint-v2/src/message_lib_manager.rs +315 -0
- package/contracts/endpoint-v2/src/messaging_channel.rs +218 -0
- package/contracts/endpoint-v2/src/messaging_composer.rs +76 -0
- package/contracts/endpoint-v2/src/storage.rs +78 -0
- package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +131 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +237 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +42 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +76 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +211 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +18 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +10 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +10 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +424 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +144 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +72 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +29 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +513 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +43 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +27 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +30 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +202 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +59 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +172 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +23 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +10 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +131 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +35 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +28 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +79 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +246 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +285 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +180 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +405 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +80 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +131 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +358 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +316 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +288 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +316 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +388 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +307 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +10 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +239 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +324 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +242 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +232 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +212 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +213 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +269 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +173 -0
- package/contracts/endpoint-v2/src/tests/mock.rs +132 -0
- package/contracts/endpoint-v2/src/tests/mod.rs +12 -0
- package/contracts/endpoint-v2/src/tests/util/build_payload.rs +126 -0
- package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +82 -0
- package/contracts/endpoint-v2/src/tests/util/keccak256.rs +115 -0
- package/contracts/endpoint-v2/src/tests/util/mod.rs +3 -0
- package/contracts/endpoint-v2/src/util.rs +52 -0
- package/contracts/message-libs/Cargo.toml +12 -0
- package/contracts/message-libs/block-message-lib/Cargo.toml +19 -0
- package/contracts/message-libs/block-message-lib/src/lib.rs +70 -0
- package/contracts/message-libs/lib.rs +2 -0
- package/contracts/message-libs/message-lib-common/Cargo.toml +24 -0
- package/contracts/message-libs/message-lib-common/src/errors.rs +20 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +55 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/executor.rs +46 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +7 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/treasury.rs +17 -0
- package/contracts/message-libs/message-lib-common/src/lib.rs +14 -0
- package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +99 -0
- package/contracts/message-libs/message-lib-common/src/testing_utils.rs +27 -0
- package/contracts/message-libs/message-lib-common/src/tests/mod.rs +2 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +162 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +319 -0
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +190 -0
- package/contracts/message-libs/simple-message-lib/Cargo.toml +26 -0
- package/contracts/message-libs/simple-message-lib/src/errors.rs +11 -0
- package/contracts/message-libs/simple-message-lib/src/lib.rs +14 -0
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +136 -0
- package/contracts/message-libs/simple-message-lib/src/storage.rs +27 -0
- package/contracts/message-libs/simple-message-lib/src/test.rs +280 -0
- package/contracts/message-libs/treasury/Cargo.toml +27 -0
- package/contracts/message-libs/treasury/src/errors.rs +10 -0
- package/contracts/message-libs/treasury/src/events.rs +28 -0
- package/contracts/message-libs/treasury/src/interfaces/mod.rs +3 -0
- package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +20 -0
- package/contracts/message-libs/treasury/src/lib.rs +20 -0
- package/contracts/message-libs/treasury/src/storage.rs +18 -0
- package/contracts/message-libs/treasury/src/tests/mod.rs +2 -0
- package/contracts/message-libs/treasury/src/tests/setup.rs +112 -0
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +562 -0
- package/contracts/message-libs/treasury/src/treasury.rs +140 -0
- package/contracts/message-libs/uln-302/Cargo.toml +28 -0
- package/contracts/message-libs/uln-302/src/config_validation.rs +173 -0
- package/contracts/message-libs/uln-302/src/errors.rs +29 -0
- package/contracts/message-libs/uln-302/src/events.rs +72 -0
- package/contracts/message-libs/uln-302/src/interfaces/mod.rs +5 -0
- package/contracts/message-libs/uln-302/src/interfaces/receive.rs +82 -0
- package/contracts/message-libs/uln-302/src/interfaces/send.rs +159 -0
- package/contracts/message-libs/uln-302/src/lib.rs +20 -0
- package/contracts/message-libs/uln-302/src/receive.rs +199 -0
- package/contracts/message-libs/uln-302/src/send.rs +349 -0
- package/contracts/message-libs/uln-302/src/storage.rs +47 -0
- package/contracts/message-libs/uln-302/src/tests/config/mod.rs +2 -0
- package/contracts/message-libs/uln-302/src/tests/config/oapp_uln_config.rs +291 -0
- package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +163 -0
- package/contracts/message-libs/uln-302/src/tests/mod.rs +7 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/commit_verification.rs +183 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/confirmations.rs +128 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +104 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/mod.rs +66 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +79 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +463 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +173 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +132 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +117 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/mod.rs +6 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/quote.rs +586 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +834 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +95 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +80 -0
- package/contracts/message-libs/uln-302/src/tests/setup.rs +268 -0
- package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +47 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +51 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +51 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_oapp_executor_config.rs +48 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +4 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +998 -0
- package/contracts/message-libs/uln-302/src/uln302.rs +117 -0
- package/contracts/oapp-macros/Cargo.toml +21 -0
- package/contracts/oapp-macros/src/lib.rs +408 -0
- package/contracts/oapp-macros/src/oapp_core.rs +49 -0
- package/contracts/oapp-macros/src/oapp_full.rs +15 -0
- package/contracts/oapp-macros/src/oapp_options_type3.rs +46 -0
- package/contracts/oapp-macros/src/oapp_receiver.rs +67 -0
- package/contracts/oapp-macros/src/oapp_sender.rs +23 -0
- package/contracts/oapp-macros/src/util.rs +103 -0
- package/contracts/oapp-macros/tests/test_macros.rs +522 -0
- package/contracts/oapps/Cargo.toml +12 -0
- package/contracts/oapps/counter/Cargo.toml +24 -0
- package/contracts/oapps/counter/integration_tests/mod.rs +3 -0
- package/contracts/oapps/counter/integration_tests/setup.rs +201 -0
- package/contracts/oapps/counter/integration_tests/test_with_sml.rs +166 -0
- package/contracts/oapps/counter/integration_tests/utils.rs +144 -0
- package/contracts/oapps/counter/src/codec.rs +63 -0
- package/contracts/oapps/counter/src/counter.rs +235 -0
- package/contracts/oapps/counter/src/errors.rs +9 -0
- package/contracts/oapps/counter/src/lib.rs +16 -0
- package/contracts/oapps/counter/src/options.rs +30 -0
- package/contracts/oapps/counter/src/storage.rs +33 -0
- package/contracts/oapps/counter/src/tests/mod.rs +37 -0
- package/contracts/oapps/counter/src/tests/test_codec.rs +64 -0
- package/contracts/oapps/counter/src/tests/test_counter.rs +390 -0
- package/contracts/oapps/counter/src/u256_ext.rs +21 -0
- package/contracts/oapps/lib.rs +2 -0
- package/contracts/oapps/oapp/Cargo.toml +21 -0
- package/contracts/oapps/oapp/src/errors.rs +9 -0
- package/contracts/oapps/oapp/src/lib.rs +10 -0
- package/contracts/oapps/oapp/src/oapp_core.rs +92 -0
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +89 -0
- package/contracts/oapps/oapp/src/oapp_receiver.rs +72 -0
- package/contracts/oapps/oapp/src/oapp_sender.rs +66 -0
- package/contracts/oapps/oapp/src/tests/mod.rs +4 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +162 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +180 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +157 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +283 -0
- package/contracts/utils/Cargo.toml +21 -0
- package/contracts/utils/src/buffer_reader.rs +143 -0
- package/contracts/utils/src/buffer_writer.rs +117 -0
- package/contracts/utils/src/bytes_ext.rs +19 -0
- package/contracts/utils/src/errors.rs +30 -0
- package/contracts/utils/src/lib.rs +15 -0
- package/contracts/utils/src/option_ext.rs +38 -0
- package/contracts/utils/src/ownable.rs +88 -0
- package/contracts/utils/src/testing_utils.rs +100 -0
- package/contracts/utils/src/tests/buffer_reader.rs +1006 -0
- package/contracts/utils/src/tests/buffer_writer.rs +330 -0
- package/contracts/utils/src/tests/bytes_ext.rs +77 -0
- package/contracts/utils/src/tests/mod.rs +4 -0
- package/contracts/utils/src/tests/ownable.rs +149 -0
- package/contracts/utils/src/ttl.rs +164 -0
- package/contracts/workers/Cargo.toml +13 -0
- package/contracts/workers/executor/Cargo.toml +26 -0
- package/contracts/workers/executor/src/events.rs +22 -0
- package/contracts/workers/executor/src/executor.rs +347 -0
- package/contracts/workers/executor/src/interfaces/executor.rs +40 -0
- package/contracts/workers/executor/src/interfaces/mod.rs +5 -0
- package/contracts/workers/executor/src/interfaces/types.rs +51 -0
- package/contracts/workers/executor/src/lib.rs +10 -0
- package/contracts/workers/executor/src/storage.rs +23 -0
- package/contracts/workers/lib.rs +2 -0
- package/contracts/workers/worker-common/Cargo.toml +18 -0
- package/contracts/workers/worker-common/src/constants.rs +17 -0
- package/contracts/workers/worker-common/src/errors.rs +6 -0
- package/contracts/workers/worker-common/src/events.rs +34 -0
- package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +35 -0
- package/contracts/workers/worker-common/src/interfaces/mod.rs +7 -0
- package/contracts/workers/worker-common/src/interfaces/price_feed.rs +40 -0
- package/contracts/workers/worker-common/src/interfaces/worker.rs +60 -0
- package/contracts/workers/worker-common/src/lib.rs +19 -0
- package/contracts/workers/worker-common/src/storage.rs +32 -0
- package/contracts/workers/worker-common/src/worker_common.rs +166 -0
- package/package.json +25 -0
- package/rust-toolchain.toml +4 -0
- package/rustfmt.toml +17 -0
- package/sdk/.turbo/turbo-build.log +4 -0
- package/sdk/dist/generated/bml.d.ts +452 -0
- package/sdk/dist/generated/bml.js +72 -0
- package/sdk/dist/generated/counter.d.ts +824 -0
- package/sdk/dist/generated/counter.js +125 -0
- package/sdk/dist/generated/endpoint.d.ts +1676 -0
- package/sdk/dist/generated/endpoint.js +216 -0
- package/sdk/dist/generated/sml.d.ts +810 -0
- package/sdk/dist/generated/sml.js +132 -0
- package/sdk/dist/generated/uln302.d.ts +1227 -0
- package/sdk/dist/generated/uln302.js +185 -0
- package/sdk/dist/index.d.ts +5 -0
- package/sdk/dist/index.js +5 -0
- package/sdk/node_modules/.bin/tsc +21 -0
- package/sdk/node_modules/.bin/tsserver +21 -0
- package/sdk/node_modules/.bin/vitest +21 -0
- package/sdk/node_modules/.bin/zx +21 -0
- package/sdk/package.json +40 -0
- package/sdk/src/index.ts +5 -0
- package/sdk/test/index.test.ts +271 -0
- package/sdk/test/suites/constants.ts +13 -0
- package/sdk/test/suites/deploy.ts +277 -0
- package/sdk/test/suites/localnet.ts +42 -0
- package/sdk/test/suites/scan.ts +189 -0
- package/sdk/tsconfig.json +106 -0
- package/tools/ts-bindings-gen/Cargo.toml +14 -0
- package/tools/ts-bindings-gen/src/main.rs +147 -0
- package/turbo.json +12 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
use crate::{events::PacketSent, tests::endpoint_setup::setup, MessagingParams};
|
|
2
|
+
use soroban_sdk::{
|
|
3
|
+
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
4
|
+
token::TokenClient,
|
|
5
|
+
vec, Bytes, BytesN, IntoVal,
|
|
6
|
+
};
|
|
7
|
+
use utils::testing_utils::assert_event;
|
|
8
|
+
|
|
9
|
+
#[test]
|
|
10
|
+
fn test_send_with_native_fee_exact_payment() {
|
|
11
|
+
let context = setup();
|
|
12
|
+
let env = &context.env;
|
|
13
|
+
let endpoint_client = &context.endpoint_client;
|
|
14
|
+
|
|
15
|
+
let sender = soroban_sdk::Address::generate(env);
|
|
16
|
+
let refund_address = soroban_sdk::Address::generate(env);
|
|
17
|
+
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
18
|
+
let dst_eid = 2u32;
|
|
19
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
20
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
21
|
+
let options = Bytes::new(env);
|
|
22
|
+
|
|
23
|
+
// Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
|
|
24
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
25
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
26
|
+
|
|
27
|
+
// Setup mock send library with 100 native fee, 0 zro fee
|
|
28
|
+
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient.clone());
|
|
29
|
+
|
|
30
|
+
// Register and set as default send library
|
|
31
|
+
context.mock_owner_auth("register_library", (&send_lib,));
|
|
32
|
+
endpoint_client.register_library(&send_lib);
|
|
33
|
+
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
34
|
+
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
35
|
+
|
|
36
|
+
// Mint and transfer native tokens to endpoint for payment
|
|
37
|
+
context.mint_native(&sender, 100);
|
|
38
|
+
let token_client = TokenClient::new(env, &context.native_token_client.address);
|
|
39
|
+
env.mock_auths(&[MockAuth {
|
|
40
|
+
address: &sender,
|
|
41
|
+
invoke: &MockAuthInvoke {
|
|
42
|
+
contract: &context.native_token_client.address,
|
|
43
|
+
fn_name: "transfer",
|
|
44
|
+
args: (&sender, &endpoint_client.address, &100i128).into_val(env),
|
|
45
|
+
sub_invokes: &[],
|
|
46
|
+
},
|
|
47
|
+
}]);
|
|
48
|
+
token_client.transfer(&sender, &endpoint_client.address, &100);
|
|
49
|
+
|
|
50
|
+
let params = MessagingParams {
|
|
51
|
+
dst_eid,
|
|
52
|
+
receiver: receiver.clone(),
|
|
53
|
+
message: message.clone(),
|
|
54
|
+
options: options.clone(),
|
|
55
|
+
pay_in_zro: false,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// Mock auth for sender to call send
|
|
59
|
+
env.mock_auths(&[MockAuth {
|
|
60
|
+
address: &sender,
|
|
61
|
+
invoke: &MockAuthInvoke {
|
|
62
|
+
contract: &endpoint_client.address,
|
|
63
|
+
fn_name: "send",
|
|
64
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
65
|
+
sub_invokes: &[],
|
|
66
|
+
},
|
|
67
|
+
}]);
|
|
68
|
+
|
|
69
|
+
let receipt = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
70
|
+
|
|
71
|
+
// Verify receipt
|
|
72
|
+
assert_eq!(receipt.nonce, 1);
|
|
73
|
+
assert_eq!(receipt.fee.native_fee, 100);
|
|
74
|
+
assert_eq!(receipt.fee.zro_fee, 0);
|
|
75
|
+
|
|
76
|
+
// Verify PacketSent event was published
|
|
77
|
+
// MockSendLib::send returns encoded_packet = packet.message.clone()
|
|
78
|
+
assert_event(
|
|
79
|
+
env,
|
|
80
|
+
&endpoint_client.address,
|
|
81
|
+
PacketSent { encoded_packet: message, options, send_library: send_lib },
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Verify outbound nonce was incremented
|
|
85
|
+
let nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
86
|
+
assert_eq!(nonce, 1);
|
|
87
|
+
|
|
88
|
+
// Verify fee was paid to fee_recipient
|
|
89
|
+
assert_eq!(context.native_token_client.balance(&fee_recipient), 100);
|
|
90
|
+
|
|
91
|
+
// Verify no refund (exact payment)
|
|
92
|
+
assert_eq!(context.native_token_client.balance(&refund_address), 0);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
#[test]
|
|
96
|
+
fn test_send_with_native_fee_and_refund() {
|
|
97
|
+
let context = setup();
|
|
98
|
+
let env = &context.env;
|
|
99
|
+
let endpoint_client = &context.endpoint_client;
|
|
100
|
+
|
|
101
|
+
let sender = soroban_sdk::Address::generate(env);
|
|
102
|
+
let refund_address = soroban_sdk::Address::generate(env);
|
|
103
|
+
let dst_eid = 2u32;
|
|
104
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
105
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
106
|
+
let options = Bytes::new(env);
|
|
107
|
+
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
108
|
+
|
|
109
|
+
// Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
|
|
110
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
111
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
112
|
+
|
|
113
|
+
// Setup mock send library with 100 native fee
|
|
114
|
+
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient.clone());
|
|
115
|
+
|
|
116
|
+
// Register and set as default send library
|
|
117
|
+
context.mock_owner_auth("register_library", (&send_lib,));
|
|
118
|
+
endpoint_client.register_library(&send_lib);
|
|
119
|
+
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
120
|
+
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
121
|
+
|
|
122
|
+
// Mint and transfer MORE native tokens than needed (overpay)
|
|
123
|
+
context.mint_native(&sender, 250);
|
|
124
|
+
let token_client = TokenClient::new(env, &context.native_token_client.address);
|
|
125
|
+
env.mock_auths(&[MockAuth {
|
|
126
|
+
address: &sender,
|
|
127
|
+
invoke: &MockAuthInvoke {
|
|
128
|
+
contract: &context.native_token_client.address,
|
|
129
|
+
fn_name: "transfer",
|
|
130
|
+
args: (&sender, &endpoint_client.address, &250i128).into_val(env),
|
|
131
|
+
sub_invokes: &[],
|
|
132
|
+
},
|
|
133
|
+
}]);
|
|
134
|
+
token_client.transfer(&sender, &endpoint_client.address, &250);
|
|
135
|
+
|
|
136
|
+
let params = MessagingParams { dst_eid, receiver: receiver.clone(), message, options, pay_in_zro: false };
|
|
137
|
+
|
|
138
|
+
// Mock auth for sender to call send
|
|
139
|
+
env.mock_auths(&[MockAuth {
|
|
140
|
+
address: &sender,
|
|
141
|
+
invoke: &MockAuthInvoke {
|
|
142
|
+
contract: &endpoint_client.address,
|
|
143
|
+
fn_name: "send",
|
|
144
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
145
|
+
sub_invokes: &[],
|
|
146
|
+
},
|
|
147
|
+
}]);
|
|
148
|
+
|
|
149
|
+
let receipt = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
150
|
+
|
|
151
|
+
// Verify receipt
|
|
152
|
+
assert_eq!(receipt.nonce, 1);
|
|
153
|
+
assert_eq!(receipt.fee.native_fee, 100);
|
|
154
|
+
|
|
155
|
+
// Verify fee was paid to fee_recipient
|
|
156
|
+
assert_eq!(context.native_token_client.balance(&fee_recipient), 100);
|
|
157
|
+
|
|
158
|
+
// Verify refund (250 - 100 = 150)
|
|
159
|
+
assert_eq!(context.native_token_client.balance(&refund_address), 150);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
#[test]
|
|
163
|
+
fn test_send_increments_nonce_sequentially() {
|
|
164
|
+
let context = setup();
|
|
165
|
+
let env = &context.env;
|
|
166
|
+
let endpoint_client = &context.endpoint_client;
|
|
167
|
+
|
|
168
|
+
let sender = soroban_sdk::Address::generate(env);
|
|
169
|
+
let refund_address = soroban_sdk::Address::generate(env);
|
|
170
|
+
let dst_eid = 2u32;
|
|
171
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
172
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
173
|
+
let options = Bytes::new(env);
|
|
174
|
+
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
175
|
+
|
|
176
|
+
// Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
|
|
177
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
178
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
179
|
+
|
|
180
|
+
// Setup mock send library
|
|
181
|
+
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 50, 0, fee_recipient.clone());
|
|
182
|
+
context.mock_owner_auth("register_library", (&send_lib,));
|
|
183
|
+
endpoint_client.register_library(&send_lib);
|
|
184
|
+
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
185
|
+
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
186
|
+
|
|
187
|
+
// Mint tokens for multiple sends
|
|
188
|
+
context.mint_native(&sender, 200);
|
|
189
|
+
let token_client = TokenClient::new(env, &context.native_token_client.address);
|
|
190
|
+
|
|
191
|
+
let params = MessagingParams {
|
|
192
|
+
dst_eid,
|
|
193
|
+
receiver: receiver.clone(),
|
|
194
|
+
message: message.clone(),
|
|
195
|
+
options: options.clone(),
|
|
196
|
+
pay_in_zro: false,
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// Send first message
|
|
200
|
+
env.mock_auths(&[MockAuth {
|
|
201
|
+
address: &sender,
|
|
202
|
+
invoke: &MockAuthInvoke {
|
|
203
|
+
contract: &context.native_token_client.address,
|
|
204
|
+
fn_name: "transfer",
|
|
205
|
+
args: (&sender, &endpoint_client.address, &50i128).into_val(env),
|
|
206
|
+
sub_invokes: &[],
|
|
207
|
+
},
|
|
208
|
+
}]);
|
|
209
|
+
token_client.transfer(&sender, &endpoint_client.address, &50);
|
|
210
|
+
|
|
211
|
+
env.mock_auths(&[MockAuth {
|
|
212
|
+
address: &sender,
|
|
213
|
+
invoke: &MockAuthInvoke {
|
|
214
|
+
contract: &endpoint_client.address,
|
|
215
|
+
fn_name: "send",
|
|
216
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
217
|
+
sub_invokes: &[],
|
|
218
|
+
},
|
|
219
|
+
}]);
|
|
220
|
+
let receipt1 = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
221
|
+
|
|
222
|
+
// Send second message
|
|
223
|
+
env.mock_auths(&[MockAuth {
|
|
224
|
+
address: &sender,
|
|
225
|
+
invoke: &MockAuthInvoke {
|
|
226
|
+
contract: &context.native_token_client.address,
|
|
227
|
+
fn_name: "transfer",
|
|
228
|
+
args: (&sender, &endpoint_client.address, &50i128).into_val(env),
|
|
229
|
+
sub_invokes: &[],
|
|
230
|
+
},
|
|
231
|
+
}]);
|
|
232
|
+
token_client.transfer(&sender, &endpoint_client.address, &50);
|
|
233
|
+
|
|
234
|
+
env.mock_auths(&[MockAuth {
|
|
235
|
+
address: &sender,
|
|
236
|
+
invoke: &MockAuthInvoke {
|
|
237
|
+
contract: &endpoint_client.address,
|
|
238
|
+
fn_name: "send",
|
|
239
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
240
|
+
sub_invokes: &[],
|
|
241
|
+
},
|
|
242
|
+
}]);
|
|
243
|
+
let receipt2 = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
244
|
+
|
|
245
|
+
// Send third message
|
|
246
|
+
env.mock_auths(&[MockAuth {
|
|
247
|
+
address: &sender,
|
|
248
|
+
invoke: &MockAuthInvoke {
|
|
249
|
+
contract: &context.native_token_client.address,
|
|
250
|
+
fn_name: "transfer",
|
|
251
|
+
args: (&sender, &endpoint_client.address, &50i128).into_val(env),
|
|
252
|
+
sub_invokes: &[],
|
|
253
|
+
},
|
|
254
|
+
}]);
|
|
255
|
+
token_client.transfer(&sender, &endpoint_client.address, &50);
|
|
256
|
+
|
|
257
|
+
env.mock_auths(&[MockAuth {
|
|
258
|
+
address: &sender,
|
|
259
|
+
invoke: &MockAuthInvoke {
|
|
260
|
+
contract: &endpoint_client.address,
|
|
261
|
+
fn_name: "send",
|
|
262
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
263
|
+
sub_invokes: &[],
|
|
264
|
+
},
|
|
265
|
+
}]);
|
|
266
|
+
let receipt3 = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
267
|
+
|
|
268
|
+
// Verify nonces increment sequentially
|
|
269
|
+
assert_eq!(receipt1.nonce, 1);
|
|
270
|
+
assert_eq!(receipt2.nonce, 2);
|
|
271
|
+
assert_eq!(receipt3.nonce, 3);
|
|
272
|
+
|
|
273
|
+
// Verify final outbound nonce
|
|
274
|
+
let final_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
275
|
+
assert_eq!(final_nonce, 3);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
#[test]
|
|
279
|
+
fn test_send_with_custom_send_library() {
|
|
280
|
+
let context = setup();
|
|
281
|
+
let env = &context.env;
|
|
282
|
+
let endpoint_client = &context.endpoint_client;
|
|
283
|
+
|
|
284
|
+
let sender = soroban_sdk::Address::generate(env);
|
|
285
|
+
let refund_address = soroban_sdk::Address::generate(env);
|
|
286
|
+
let dst_eid = 2u32;
|
|
287
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
288
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
289
|
+
let options = Bytes::new(env);
|
|
290
|
+
let default_fee_recipient = soroban_sdk::Address::generate(env);
|
|
291
|
+
let custom_fee_recipient = soroban_sdk::Address::generate(env);
|
|
292
|
+
|
|
293
|
+
// Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
|
|
294
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
295
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
296
|
+
|
|
297
|
+
// Setup default send library with 100 fee
|
|
298
|
+
let default_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, default_fee_recipient.clone());
|
|
299
|
+
context.mock_owner_auth("register_library", (&default_lib,));
|
|
300
|
+
endpoint_client.register_library(&default_lib);
|
|
301
|
+
context.mock_owner_auth("set_default_send_library", (&dst_eid, &default_lib));
|
|
302
|
+
endpoint_client.set_default_send_library(&dst_eid, &default_lib);
|
|
303
|
+
|
|
304
|
+
// Setup custom send library with different fee (200)
|
|
305
|
+
let custom_lib = context.setup_mock_send_lib(vec![env, dst_eid], 200, 0, custom_fee_recipient.clone());
|
|
306
|
+
context.mock_owner_auth("register_library", (&custom_lib,));
|
|
307
|
+
endpoint_client.register_library(&custom_lib);
|
|
308
|
+
|
|
309
|
+
// Set custom library for this sender
|
|
310
|
+
env.mock_auths(&[MockAuth {
|
|
311
|
+
address: &sender,
|
|
312
|
+
invoke: &MockAuthInvoke {
|
|
313
|
+
contract: &endpoint_client.address,
|
|
314
|
+
fn_name: "set_send_library",
|
|
315
|
+
args: (&sender, &sender, &dst_eid, &custom_lib).into_val(env),
|
|
316
|
+
sub_invokes: &[],
|
|
317
|
+
},
|
|
318
|
+
}]);
|
|
319
|
+
endpoint_client.set_send_library(&sender, &sender, &dst_eid, &Some(custom_lib.clone()));
|
|
320
|
+
|
|
321
|
+
// Mint and transfer tokens for custom library fee
|
|
322
|
+
context.mint_native(&sender, 200);
|
|
323
|
+
let token_client = TokenClient::new(env, &context.native_token_client.address);
|
|
324
|
+
env.mock_auths(&[MockAuth {
|
|
325
|
+
address: &sender,
|
|
326
|
+
invoke: &MockAuthInvoke {
|
|
327
|
+
contract: &context.native_token_client.address,
|
|
328
|
+
fn_name: "transfer",
|
|
329
|
+
args: (&sender, &endpoint_client.address, &200i128).into_val(env),
|
|
330
|
+
sub_invokes: &[],
|
|
331
|
+
},
|
|
332
|
+
}]);
|
|
333
|
+
token_client.transfer(&sender, &endpoint_client.address, &200);
|
|
334
|
+
|
|
335
|
+
let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
|
|
336
|
+
|
|
337
|
+
// Mock auth for sender to call send
|
|
338
|
+
env.mock_auths(&[MockAuth {
|
|
339
|
+
address: &sender,
|
|
340
|
+
invoke: &MockAuthInvoke {
|
|
341
|
+
contract: &endpoint_client.address,
|
|
342
|
+
fn_name: "send",
|
|
343
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
344
|
+
sub_invokes: &[],
|
|
345
|
+
},
|
|
346
|
+
}]);
|
|
347
|
+
|
|
348
|
+
let receipt = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
349
|
+
|
|
350
|
+
// Verify receipt uses custom library fee (200, not 100)
|
|
351
|
+
assert_eq!(receipt.fee.native_fee, 200);
|
|
352
|
+
|
|
353
|
+
// Verify fee was paid to custom_fee_recipient (not default_fee_recipient)
|
|
354
|
+
assert_eq!(context.native_token_client.balance(&custom_fee_recipient), 200);
|
|
355
|
+
assert_eq!(context.native_token_client.balance(&default_fee_recipient), 0);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
#[test]
|
|
359
|
+
fn test_send_to_different_receivers() {
|
|
360
|
+
let context = setup();
|
|
361
|
+
let env = &context.env;
|
|
362
|
+
let endpoint_client = &context.endpoint_client;
|
|
363
|
+
|
|
364
|
+
let sender = soroban_sdk::Address::generate(env);
|
|
365
|
+
let refund_address = soroban_sdk::Address::generate(env);
|
|
366
|
+
let dst_eid = 2u32;
|
|
367
|
+
let receiver1 = BytesN::from_array(env, &[1u8; 32]);
|
|
368
|
+
let receiver2 = BytesN::from_array(env, &[2u8; 32]);
|
|
369
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
370
|
+
let options = Bytes::new(env);
|
|
371
|
+
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
372
|
+
|
|
373
|
+
// Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
|
|
374
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
375
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
376
|
+
|
|
377
|
+
// Setup mock send library
|
|
378
|
+
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 50, 0, fee_recipient);
|
|
379
|
+
context.mock_owner_auth("register_library", (&send_lib,));
|
|
380
|
+
endpoint_client.register_library(&send_lib);
|
|
381
|
+
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
382
|
+
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
383
|
+
|
|
384
|
+
// Mint tokens
|
|
385
|
+
context.mint_native(&sender, 100);
|
|
386
|
+
let token_client = TokenClient::new(env, &context.native_token_client.address);
|
|
387
|
+
|
|
388
|
+
// Send to receiver1
|
|
389
|
+
env.mock_auths(&[MockAuth {
|
|
390
|
+
address: &sender,
|
|
391
|
+
invoke: &MockAuthInvoke {
|
|
392
|
+
contract: &context.native_token_client.address,
|
|
393
|
+
fn_name: "transfer",
|
|
394
|
+
args: (&sender, &endpoint_client.address, &50i128).into_val(env),
|
|
395
|
+
sub_invokes: &[],
|
|
396
|
+
},
|
|
397
|
+
}]);
|
|
398
|
+
token_client.transfer(&sender, &endpoint_client.address, &50);
|
|
399
|
+
|
|
400
|
+
let params1 = MessagingParams {
|
|
401
|
+
dst_eid,
|
|
402
|
+
receiver: receiver1.clone(),
|
|
403
|
+
message: message.clone(),
|
|
404
|
+
options: options.clone(),
|
|
405
|
+
pay_in_zro: false,
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
env.mock_auths(&[MockAuth {
|
|
409
|
+
address: &sender,
|
|
410
|
+
invoke: &MockAuthInvoke {
|
|
411
|
+
contract: &endpoint_client.address,
|
|
412
|
+
fn_name: "send",
|
|
413
|
+
args: (&sender, ¶ms1, &refund_address).into_val(env),
|
|
414
|
+
sub_invokes: &[],
|
|
415
|
+
},
|
|
416
|
+
}]);
|
|
417
|
+
let receipt1 = endpoint_client.send(&sender, ¶ms1, &refund_address);
|
|
418
|
+
|
|
419
|
+
// Send to receiver2
|
|
420
|
+
env.mock_auths(&[MockAuth {
|
|
421
|
+
address: &sender,
|
|
422
|
+
invoke: &MockAuthInvoke {
|
|
423
|
+
contract: &context.native_token_client.address,
|
|
424
|
+
fn_name: "transfer",
|
|
425
|
+
args: (&sender, &endpoint_client.address, &50i128).into_val(env),
|
|
426
|
+
sub_invokes: &[],
|
|
427
|
+
},
|
|
428
|
+
}]);
|
|
429
|
+
token_client.transfer(&sender, &endpoint_client.address, &50);
|
|
430
|
+
|
|
431
|
+
let params2 = MessagingParams { dst_eid, receiver: receiver2.clone(), message, options, pay_in_zro: false };
|
|
432
|
+
|
|
433
|
+
env.mock_auths(&[MockAuth {
|
|
434
|
+
address: &sender,
|
|
435
|
+
invoke: &MockAuthInvoke {
|
|
436
|
+
contract: &endpoint_client.address,
|
|
437
|
+
fn_name: "send",
|
|
438
|
+
args: (&sender, ¶ms2, &refund_address).into_val(env),
|
|
439
|
+
sub_invokes: &[],
|
|
440
|
+
},
|
|
441
|
+
}]);
|
|
442
|
+
let receipt2 = endpoint_client.send(&sender, ¶ms2, &refund_address);
|
|
443
|
+
|
|
444
|
+
// Verify each receiver has its own nonce tracking
|
|
445
|
+
assert_eq!(receipt1.nonce, 1);
|
|
446
|
+
assert_eq!(receipt2.nonce, 1); // First message to receiver2
|
|
447
|
+
|
|
448
|
+
// Verify outbound nonces are tracked separately per receiver
|
|
449
|
+
let nonce1 = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver1);
|
|
450
|
+
let nonce2 = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver2);
|
|
451
|
+
assert_eq!(nonce1, 1);
|
|
452
|
+
assert_eq!(nonce2, 1);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
#[test]
|
|
456
|
+
fn test_send_returns_correct_guid() {
|
|
457
|
+
let context = setup();
|
|
458
|
+
let env = &context.env;
|
|
459
|
+
let endpoint_client = &context.endpoint_client;
|
|
460
|
+
|
|
461
|
+
let sender = soroban_sdk::Address::generate(env);
|
|
462
|
+
let refund_address = soroban_sdk::Address::generate(env);
|
|
463
|
+
let dst_eid = 2u32;
|
|
464
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
465
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
466
|
+
let options = Bytes::new(env);
|
|
467
|
+
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
468
|
+
|
|
469
|
+
// Set ZRO token (required even when not paying in ZRO due to line 79 in endpoint_v2.rs)
|
|
470
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
471
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
472
|
+
|
|
473
|
+
// Setup mock send library
|
|
474
|
+
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient);
|
|
475
|
+
context.mock_owner_auth("register_library", (&send_lib,));
|
|
476
|
+
endpoint_client.register_library(&send_lib);
|
|
477
|
+
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
478
|
+
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
479
|
+
|
|
480
|
+
// Get the expected GUID before sending
|
|
481
|
+
let next_guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
|
|
482
|
+
|
|
483
|
+
// Mint and transfer tokens
|
|
484
|
+
context.mint_native(&sender, 100);
|
|
485
|
+
let token_client = TokenClient::new(env, &context.native_token_client.address);
|
|
486
|
+
env.mock_auths(&[MockAuth {
|
|
487
|
+
address: &sender,
|
|
488
|
+
invoke: &MockAuthInvoke {
|
|
489
|
+
contract: &context.native_token_client.address,
|
|
490
|
+
fn_name: "transfer",
|
|
491
|
+
args: (&sender, &endpoint_client.address, &100i128).into_val(env),
|
|
492
|
+
sub_invokes: &[],
|
|
493
|
+
},
|
|
494
|
+
}]);
|
|
495
|
+
token_client.transfer(&sender, &endpoint_client.address, &100);
|
|
496
|
+
|
|
497
|
+
let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
|
|
498
|
+
|
|
499
|
+
env.mock_auths(&[MockAuth {
|
|
500
|
+
address: &sender,
|
|
501
|
+
invoke: &MockAuthInvoke {
|
|
502
|
+
contract: &endpoint_client.address,
|
|
503
|
+
fn_name: "send",
|
|
504
|
+
args: (&sender, ¶ms, &refund_address).into_val(env),
|
|
505
|
+
sub_invokes: &[],
|
|
506
|
+
},
|
|
507
|
+
}]);
|
|
508
|
+
|
|
509
|
+
let receipt = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
510
|
+
|
|
511
|
+
// Verify the GUID in receipt matches the expected GUID
|
|
512
|
+
assert_eq!(receipt.guid, next_guid);
|
|
513
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
use crate::{events::DelegateSet, storage, tests::endpoint_setup::setup};
|
|
2
|
+
use soroban_sdk::{
|
|
3
|
+
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
4
|
+
Address, IntoVal,
|
|
5
|
+
};
|
|
6
|
+
use utils::testing_utils::assert_event;
|
|
7
|
+
|
|
8
|
+
#[test]
|
|
9
|
+
fn test_set_delegate() {
|
|
10
|
+
let context = setup();
|
|
11
|
+
let env = &context.env;
|
|
12
|
+
let endpoint_client = &context.endpoint_client;
|
|
13
|
+
|
|
14
|
+
let oapp = Address::generate(env);
|
|
15
|
+
let delegate = Address::generate(env);
|
|
16
|
+
|
|
17
|
+
// Verify initial state - delegate should not be set
|
|
18
|
+
let initial_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
|
|
19
|
+
assert_eq!(initial_delegate, None, "Initial delegate should be None");
|
|
20
|
+
|
|
21
|
+
let delegate_option = Some(delegate.clone());
|
|
22
|
+
env.mock_auths(&[MockAuth {
|
|
23
|
+
address: &oapp,
|
|
24
|
+
invoke: &MockAuthInvoke {
|
|
25
|
+
contract: &endpoint_client.address,
|
|
26
|
+
fn_name: "set_delegate",
|
|
27
|
+
args: (&oapp, &delegate_option).into_val(env),
|
|
28
|
+
sub_invokes: &[],
|
|
29
|
+
},
|
|
30
|
+
}]);
|
|
31
|
+
endpoint_client.set_delegate(&oapp, &delegate_option);
|
|
32
|
+
|
|
33
|
+
// Assert event was published
|
|
34
|
+
assert_event(env, &endpoint_client.address, DelegateSet { oapp: oapp.clone(), delegate: Some(delegate.clone()) });
|
|
35
|
+
|
|
36
|
+
// Verify delegate via public interface
|
|
37
|
+
let actual_delegate = endpoint_client.delegate(&oapp);
|
|
38
|
+
assert_eq!(actual_delegate, Some(delegate.clone()), "Delegate should be set");
|
|
39
|
+
|
|
40
|
+
// Assert storage change directly
|
|
41
|
+
let stored_delegate = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::delegate(env, &oapp));
|
|
42
|
+
assert_eq!(stored_delegate, Some(delegate.clone()), "Storage should contain the delegate address");
|
|
43
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
use crate::{events::ZROSet, storage, tests::endpoint_setup::setup};
|
|
2
|
+
use utils::testing_utils::assert_event;
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
fn test_set_zro() {
|
|
6
|
+
let context = setup();
|
|
7
|
+
let env = &context.env;
|
|
8
|
+
let endpoint_client = &context.endpoint_client;
|
|
9
|
+
|
|
10
|
+
// Verify initial state - ZRO should not be set
|
|
11
|
+
let initial_zro = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::zro(env));
|
|
12
|
+
assert_eq!(initial_zro, None, "Initial ZRO should be None");
|
|
13
|
+
|
|
14
|
+
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
15
|
+
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
16
|
+
|
|
17
|
+
// Assert event was published
|
|
18
|
+
assert_event(env, &endpoint_client.address, ZROSet { zro: context.zro_token_client.address.clone() });
|
|
19
|
+
|
|
20
|
+
// Verify ZRO token is set via public interface
|
|
21
|
+
let zro_token = endpoint_client.zro();
|
|
22
|
+
assert_eq!(zro_token, Some(context.zro_token_client.address.clone()));
|
|
23
|
+
|
|
24
|
+
// Assert storage change directly
|
|
25
|
+
let stored_zro = env.as_contract(&endpoint_client.address, || storage::EndpointStorage::zro(env));
|
|
26
|
+
assert_eq!(stored_zro, Some(context.zro_token_client.address.clone()), "Storage should contain the ZRO address");
|
|
27
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
use crate::tests::endpoint_setup::setup;
|
|
2
|
+
use soroban_sdk::testutils::Address as _;
|
|
3
|
+
use utils::ownable::DefaultOwnableStorage;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_transfer_ownership() {
|
|
7
|
+
let context = setup();
|
|
8
|
+
let env = &context.env;
|
|
9
|
+
let endpoint_client = &context.endpoint_client;
|
|
10
|
+
let new_owner = soroban_sdk::Address::generate(env);
|
|
11
|
+
|
|
12
|
+
// Verify initial owner via public interface
|
|
13
|
+
let initial_owner = endpoint_client.owner();
|
|
14
|
+
assert_eq!(initial_owner, Some(context.owner.clone()));
|
|
15
|
+
|
|
16
|
+
// Verify initial owner in storage directly
|
|
17
|
+
let initial_owner = env.as_contract(&endpoint_client.address, || DefaultOwnableStorage::owner(env));
|
|
18
|
+
assert_eq!(initial_owner, Some(context.owner.clone()), "Initial owner should be in storage");
|
|
19
|
+
|
|
20
|
+
context.mock_owner_auth("transfer_ownership", (&new_owner,));
|
|
21
|
+
endpoint_client.transfer_ownership(&new_owner);
|
|
22
|
+
|
|
23
|
+
// Verify new owner via public interface
|
|
24
|
+
let owner = endpoint_client.owner();
|
|
25
|
+
assert_eq!(owner, Some(new_owner.clone()));
|
|
26
|
+
|
|
27
|
+
// Assert storage change directly
|
|
28
|
+
let stored_owner = env.as_contract(&endpoint_client.address, || DefaultOwnableStorage::owner(env));
|
|
29
|
+
assert_eq!(stored_owner, Some(new_owner), "Storage should contain the new owner");
|
|
30
|
+
}
|