@@ -7,18 +7,32 @@ mod test {
7
7
use stylus_sdk:: testing:: * ;
8
8
use pythnet_sdk:: wire:: v1:: PYTHNET_ACCUMULATOR_UPDATE_MAGIC ;
9
9
10
+ const TEST_PRICE_ID : [ u8 ; 32 ] = [
11
+ 0xe6 , 0x2d , 0xf6 , 0xc8 , 0xb4 , 0xa8 , 0x5f , 0xe1 , 0xa6 , 0x7d , 0xb4 , 0x4d , 0xc1 , 0x2d , 0xe5 , 0xdb ,
12
+ 0x33 , 0x0f , 0x7a , 0xc6 , 0x6b , 0x72 , 0xdc , 0x65 , 0x8a , 0xfe , 0xdf , 0x0f , 0x4a , 0x41 , 0x5b , 0x43
13
+ ] ;
14
+ const TEST_PUBLISH_TIME : u64 = 1712589206 ;
15
+ const TEST_PRICE : i64 = 7192002930010 ;
16
+ const TEST_CONF : u64 = 3596501465 ;
17
+ const TEST_EXPO : i32 = -8 ;
18
+ const TEST_EMA_PRICE : i64 = 7181868900000 ;
19
+ const TEST_EMA_CONF : u64 = 4096812700 ;
20
+
21
+ const PYTHNET_CHAIN_ID : u16 = 26 ;
22
+ const PYTHNET_EMITTER_ADDRESS : [ u8 ; 32 ] = [
23
+ 0xe1 , 0x01 , 0xfa , 0xed , 0xac , 0x58 , 0x51 , 0xe3 , 0x2b , 0x9b , 0x23 , 0xb5 , 0xf9 , 0x41 , 0x1a , 0x8c ,
24
+ 0x2b , 0xac , 0x4a , 0xae , 0x3e , 0xd4 , 0xdd , 0x7b , 0x81 , 0x1d , 0xd1 , 0xa7 , 0x2e , 0xa4 , 0xaa , 0x71
25
+ ] ;
26
+
10
27
fn initialize_test_contract ( vm : & TestVM ) -> PythReceiver {
11
28
let mut contract = PythReceiver :: from ( vm) ;
12
29
let wormhole_address = address ! ( "0x3F38404A2e3Cb949bcDfA19a5C3bDf3fE375fEb0" ) ;
13
30
let single_update_fee = U256 :: from ( 100u64 ) ;
14
31
let valid_time_period = U256 :: from ( 3600u64 ) ;
15
-
16
- let data_source_chain_ids = vec ! [ 1u16 , 2u16 ] ;
17
- let data_source_emitter_addresses = vec ! [
18
- [ 1u8 ; 32 ] ,
19
- [ 2u8 ; 32 ] ,
20
- ] ;
21
-
32
+
33
+ let data_source_chain_ids = vec ! [ PYTHNET_CHAIN_ID ] ;
34
+ let data_source_emitter_addresses = vec ! [ PYTHNET_EMITTER_ADDRESS ] ;
35
+
22
36
let governance_chain_id = 1u16 ;
23
37
let governance_emitter_address = [ 3u8 ; 32 ] ;
24
38
let governance_initial_sequence = 0u64 ;
@@ -78,13 +92,10 @@ mod test {
78
92
let wormhole_address = address ! ( "0x3F38404A2e3Cb949bcDfA19a5C3bDf3fE375fEb0" ) ;
79
93
let single_update_fee = U256 :: from ( 100u64 ) ;
80
94
let valid_time_period = U256 :: from ( 3600u64 ) ;
81
-
82
- let data_source_chain_ids = vec ! [ 1u16 , 2u16 ] ;
83
- let data_source_emitter_addresses = vec ! [
84
- [ 1u8 ; 32 ] ,
85
- [ 2u8 ; 32 ] ,
86
- ] ;
87
-
95
+
96
+ let data_source_chain_ids = vec ! [ PYTHNET_CHAIN_ID ] ;
97
+ let data_source_emitter_addresses = vec ! [ PYTHNET_EMITTER_ADDRESS ] ;
98
+
88
99
let governance_chain_id = 1u16 ;
89
100
let governance_emitter_address = [ 3u8 ; 32 ] ;
90
101
let governance_initial_sequence = 0u64 ;
@@ -104,11 +115,11 @@ mod test {
104
115
105
116
let fee = contract. get_update_fee ( vec ! [ ] ) ;
106
117
assert_eq ! ( fee, U256 :: from( 0u8 ) ) ; // Fee calculation not implemented yet
107
-
118
+
108
119
let twap_fee = contract. get_twap_update_fee ( vec ! [ ] ) ;
109
120
assert_eq ! ( twap_fee, U256 :: from( 0u8 ) ) ; // Fee calculation not implemented yet
110
-
111
- let test_price_id = [ 0u8 ; 32 ] ;
121
+
122
+ let test_price_id = TEST_PRICE_ID ;
112
123
let price_result = contract. get_price_unsafe ( test_price_id) ;
113
124
assert ! ( price_result. is_err( ) ) ;
114
125
assert ! ( matches!( price_result. unwrap_err( ) , PythReceiverError :: PriceUnavailable ) ) ;
@@ -117,16 +128,14 @@ mod test {
117
128
#[ test]
118
129
fn test_update_new_price_feed ( ) {
119
130
let vm = TestVM :: default ( ) ;
120
- let mut contract = initialize_test_contract ( & vm) ;
121
-
122
- let test_price_id = [ 1u8 ; 32 ] ;
123
-
131
+ let contract = initialize_test_contract ( & vm) ;
132
+
133
+ let test_price_id = TEST_PRICE_ID ;
134
+
124
135
let update_data = create_valid_update_data ( ) ;
125
- let result = contract. update_price_feeds (
126
- update_data,
127
- ) ;
128
-
129
-
136
+ let _result = contract. update_price_feeds ( update_data) ;
137
+
138
+
130
139
let price_result = contract. get_price_unsafe ( test_price_id) ;
131
140
assert ! ( price_result. is_err( ) ) ;
132
141
assert ! ( matches!( price_result. unwrap_err( ) , PythReceiverError :: PriceUnavailable ) ) ;
@@ -135,138 +144,123 @@ mod test {
135
144
#[ test]
136
145
fn test_update_existing_price_feed ( ) {
137
146
let vm = TestVM :: default ( ) ;
138
- let mut contract = initialize_test_contract ( & vm) ;
139
-
140
- let test_price_id = [ 1u8 ; 32 ] ;
141
-
147
+ let contract = initialize_test_contract ( & vm) ;
148
+
149
+ let _test_price_id = TEST_PRICE_ID ;
150
+
142
151
let update_data1 = create_valid_update_data ( ) ;
143
- let result1 = contract. update_price_feeds_internal (
144
- update_data1,
145
- vec ! [ ] ,
146
- 0 ,
147
- u64:: MAX ,
148
- false
149
- ) ;
150
-
152
+ let _result1 = contract. update_price_feeds_internal ( update_data1) ;
153
+
151
154
let update_data2 = create_valid_update_data ( ) ;
152
- let result2 = contract. update_price_feeds_internal (
153
- update_data2,
154
- vec ! [ ] ,
155
- 0 ,
156
- u64:: MAX ,
157
- false
158
- ) ;
159
-
155
+ let _result2 = contract. update_price_feeds_internal ( update_data2) ;
156
+
160
157
}
161
158
162
159
#[ test]
163
160
fn test_invalid_magic_header ( ) {
164
161
let vm = TestVM :: default ( ) ;
165
- let mut contract = initialize_test_contract ( & vm) ;
166
-
162
+ let contract = initialize_test_contract ( & vm) ;
163
+
167
164
let invalid_data = create_invalid_magic_data ( ) ;
168
- let result = contract. update_price_feeds_internal (
169
- invalid_data,
170
- vec ! [ ] ,
171
- 0 ,
172
- u64:: MAX ,
173
- false
174
- ) ;
175
-
165
+ let result = contract. update_price_feeds_internal ( invalid_data) ;
166
+
176
167
assert ! ( result. is_err( ) ) ;
177
168
assert ! ( matches!( result. unwrap_err( ) , PythReceiverError :: InvalidAccumulatorMessage ) ) ;
178
169
}
179
170
180
171
#[ test]
181
172
fn test_invalid_wire_format ( ) {
182
173
let vm = TestVM :: default ( ) ;
183
- let mut contract = initialize_test_contract ( & vm) ;
184
-
174
+ let contract = initialize_test_contract ( & vm) ;
175
+
185
176
let short_data = create_short_data ( ) ;
186
- let result = contract. update_price_feeds_internal (
187
- short_data,
188
- vec ! [ ] ,
189
- 0 ,
190
- u64:: MAX ,
191
- false
192
- ) ;
193
-
177
+ let result = contract. update_price_feeds_internal ( short_data) ;
178
+
194
179
assert ! ( result. is_err( ) ) ;
195
180
assert ! ( matches!( result. unwrap_err( ) , PythReceiverError :: InvalidUpdateData ) ) ;
196
181
}
197
182
198
183
#[ test]
199
184
fn test_invalid_wormhole_vaa ( ) {
200
185
let vm = TestVM :: default ( ) ;
201
- let mut contract = initialize_test_contract ( & vm) ;
202
-
186
+ let contract = initialize_test_contract ( & vm) ;
187
+
203
188
let invalid_vaa_data = create_invalid_vaa_data ( ) ;
204
- let result = contract. update_price_feeds_internal (
205
- invalid_vaa_data,
206
- vec ! [ ] ,
207
- 0 ,
208
- u64:: MAX ,
209
- false
210
- ) ;
211
-
189
+ let result = contract. update_price_feeds_internal ( invalid_vaa_data) ;
190
+
212
191
assert ! ( result. is_err( ) ) ;
213
192
}
214
193
215
194
#[ test]
216
195
fn test_invalid_merkle_proof ( ) {
217
196
let vm = TestVM :: default ( ) ;
218
- let mut contract = initialize_test_contract ( & vm) ;
219
-
197
+ let contract = initialize_test_contract ( & vm) ;
198
+
220
199
let invalid_merkle_data = create_invalid_merkle_data ( ) ;
221
- let result = contract. update_price_feeds_internal (
222
- invalid_merkle_data,
223
- vec ! [ ] ,
224
- 0 ,
225
- u64:: MAX ,
226
- false
227
- ) ;
228
-
200
+ let result = contract. update_price_feeds_internal ( invalid_merkle_data) ;
201
+
229
202
assert ! ( result. is_err( ) ) ;
230
203
}
231
204
232
205
#[ test]
233
206
fn test_stale_price_rejection ( ) {
234
207
let vm = TestVM :: default ( ) ;
235
- let mut contract = initialize_test_contract ( & vm) ;
236
-
237
- let test_price_id = [ 1u8 ; 32 ] ;
208
+ let contract = initialize_test_contract ( & vm) ;
209
+
210
+ let test_price_id = TEST_PRICE_ID ;
238
211
let price_result = contract. get_price_unsafe ( test_price_id) ;
239
212
assert ! ( price_result. is_err( ) ) ;
240
213
assert ! ( matches!( price_result. unwrap_err( ) , PythReceiverError :: PriceUnavailable ) ) ;
241
-
214
+
242
215
}
243
216
244
217
#[ test]
245
218
fn test_get_price_no_older_than_error ( ) {
246
219
let vm = TestVM :: default ( ) ;
247
- let mut contract = initialize_test_contract ( & vm) ;
248
-
249
- let test_price_id = [ 1u8 ; 32 ] ;
220
+ let contract = initialize_test_contract ( & vm) ;
221
+
222
+ let test_price_id = TEST_PRICE_ID ;
250
223
let result = contract. get_price_no_older_than ( test_price_id, 1 ) ;
251
-
224
+
252
225
assert ! ( result. is_err( ) ) ;
253
226
assert ! ( matches!( result. unwrap_err( ) , PythReceiverError :: PriceUnavailable ) ) ;
254
-
227
+
255
228
}
256
229
257
230
#[ test]
258
231
fn test_contract_state_after_init ( ) {
259
232
let vm = TestVM :: default ( ) ;
260
233
let contract = initialize_test_contract ( & vm) ;
261
-
234
+
262
235
let fee = contract. get_update_fee ( vec ! [ ] ) ;
263
236
assert_eq ! ( fee, U256 :: from( 0u8 ) ) ;
264
-
265
- let random_price_id = [ 42u8 ; 32 ] ;
237
+
238
+ let random_price_id = TEST_PRICE_ID ;
266
239
let price_result = contract. get_price_unsafe ( random_price_id) ;
267
240
assert ! ( price_result. is_err( ) ) ;
268
-
241
+
269
242
let price_no_older_result = contract. get_price_no_older_than ( random_price_id, 3600 ) ;
270
243
assert ! ( price_no_older_result. is_err( ) ) ;
271
244
}
245
+
246
+ #[ test]
247
+ fn test_successful_price_update_and_retrieval ( ) {
248
+ let vm = TestVM :: default ( ) ;
249
+ let contract = initialize_test_contract ( & vm) ;
250
+
251
+ let initial_result = contract. get_price_unsafe ( TEST_PRICE_ID ) ;
252
+ assert ! ( initial_result. is_err( ) ) ;
253
+ assert ! ( matches!( initial_result. unwrap_err( ) , PythReceiverError :: PriceUnavailable ) ) ;
254
+
255
+ // let update_data = create_valid_update_data();
256
+ // let update_result = contract.update_price_feeds(update_data);
257
+
258
+ // let price_result = contract.get_price_unsafe(TEST_PRICE_ID);
259
+ // assert!(price_result.is_ok());
260
+
261
+ // let price_info = price_result.unwrap();
262
+ // assert_eq!(price_info.0.to::<u64>(), TEST_PUBLISH_TIME);
263
+ // assert_eq!(price_info.2.to::<i64>(), TEST_PRICE);
264
+ // assert_eq!(price_info.3.to::<u64>(), TEST_CONF);
265
+ }
272
266
}
0 commit comments