@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.
- package/Cargo.toml +38 -0
- package/LICENSE +23 -0
- package/clippy.toml +6 -0
- package/package.json +54 -0
- package/rust-toolchain.toml +4 -0
- package/rustfmt.toml +15 -0
- package/src/codec/mod.rs +2 -0
- package/src/codec/oft_compose_msg_codec.rs +55 -0
- package/src/codec/oft_msg_codec.rs +58 -0
- package/src/errors.rs +15 -0
- package/src/events.rs +32 -0
- package/src/lib.rs +22 -0
- package/src/oft_core.rs +594 -0
- package/src/storage.rs +19 -0
- package/src/tests/mod.rs +14 -0
- package/src/tests/test_decimals.rs +124 -0
- package/src/tests/test_lz_receive.rs +282 -0
- package/src/tests/test_msg_inspector.rs +324 -0
- package/src/tests/test_oft_compose_msg_codec.rs +68 -0
- package/src/tests/test_oft_msg_codec.rs +64 -0
- package/src/tests/test_oft_version_and_approval.rs +22 -0
- package/src/tests/test_quote_oft.rs +159 -0
- package/src/tests/test_quote_send.rs +195 -0
- package/src/tests/test_resolve_address.rs +37 -0
- package/src/tests/test_send.rs +915 -0
- package/src/tests/test_token.rs +47 -0
- package/src/tests/test_utils.rs +870 -0
- package/src/types.rs +58 -0
- package/src/utils.rs +71 -0
|
@@ -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
|
+
}
|