@layerzerolabs/oft-core-stellar-contracts 0.2.122

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.
@@ -0,0 +1,195 @@
1
+ use crate::{errors::OFTError, types::SendParam};
2
+ use oapp::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_payload, 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_payload(&env, &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_payload(&env, &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
+ }