@layerzerolabs/protocol-stellar-v2 0.2.8 → 0.2.10
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 +443 -302
- package/.turbo/turbo-lint.log +118 -96
- package/.turbo/turbo-test.log +853 -731
- package/Cargo.lock +120 -37
- package/Cargo.toml +8 -5
- package/contracts/common-macros/src/contract_impl.rs +44 -0
- package/contracts/common-macros/src/lib.rs +86 -40
- package/contracts/common-macros/src/ownable.rs +24 -32
- package/contracts/common-macros/src/storage.rs +95 -120
- package/contracts/common-macros/src/tests/contract_impl.rs +289 -0
- package/contracts/common-macros/src/tests/mod.rs +9 -0
- package/contracts/common-macros/src/tests/ownable.rs +151 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +85 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +30 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap +9 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +1072 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +45 -0
- package/contracts/common-macros/src/tests/storage.rs +485 -0
- package/contracts/common-macros/src/tests/test_helpers.rs +93 -0
- package/contracts/common-macros/src/tests/ttl_configurable.rs +34 -0
- package/contracts/common-macros/src/ttl_configurable.rs +31 -14
- package/contracts/common-macros/src/utils.rs +27 -0
- package/contracts/endpoint-v2/ARCHITECTURE.md +4 -4
- package/contracts/endpoint-v2/src/endpoint_v2.rs +18 -15
- package/contracts/endpoint-v2/src/interfaces/message_lib.rs +2 -3
- package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +5 -3
- package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +2 -2
- package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
- package/contracts/endpoint-v2/src/interfaces/send_lib.rs +4 -4
- package/contracts/endpoint-v2/src/lib.rs +6 -5
- package/contracts/endpoint-v2/src/message_lib_manager.rs +14 -6
- package/contracts/endpoint-v2/src/messaging_channel.rs +6 -2
- package/contracts/endpoint-v2/src/messaging_composer.rs +6 -2
- package/contracts/endpoint-v2/src/storage.rs +10 -7
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +16 -16
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +46 -46
- package/contracts/endpoint-v2/src/tests/mock.rs +2 -2
- package/contracts/endpoint-v2/src/util.rs +8 -2
- package/contracts/message-libs/block-message-lib/Cargo.toml +1 -0
- package/contracts/message-libs/block-message-lib/src/lib.rs +5 -5
- package/contracts/message-libs/message-lib-common/src/errors.rs +8 -8
- package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +0 -1
- package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +3 -3
- package/contracts/message-libs/message-lib-common/src/lib.rs +0 -2
- package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +4 -6
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +2 -2
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +11 -11
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +10 -16
- package/contracts/message-libs/simple-message-lib/src/errors.rs +0 -4
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +49 -34
- package/contracts/message-libs/simple-message-lib/src/storage.rs +3 -7
- package/contracts/message-libs/simple-message-lib/src/test.rs +3 -3
- package/contracts/message-libs/treasury/src/storage.rs +1 -2
- package/contracts/message-libs/treasury/src/tests/setup.rs +3 -2
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +0 -13
- package/contracts/message-libs/treasury/src/treasury.rs +18 -21
- package/contracts/message-libs/uln-302/Cargo.toml +1 -0
- package/contracts/message-libs/uln-302/src/interfaces/mod.rs +4 -4
- package/contracts/message-libs/uln-302/src/interfaces/{receive.rs → receive_uln.rs} +3 -3
- package/contracts/message-libs/uln-302/src/interfaces/{send.rs → send_uln.rs} +8 -80
- package/contracts/message-libs/uln-302/src/lib.rs +5 -4
- package/contracts/message-libs/uln-302/src/{receive.rs → receive_uln.rs} +20 -12
- package/contracts/message-libs/uln-302/src/{send.rs → send_uln.rs} +19 -13
- package/contracts/message-libs/uln-302/src/storage.rs +1 -2
- package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +3 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +30 -30
- package/contracts/message-libs/uln-302/src/tests/setup.rs +12 -11
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +1 -1
- package/contracts/message-libs/uln-302/src/{config_validation.rs → types.rs} +79 -11
- package/contracts/message-libs/uln-302/src/uln302.rs +15 -10
- package/contracts/oapp-macros/Cargo.toml +2 -8
- package/contracts/oapp-macros/src/lib.rs +57 -311
- package/contracts/oapp-macros/src/oapp_core.rs +23 -32
- package/contracts/oapp-macros/src/oapp_full.rs +8 -2
- package/contracts/oapp-macros/src/oapp_options_type3.rs +21 -36
- package/contracts/oapp-macros/src/oapp_receiver.rs +38 -57
- package/contracts/oapp-macros/src/oapp_sender.rs +12 -14
- package/contracts/oapp-macros/src/util.rs +14 -10
- package/contracts/oapps/counter/Cargo.toml +2 -1
- package/contracts/oapps/counter/integration_tests/utils.rs +4 -4
- package/contracts/oapps/counter/src/codec.rs +8 -9
- package/contracts/oapps/counter/src/counter.rs +156 -147
- package/contracts/oapps/counter/src/storage.rs +1 -2
- package/contracts/oapps/counter/src/tests/test_codec.rs +5 -5
- package/contracts/oapps/counter/src/tests/test_counter.rs +11 -13
- package/contracts/oapps/oapp/Cargo.toml +1 -0
- package/contracts/oapps/oapp/src/errors.rs +1 -1
- package/contracts/oapps/oapp/src/lib.rs +3 -0
- package/contracts/oapps/oapp/src/macro_tests/mod.rs +1 -0
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +312 -0
- package/contracts/oapps/oapp/src/oapp_core.rs +52 -53
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +18 -28
- package/contracts/oapps/oapp/src/oapp_receiver.rs +82 -31
- package/contracts/oapps/oapp/src/oapp_sender.rs +55 -13
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +16 -3
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +33 -8
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +6 -9
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +28 -15
- package/contracts/oapps/oft/Cargo.toml +27 -0
- package/contracts/oapps/oft/integration-tests/mod.rs +3 -0
- package/contracts/oapps/oft/integration-tests/setup.rs +320 -0
- package/contracts/oapps/oft/integration-tests/test_with_sml.rs +155 -0
- package/contracts/oapps/oft/integration-tests/utils.rs +201 -0
- package/contracts/oapps/oft/src/codec/mod.rs +2 -0
- package/contracts/oapps/oft/src/codec/oft_compose_msg_codec.rs +55 -0
- package/contracts/oapps/oft/src/codec/oft_msg_codec.rs +62 -0
- package/contracts/oapps/oft/src/constants.rs +5 -0
- package/contracts/oapps/oft/src/errors.rs +8 -0
- package/contracts/oapps/oft/src/events.rs +19 -0
- package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +23 -0
- package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
- package/contracts/oapps/oft/src/lib.rs +22 -0
- package/contracts/oapps/oft/src/macro_tests/mod.rs +2 -0
- package/contracts/oapps/oft/src/macro_tests/test_all_default.rs +41 -0
- package/contracts/oapps/oft/src/macro_tests/test_override.rs +83 -0
- package/contracts/oapps/oft/src/oft.rs +320 -0
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +50 -0
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +50 -0
- package/contracts/oapps/oft/src/oft_types/mod.rs +10 -0
- package/contracts/oapps/oft/src/storage.rs +11 -0
- package/contracts/oapps/oft/src/tests/mod.rs +13 -0
- package/contracts/oapps/oft/src/tests/test_decimals.rs +89 -0
- package/contracts/oapps/oft/src/tests/test_lz_receive.rs +282 -0
- package/contracts/oapps/oft/src/tests/test_oft_compose_msg_codec.rs +68 -0
- package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +136 -0
- package/contracts/oapps/oft/src/tests/test_oft_version.rs +13 -0
- package/contracts/oapps/oft/src/tests/test_quote_oft.rs +159 -0
- package/contracts/oapps/oft/src/tests/test_quote_send.rs +195 -0
- package/contracts/oapps/oft/src/tests/test_resolve_address.rs +37 -0
- package/contracts/oapps/oft/src/tests/test_send.rs +915 -0
- package/contracts/oapps/oft/src/tests/test_token.rs +47 -0
- package/contracts/oapps/oft/src/tests/test_utils.rs +789 -0
- package/contracts/oapps/oft/src/types.rs +38 -0
- package/contracts/oapps/oft/src/utils.rs +67 -0
- package/contracts/oapps/oft-mint-burn/Cargo.toml +26 -0
- package/contracts/oapps/oft-mint-burn/src/lib.rs +3 -0
- package/contracts/oapps/oft-mint-burn/src/oft.rs +28 -0
- package/contracts/oapps/oft-mint-burn/src/tests/mod.rs +1 -0
- package/contracts/utils/src/buffer_reader.rs +8 -9
- package/contracts/utils/src/buffer_writer.rs +11 -5
- package/contracts/utils/src/errors.rs +5 -5
- package/contracts/utils/src/ownable.rs +14 -6
- package/contracts/utils/src/testing_utils.rs +11 -1
- package/contracts/utils/src/tests/buffer_reader.rs +491 -730
- package/contracts/utils/src/tests/buffer_writer.rs +336 -148
- package/contracts/utils/src/tests/bytes_ext.rs +125 -40
- package/contracts/utils/src/tests/mod.rs +3 -0
- package/contracts/utils/src/tests/ownable.rs +379 -27
- package/contracts/utils/src/tests/test_helper.rs +47 -0
- package/contracts/utils/src/tests/testing_utils.rs +555 -0
- package/contracts/utils/src/tests/ttl.rs +421 -0
- package/contracts/utils/src/ttl.rs +29 -89
- package/contracts/workers/dvn/Cargo.toml +31 -0
- package/contracts/workers/dvn/src/auth.rs +66 -0
- package/contracts/workers/dvn/src/dvn.rs +143 -0
- package/contracts/workers/dvn/src/errors.rs +21 -0
- package/contracts/workers/dvn/src/events.rs +19 -0
- package/contracts/workers/dvn/src/interfaces/dvn.rs +12 -0
- package/contracts/workers/dvn/src/interfaces/mod.rs +5 -0
- package/contracts/workers/dvn/src/interfaces/multisig.rs +15 -0
- package/contracts/workers/dvn/src/lib.rs +24 -0
- package/contracts/workers/dvn/src/multisig.rs +127 -0
- package/contracts/workers/dvn/src/storage.rs +35 -0
- package/contracts/workers/dvn/src/tests/auth.rs +237 -0
- package/contracts/workers/dvn/src/tests/dvn.rs +349 -0
- package/contracts/workers/dvn/src/tests/key_pair.rs +66 -0
- package/contracts/workers/dvn/src/tests/mod.rs +5 -0
- package/contracts/workers/dvn/src/tests/multisig/mod.rs +3 -0
- package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +133 -0
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +108 -0
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +109 -0
- package/contracts/workers/dvn/src/tests/setup.rs +109 -0
- package/contracts/workers/dvn/src/types.rs +26 -0
- package/contracts/workers/dvn-fee-lib/Cargo.toml +24 -0
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +113 -0
- package/contracts/workers/dvn-fee-lib/src/errors.rs +8 -0
- package/contracts/workers/dvn-fee-lib/src/lib.rs +17 -0
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +282 -0
- package/contracts/workers/dvn-fee-lib/src/tests/mod.rs +1 -0
- package/contracts/workers/executor/Cargo.toml +10 -7
- package/contracts/workers/executor/src/errors.rs +8 -0
- package/contracts/workers/executor/src/events.rs +4 -7
- package/contracts/workers/executor/src/interfaces/executor.rs +72 -22
- package/contracts/workers/executor/src/interfaces/mod.rs +0 -2
- package/contracts/workers/executor/src/lib.rs +16 -7
- package/contracts/workers/executor/src/lz_executor.rs +308 -0
- package/contracts/workers/executor/src/storage.rs +24 -16
- package/contracts/workers/executor-fee-lib/Cargo.toml +22 -0
- package/contracts/workers/executor-fee-lib/src/errors.rs +15 -0
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +215 -0
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +203 -0
- package/contracts/workers/executor-fee-lib/src/lib.rs +7 -0
- package/contracts/workers/executor-helper/Cargo.toml +29 -0
- package/contracts/workers/executor-helper/src/executor_helper.rs +161 -0
- package/contracts/workers/executor-helper/src/lib.rs +11 -0
- package/contracts/workers/{worker-common → worker}/Cargo.toml +1 -4
- package/contracts/workers/worker/src/errors.rs +24 -0
- package/contracts/workers/worker/src/events.rs +62 -0
- package/contracts/workers/worker/src/interfaces/dvn_fee_lib.rs +75 -0
- package/contracts/workers/worker/src/interfaces/executor_fee_lib.rs +84 -0
- package/contracts/workers/{worker-common → worker}/src/interfaces/mod.rs +2 -2
- package/contracts/workers/worker/src/interfaces/price_feed.rs +85 -0
- package/contracts/workers/worker/src/lib.rs +14 -0
- package/contracts/workers/worker/src/storage.rs +63 -0
- package/contracts/workers/worker/src/worker.rs +459 -0
- package/package.json +3 -3
- package/sdk/dist/generated/bml.d.ts +88 -17
- package/sdk/dist/generated/bml.js +62 -16
- package/sdk/dist/generated/counter.d.ts +281 -102
- package/sdk/dist/generated/counter.js +93 -41
- package/sdk/dist/generated/endpoint.d.ts +128 -105
- package/sdk/dist/generated/endpoint.js +47 -45
- package/sdk/dist/generated/sml.d.ts +212 -69
- package/sdk/dist/generated/sml.js +103 -53
- package/sdk/dist/generated/uln302.d.ts +270 -173
- package/sdk/dist/generated/uln302.js +112 -64
- package/sdk/package.json +11 -11
- package/sdk/test/index.test.ts +147 -42
- package/sdk/test/suites/constants.ts +7 -3
- package/sdk/test/suites/deploy.ts +65 -42
- package/sdk/test/suites/localnet.ts +2 -2
- package/sdk/test/suites/scan.ts +28 -25
- package/sdk/test/utils.ts +199 -0
- package/sdk/tsconfig.json +93 -95
- package/tools/ts-bindings-gen/src/main.rs +2 -0
- package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +0 -310
- package/contracts/common-macros/src/tests.rs +0 -287
- package/contracts/oapp-macros/tests/test_macros.rs +0 -522
- package/contracts/workers/executor/src/executor.rs +0 -347
- package/contracts/workers/executor/src/interfaces/types.rs +0 -51
- package/contracts/workers/worker-common/src/constants.rs +0 -17
- package/contracts/workers/worker-common/src/errors.rs +0 -6
- package/contracts/workers/worker-common/src/events.rs +0 -34
- package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +0 -35
- package/contracts/workers/worker-common/src/interfaces/price_feed.rs +0 -40
- package/contracts/workers/worker-common/src/interfaces/worker.rs +0 -60
- package/contracts/workers/worker-common/src/lib.rs +0 -19
- package/contracts/workers/worker-common/src/storage.rs +0 -32
- package/contracts/workers/worker-common/src/worker_common.rs +0 -166
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
use crate::codec::oft_msg_codec::OFTMessage;
|
|
2
|
+
use crate::utils::address_to_bytes32;
|
|
3
|
+
use soroban_sdk::{testutils::Address as _, Address, Bytes, BytesN, Env};
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_encode_and_decode_without_compose() {
|
|
7
|
+
let env = Env::default();
|
|
8
|
+
let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
|
|
9
|
+
let amount_sd_val = 1000u64;
|
|
10
|
+
|
|
11
|
+
let msg =
|
|
12
|
+
OFTMessage { send_to: send_to_addr.clone(), amount_sd: amount_sd_val, compose_from: None, compose_msg: None };
|
|
13
|
+
let (encoded, has_compose) = msg.encode(&env);
|
|
14
|
+
|
|
15
|
+
assert_eq!(has_compose, false);
|
|
16
|
+
|
|
17
|
+
// Test decode function
|
|
18
|
+
let decoded = OFTMessage::decode(&encoded);
|
|
19
|
+
assert_eq!(decoded.send_to, send_to_addr);
|
|
20
|
+
assert_eq!(decoded.amount_sd, amount_sd_val);
|
|
21
|
+
assert_eq!(decoded.compose_from.is_none(), true);
|
|
22
|
+
assert_eq!(decoded.compose_msg.is_none(), true);
|
|
23
|
+
assert_eq!(decoded.is_composed(), false);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
#[test]
|
|
27
|
+
fn test_encode_and_decode_with_compose() {
|
|
28
|
+
let env = Env::default();
|
|
29
|
+
let sender = Address::generate(&env);
|
|
30
|
+
let send_to_addr = BytesN::from_array(&env, &[2u8; 32]);
|
|
31
|
+
let amount_sd_val = 5000u64;
|
|
32
|
+
let compose_msg_val = Bytes::from_array(&env, &[1u8, 2u8, 3u8, 4u8]);
|
|
33
|
+
|
|
34
|
+
let msg = OFTMessage {
|
|
35
|
+
send_to: send_to_addr.clone(),
|
|
36
|
+
amount_sd: amount_sd_val,
|
|
37
|
+
compose_from: Some(address_to_bytes32(&sender)),
|
|
38
|
+
compose_msg: Some(compose_msg_val),
|
|
39
|
+
};
|
|
40
|
+
let (encoded, has_compose) = msg.encode(&env);
|
|
41
|
+
|
|
42
|
+
assert_eq!(has_compose, true);
|
|
43
|
+
|
|
44
|
+
// Test decode function
|
|
45
|
+
let decoded = OFTMessage::decode(&encoded);
|
|
46
|
+
assert_eq!(decoded.send_to, send_to_addr);
|
|
47
|
+
assert_eq!(decoded.amount_sd, amount_sd_val);
|
|
48
|
+
assert_eq!(decoded.compose_from.is_some(), true);
|
|
49
|
+
assert_eq!(decoded.compose_msg.is_some(), true);
|
|
50
|
+
assert_eq!(decoded.compose_msg.as_ref().unwrap().len(), 4);
|
|
51
|
+
assert_eq!(decoded.is_composed(), true);
|
|
52
|
+
|
|
53
|
+
// Verify compose message structure: sender's bytes32 (32 bytes) + compose_msg (4 bytes)
|
|
54
|
+
let compose_from_len = decoded.compose_from.as_ref().unwrap().to_array().len() as u32;
|
|
55
|
+
let compose_msg_len = decoded.compose_msg.as_ref().unwrap().len();
|
|
56
|
+
assert_eq!(compose_from_len + compose_msg_len, 36);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#[test]
|
|
60
|
+
fn test_is_composed_false_when_only_compose_from() {
|
|
61
|
+
let env = Env::default();
|
|
62
|
+
let sender = Address::generate(&env);
|
|
63
|
+
let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
|
|
64
|
+
let amount_sd_val = 100u64;
|
|
65
|
+
|
|
66
|
+
// Manually construct invalid state: only compose_from, no compose_msg
|
|
67
|
+
let msg = OFTMessage {
|
|
68
|
+
send_to: send_to_addr,
|
|
69
|
+
amount_sd: amount_sd_val,
|
|
70
|
+
compose_from: Some(address_to_bytes32(&sender)),
|
|
71
|
+
compose_msg: None,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Should return false - both fields are required for compose
|
|
75
|
+
assert_eq!(msg.is_composed(), false);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#[test]
|
|
79
|
+
fn test_is_composed_false_when_only_compose_msg() {
|
|
80
|
+
let env = Env::default();
|
|
81
|
+
let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
|
|
82
|
+
let amount_sd_val = 100u64;
|
|
83
|
+
let compose_msg_val = Bytes::from_array(&env, &[1u8, 2u8, 3u8]);
|
|
84
|
+
|
|
85
|
+
// Manually construct invalid state: only compose_msg, no compose_from
|
|
86
|
+
let msg = OFTMessage {
|
|
87
|
+
send_to: send_to_addr,
|
|
88
|
+
amount_sd: amount_sd_val,
|
|
89
|
+
compose_from: None,
|
|
90
|
+
compose_msg: Some(compose_msg_val),
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Should return false - both fields are required for compose
|
|
94
|
+
assert_eq!(msg.is_composed(), false);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#[test]
|
|
98
|
+
fn test_is_composed_false_when_compose_msg_empty() {
|
|
99
|
+
let env = Env::default();
|
|
100
|
+
let sender = Address::generate(&env);
|
|
101
|
+
let send_to_addr = BytesN::from_array(&env, &[1u8; 32]);
|
|
102
|
+
let amount_sd_val = 100u64;
|
|
103
|
+
let empty_compose_msg = Bytes::new(&env); // Empty bytes, not None
|
|
104
|
+
|
|
105
|
+
// Manually construct state with empty compose_msg
|
|
106
|
+
let msg = OFTMessage {
|
|
107
|
+
send_to: send_to_addr.clone(),
|
|
108
|
+
amount_sd: amount_sd_val,
|
|
109
|
+
compose_from: Some(address_to_bytes32(&sender)),
|
|
110
|
+
compose_msg: Some(empty_compose_msg),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Should return false - compose_msg must have data
|
|
114
|
+
assert_eq!(msg.is_composed(), false);
|
|
115
|
+
|
|
116
|
+
// Verify encoding also treats it as non-composed
|
|
117
|
+
let (_, has_compose) = msg.encode(&env);
|
|
118
|
+
assert_eq!(has_compose, false);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
#[test]
|
|
122
|
+
#[should_panic]
|
|
123
|
+
fn test_decode_panic_on_empty_data() {
|
|
124
|
+
let env = Env::default();
|
|
125
|
+
let data = Bytes::new(&env);
|
|
126
|
+
OFTMessage::decode(&data);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#[test]
|
|
130
|
+
#[should_panic]
|
|
131
|
+
fn test_decode_panic_on_insufficient_data() {
|
|
132
|
+
let env = Env::default();
|
|
133
|
+
let mut data = Bytes::new(&env);
|
|
134
|
+
data.extend_from_array(&[0u8; 20]); // Not enough data for amount_sd
|
|
135
|
+
OFTMessage::decode(&data);
|
|
136
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
use soroban_sdk::Env;
|
|
2
|
+
|
|
3
|
+
use super::test_utils::OFTTestSetup;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_oft_version_returns_correct_values() {
|
|
7
|
+
let env = Env::default();
|
|
8
|
+
let setup = OFTTestSetup::new(&env);
|
|
9
|
+
|
|
10
|
+
let (major, minor) = setup.oft.oft_version();
|
|
11
|
+
assert_eq!(major, 1);
|
|
12
|
+
assert_eq!(minor, 1);
|
|
13
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
use crate::errors::OFTError;
|
|
2
|
+
use soroban_sdk::Env;
|
|
3
|
+
|
|
4
|
+
use super::test_utils::{create_send_param, OFTTestSetup};
|
|
5
|
+
|
|
6
|
+
// ==================== Basic Quote OFT Tests ====================
|
|
7
|
+
|
|
8
|
+
#[test]
|
|
9
|
+
fn test_quote_oft_basic() {
|
|
10
|
+
let env = Env::default();
|
|
11
|
+
let setup = OFTTestSetup::new(&env);
|
|
12
|
+
|
|
13
|
+
let conversion_rate = setup.oft.decimal_conversion_rate();
|
|
14
|
+
let amount_ld = 12345670i128;
|
|
15
|
+
let dust_removed = (amount_ld / conversion_rate) * conversion_rate; // No dust with last digit 0
|
|
16
|
+
let send_param = create_send_param(&env, 1, amount_ld, dust_removed);
|
|
17
|
+
|
|
18
|
+
let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
|
|
19
|
+
|
|
20
|
+
// Check limits
|
|
21
|
+
assert_eq!(limit.min_amount_ld, 0);
|
|
22
|
+
assert_eq!(limit.max_amount_ld, i128::MAX);
|
|
23
|
+
|
|
24
|
+
// Check fees (should be empty for basic OFT)
|
|
25
|
+
assert_eq!(fees.len(), 0);
|
|
26
|
+
|
|
27
|
+
// Check receipt
|
|
28
|
+
assert_eq!(receipt.amount_sent_ld, dust_removed);
|
|
29
|
+
assert_eq!(receipt.amount_received_ld, dust_removed);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#[test]
|
|
33
|
+
fn test_quote_oft_with_dust_removal() {
|
|
34
|
+
let env = Env::default();
|
|
35
|
+
let setup = OFTTestSetup::new(&env);
|
|
36
|
+
|
|
37
|
+
let conversion_rate = setup.oft.decimal_conversion_rate();
|
|
38
|
+
// Amount with dust that will be removed
|
|
39
|
+
let amount_ld = 12345678i128;
|
|
40
|
+
let dust_removed = (amount_ld / conversion_rate) * conversion_rate;
|
|
41
|
+
let send_param = create_send_param(&env, 1, amount_ld, dust_removed);
|
|
42
|
+
|
|
43
|
+
let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
|
|
44
|
+
|
|
45
|
+
// Check limits
|
|
46
|
+
assert_eq!(limit.min_amount_ld, 0);
|
|
47
|
+
assert_eq!(limit.max_amount_ld, i128::MAX);
|
|
48
|
+
|
|
49
|
+
// Check fees (should be empty for basic OFT)
|
|
50
|
+
assert_eq!(fees.len(), 0);
|
|
51
|
+
|
|
52
|
+
// Check receipt - dust removed
|
|
53
|
+
assert_eq!(receipt.amount_sent_ld, dust_removed);
|
|
54
|
+
assert_eq!(receipt.amount_received_ld, dust_removed);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#[test]
|
|
58
|
+
fn test_quote_oft_zero_amount() {
|
|
59
|
+
let env = Env::default();
|
|
60
|
+
let setup = OFTTestSetup::new(&env);
|
|
61
|
+
|
|
62
|
+
let send_param = create_send_param(&env, 1, 0, 0);
|
|
63
|
+
|
|
64
|
+
let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
|
|
65
|
+
|
|
66
|
+
assert_eq!(receipt.amount_sent_ld, 0);
|
|
67
|
+
assert_eq!(receipt.amount_received_ld, 0);
|
|
68
|
+
assert_eq!(limit.min_amount_ld, 0);
|
|
69
|
+
assert_eq!(limit.max_amount_ld, i128::MAX);
|
|
70
|
+
assert_eq!(fees.len(), 0);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#[test]
|
|
74
|
+
fn test_quote_oft_dust_only_amount() {
|
|
75
|
+
let env = Env::default();
|
|
76
|
+
let setup = OFTTestSetup::new(&env);
|
|
77
|
+
|
|
78
|
+
let conversion_rate = setup.oft.decimal_conversion_rate();
|
|
79
|
+
// Amount that is entirely dust (less than conversion rate)
|
|
80
|
+
let amount_ld = conversion_rate - 1; // Less than conversion rate
|
|
81
|
+
let send_param = create_send_param(&env, 1, amount_ld, 0);
|
|
82
|
+
|
|
83
|
+
let (_, _, receipt) = setup.oft.quote_oft(&send_param);
|
|
84
|
+
|
|
85
|
+
// All dust should be removed
|
|
86
|
+
assert_eq!(receipt.amount_sent_ld, 0);
|
|
87
|
+
assert_eq!(receipt.amount_received_ld, 0);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
#[test]
|
|
91
|
+
fn test_quote_oft_different_dst_eids() {
|
|
92
|
+
let env = Env::default();
|
|
93
|
+
let setup = OFTTestSetup::new(&env);
|
|
94
|
+
|
|
95
|
+
let amount_ld = 12345670i128; // No dust
|
|
96
|
+
|
|
97
|
+
// Test with different destination EIDs
|
|
98
|
+
for dst_eid in [1u32, 100, 10000, u32::MAX] {
|
|
99
|
+
let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
|
|
100
|
+
let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
|
|
101
|
+
|
|
102
|
+
// Results should be the same regardless of dst_eid
|
|
103
|
+
assert_eq!(limit.min_amount_ld, 0);
|
|
104
|
+
assert_eq!(limit.max_amount_ld, i128::MAX);
|
|
105
|
+
assert_eq!(fees.len(), 0);
|
|
106
|
+
assert_eq!(receipt.amount_sent_ld, amount_ld);
|
|
107
|
+
assert_eq!(receipt.amount_received_ld, amount_ld);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
#[test]
|
|
112
|
+
fn test_quote_oft_large_amounts() {
|
|
113
|
+
let env = Env::default();
|
|
114
|
+
let setup = OFTTestSetup::new(&env);
|
|
115
|
+
|
|
116
|
+
// Test with a large amount
|
|
117
|
+
let amount_ld = 1_000_000_000_000_000_000i128;
|
|
118
|
+
let send_param = create_send_param(&env, 1, amount_ld, amount_ld);
|
|
119
|
+
|
|
120
|
+
let (limit, fees, receipt) = setup.oft.quote_oft(&send_param);
|
|
121
|
+
|
|
122
|
+
assert_eq!(limit.min_amount_ld, 0);
|
|
123
|
+
assert_eq!(limit.max_amount_ld, i128::MAX);
|
|
124
|
+
assert_eq!(fees.len(), 0);
|
|
125
|
+
assert_eq!(receipt.amount_sent_ld, amount_ld);
|
|
126
|
+
assert_eq!(receipt.amount_received_ld, amount_ld);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ==================== Slippage Tests ====================
|
|
130
|
+
|
|
131
|
+
#[test]
|
|
132
|
+
fn test_quote_oft_slippage_less_than_received() {
|
|
133
|
+
let env = Env::default();
|
|
134
|
+
let setup = OFTTestSetup::new(&env);
|
|
135
|
+
|
|
136
|
+
let conversion_rate = setup.oft.decimal_conversion_rate();
|
|
137
|
+
let amount_ld = 12345678i128;
|
|
138
|
+
let dust_removed = (amount_ld / conversion_rate) * conversion_rate;
|
|
139
|
+
// min_amount_ld is less than what will be received
|
|
140
|
+
let send_param = create_send_param(&env, 1, amount_ld, dust_removed - conversion_rate);
|
|
141
|
+
|
|
142
|
+
let (_, _, receipt) = setup.oft.quote_oft(&send_param);
|
|
143
|
+
|
|
144
|
+
assert_eq!(receipt.amount_sent_ld, dust_removed);
|
|
145
|
+
assert_eq!(receipt.amount_received_ld, dust_removed);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
#[test]
|
|
149
|
+
fn test_quote_oft_slippage_exceeded() {
|
|
150
|
+
let env = Env::default();
|
|
151
|
+
let setup = OFTTestSetup::new(&env);
|
|
152
|
+
|
|
153
|
+
let amount_ld = 12345678i128;
|
|
154
|
+
// min_amount_ld is higher than what can be received after dust removal
|
|
155
|
+
let send_param = create_send_param(&env, 1, amount_ld, amount_ld);
|
|
156
|
+
|
|
157
|
+
let result = setup.oft.try_quote_oft(&send_param);
|
|
158
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), OFTError::SlippageExceeded.into());
|
|
159
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
use crate::{errors::OFTError, types::SendParam};
|
|
2
|
+
use oapp::errors::OAppError;
|
|
3
|
+
use soroban_sdk::{bytes, testutils::Address as _, Address, Bytes, BytesN, Env};
|
|
4
|
+
|
|
5
|
+
use super::test_utils::{create_send_param, OFTTestSetup};
|
|
6
|
+
|
|
7
|
+
#[test]
|
|
8
|
+
fn test_quote_send_basic() {
|
|
9
|
+
let env = Env::default();
|
|
10
|
+
let setup = OFTTestSetup::new(&env);
|
|
11
|
+
|
|
12
|
+
let sender = Address::generate(&env);
|
|
13
|
+
|
|
14
|
+
// Set peer
|
|
15
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
16
|
+
let dst_eid = 100u32;
|
|
17
|
+
setup.set_peer(dst_eid, &peer);
|
|
18
|
+
|
|
19
|
+
// SAC has 7 decimals, shared is 6, conversion rate = 10
|
|
20
|
+
// Use amount with no dust
|
|
21
|
+
let amount_ld = 12345670i128;
|
|
22
|
+
let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
|
|
23
|
+
|
|
24
|
+
// Quote send without ZRO
|
|
25
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &false);
|
|
26
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
27
|
+
assert_eq!(fee.zro_fee, 0);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[test]
|
|
31
|
+
fn test_quote_send_with_zro() {
|
|
32
|
+
let env = Env::default();
|
|
33
|
+
let setup = OFTTestSetup::new(&env);
|
|
34
|
+
|
|
35
|
+
let sender = Address::generate(&env);
|
|
36
|
+
|
|
37
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
38
|
+
let dst_eid = 100u32;
|
|
39
|
+
setup.set_peer(dst_eid, &peer);
|
|
40
|
+
|
|
41
|
+
let amount_ld = 12345670i128;
|
|
42
|
+
let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
|
|
43
|
+
|
|
44
|
+
// Quote send with ZRO
|
|
45
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &true);
|
|
46
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
47
|
+
assert_eq!(fee.zro_fee, setup.zro_fee);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[test]
|
|
51
|
+
fn test_quote_send_different_amounts() {
|
|
52
|
+
let env = Env::default();
|
|
53
|
+
let setup = OFTTestSetup::new(&env);
|
|
54
|
+
|
|
55
|
+
let sender = Address::generate(&env);
|
|
56
|
+
|
|
57
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
58
|
+
let dst_eid = 100u32;
|
|
59
|
+
setup.set_peer(dst_eid, &peer);
|
|
60
|
+
|
|
61
|
+
// Test with different amounts (all divisible by conversion rate to avoid dust)
|
|
62
|
+
let conversion_rate = setup.oft.decimal_conversion_rate();
|
|
63
|
+
for amount in [100i128, 1000, 10000, 100000, 1000000] {
|
|
64
|
+
let dust_removed = (amount / conversion_rate) * conversion_rate;
|
|
65
|
+
let send_param = create_send_param(&env, dst_eid, amount, dust_removed);
|
|
66
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &false);
|
|
67
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
#[test]
|
|
72
|
+
fn test_quote_send_multiple_destinations() {
|
|
73
|
+
let env = Env::default();
|
|
74
|
+
let setup = OFTTestSetup::new(&env);
|
|
75
|
+
|
|
76
|
+
let sender = Address::generate(&env);
|
|
77
|
+
|
|
78
|
+
// Set multiple peers
|
|
79
|
+
let dst_eids = [1u32, 100, 200, 300];
|
|
80
|
+
for eid in dst_eids.iter() {
|
|
81
|
+
let peer = BytesN::from_array(&env, &[*eid as u8; 32]);
|
|
82
|
+
setup.set_peer(*eid, &peer);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
let amount_ld = 12345670i128;
|
|
86
|
+
|
|
87
|
+
// Test quote for each destination
|
|
88
|
+
for dst_eid in dst_eids.iter() {
|
|
89
|
+
let send_param = create_send_param(&env, *dst_eid, amount_ld, amount_ld);
|
|
90
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &false);
|
|
91
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
92
|
+
assert_eq!(fee.zro_fee, 0);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#[test]
|
|
97
|
+
fn test_quote_send_no_peer_set() {
|
|
98
|
+
let env = Env::default();
|
|
99
|
+
let setup = OFTTestSetup::new(&env);
|
|
100
|
+
|
|
101
|
+
let sender = Address::generate(&env);
|
|
102
|
+
|
|
103
|
+
// Don't set peer - should fail
|
|
104
|
+
let amount_ld = 12345670i128;
|
|
105
|
+
let send_param = create_send_param(&env, 100, amount_ld, amount_ld);
|
|
106
|
+
|
|
107
|
+
let result = setup.oft.try_quote_send(&sender, &send_param, &false);
|
|
108
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::NoPeer.into());
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
#[test]
|
|
112
|
+
fn test_quote_send_with_compose_msg() {
|
|
113
|
+
let env = Env::default();
|
|
114
|
+
let setup = OFTTestSetup::new(&env);
|
|
115
|
+
|
|
116
|
+
let sender = Address::generate(&env);
|
|
117
|
+
|
|
118
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
119
|
+
let dst_eid = 100u32;
|
|
120
|
+
setup.set_peer(dst_eid, &peer);
|
|
121
|
+
|
|
122
|
+
// Create send param with compose message
|
|
123
|
+
let amount_ld = 12345670i128;
|
|
124
|
+
let send_param = SendParam {
|
|
125
|
+
dst_eid,
|
|
126
|
+
to: BytesN::from_array(&env, &[1u8; 32]),
|
|
127
|
+
amount_ld,
|
|
128
|
+
min_amount_ld: amount_ld,
|
|
129
|
+
extra_options: bytes!(&env),
|
|
130
|
+
compose_msg: Bytes::from_array(&env, b"test compose msg"),
|
|
131
|
+
oft_cmd: bytes!(&env),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &false);
|
|
135
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
#[test]
|
|
139
|
+
fn test_quote_send_slippage_exceeded() {
|
|
140
|
+
let env = Env::default();
|
|
141
|
+
let setup = OFTTestSetup::new(&env);
|
|
142
|
+
|
|
143
|
+
let sender = Address::generate(&env);
|
|
144
|
+
|
|
145
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
146
|
+
let dst_eid = 100u32;
|
|
147
|
+
setup.set_peer(dst_eid, &peer);
|
|
148
|
+
|
|
149
|
+
let amount_ld = 12345678i128;
|
|
150
|
+
// min_amount_ld is higher than what can be received after dust removal
|
|
151
|
+
let send_param = create_send_param(&env, dst_eid, amount_ld, amount_ld);
|
|
152
|
+
|
|
153
|
+
let result = setup.oft.try_quote_send(&sender, &send_param, &false);
|
|
154
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), OFTError::SlippageExceeded.into());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#[test]
|
|
158
|
+
fn test_quote_send_zero_amount() {
|
|
159
|
+
let env = Env::default();
|
|
160
|
+
let setup = OFTTestSetup::new(&env);
|
|
161
|
+
|
|
162
|
+
let sender = Address::generate(&env);
|
|
163
|
+
|
|
164
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
165
|
+
let dst_eid = 100u32;
|
|
166
|
+
setup.set_peer(dst_eid, &peer);
|
|
167
|
+
|
|
168
|
+
let send_param = create_send_param(&env, dst_eid, 0, 0);
|
|
169
|
+
|
|
170
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &false);
|
|
171
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
172
|
+
assert_eq!(fee.zro_fee, 0);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
#[test]
|
|
176
|
+
fn test_quote_send_with_dust_removal() {
|
|
177
|
+
let env = Env::default();
|
|
178
|
+
let setup = OFTTestSetup::new(&env);
|
|
179
|
+
|
|
180
|
+
let sender = Address::generate(&env);
|
|
181
|
+
|
|
182
|
+
let peer = BytesN::from_array(&env, &[2u8; 32]);
|
|
183
|
+
let dst_eid = 100u32;
|
|
184
|
+
setup.set_peer(dst_eid, &peer);
|
|
185
|
+
|
|
186
|
+
// Amount with dust that will be removed
|
|
187
|
+
let amount_ld = 12345678i128;
|
|
188
|
+
let conversion_rate = setup.oft.decimal_conversion_rate();
|
|
189
|
+
let dust_removed = (amount_ld / conversion_rate) * conversion_rate;
|
|
190
|
+
let send_param = create_send_param(&env, dst_eid, amount_ld, dust_removed);
|
|
191
|
+
|
|
192
|
+
let fee = setup.oft.quote_send(&sender, &send_param, &false);
|
|
193
|
+
assert_eq!(fee.native_fee, setup.native_fee);
|
|
194
|
+
assert_eq!(fee.zro_fee, 0);
|
|
195
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
use crate::{
|
|
2
|
+
tests::test_utils::{create_recipient_address, generate_g_address},
|
|
3
|
+
utils::{address_to_bytes32, resolve_address},
|
|
4
|
+
};
|
|
5
|
+
use soroban_sdk::Env;
|
|
6
|
+
|
|
7
|
+
#[test]
|
|
8
|
+
fn test_resolve_address_contract_exists() {
|
|
9
|
+
let env = Env::default();
|
|
10
|
+
|
|
11
|
+
// Create a contract address
|
|
12
|
+
let contract_address = create_recipient_address(&env);
|
|
13
|
+
|
|
14
|
+
// Convert to bytes32
|
|
15
|
+
let bytes32 = address_to_bytes32(&contract_address);
|
|
16
|
+
|
|
17
|
+
// Resolve back - should return the same contract address
|
|
18
|
+
let resolved = resolve_address(&env, &bytes32);
|
|
19
|
+
|
|
20
|
+
assert_eq!(resolved, contract_address);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#[test]
|
|
24
|
+
fn test_resolve_address_contract_not_exists_fallback_to_g_address() {
|
|
25
|
+
let env = Env::default();
|
|
26
|
+
|
|
27
|
+
// Create a G-address (account address)
|
|
28
|
+
let g_address = generate_g_address(&env);
|
|
29
|
+
|
|
30
|
+
// Convert to bytes32
|
|
31
|
+
let bytes32 = address_to_bytes32(&g_address);
|
|
32
|
+
|
|
33
|
+
// Resolve - should fallback to G-address since contract doesn't exist
|
|
34
|
+
let resolved = resolve_address(&env, &bytes32);
|
|
35
|
+
|
|
36
|
+
assert_eq!(resolved, g_address);
|
|
37
|
+
}
|