@@ -10,11 +10,26 @@ use {
10
10
mem:: size_of,
11
11
ops:: Deref ,
12
12
} ,
13
- wormhole_sdk:: Chain ,
14
13
} ;
15
14
16
15
pub const MAGIC_NUMBER : u32 = 0x4d475450 ; // Reverse order of the solidity contract because borsh uses little endian numbers (the solidity contract uses 0x5054474d)
17
16
17
+ pub const CHAIN_ID_ARRAY : & [ ( & str , u16 ) ] = & [
18
+ ( "pythnet" , 26 ) ,
19
+ ( "pythtest" , 26 ) ,
20
+ ( "eclipse_devnet" , 40001 ) ,
21
+ ( "eclipse_testnet" , 40002 ) ,
22
+ ] ;
23
+
24
+ #[ cfg( any( feature = "pythnet" , feature = "pythtest" ) ) ]
25
+ pub const CHAIN_ID : u16 = 26 ;
26
+
27
+ #[ cfg( feature = "eclipse_devnet" ) ]
28
+ pub const CHAIN_ID : u16 = 40001 ;
29
+
30
+ #[ cfg( feature = "eclipse_testnet" ) ]
31
+ pub const CHAIN_ID : u16 = 40002 ;
32
+
18
33
#[ derive( AnchorDeserialize , AnchorSerialize , Debug , PartialEq , Eq ) ]
19
34
pub struct ExecutorPayload {
20
35
pub header : GovernanceHeader ,
@@ -48,14 +63,12 @@ pub struct GovernanceHeader {
48
63
49
64
impl GovernanceHeader {
50
65
#[ allow( unused) ] // Only used in tests right now
51
- pub fn executor_governance_header ( ) -> Self {
66
+ pub fn executor_governance_header ( chain : u16 ) -> Self {
52
67
Self {
53
68
magic_number : MAGIC_NUMBER ,
54
69
module : Module :: Executor ,
55
70
action : Action :: ExecutePostedVaa ,
56
- chain : BigEndianU16 {
57
- value : Chain :: Pythnet . try_into ( ) . unwrap ( ) ,
58
- } ,
71
+ chain : BigEndianU16 { value : chain } ,
59
72
}
60
73
}
61
74
}
@@ -163,7 +176,7 @@ impl ExecutorPayload {
163
176
. ok_or ( error ! ( ExecutorError :: GovernanceHeaderInvalidModule ) ) ?;
164
177
( self . header . action == ExecutorPayload :: ACTION )
165
178
. ok_or ( error ! ( ExecutorError :: GovernanceHeaderInvalidAction ) ) ?;
166
- ( Chain :: from ( self . header . chain . value ) == Chain :: Pythnet )
179
+ ( self . header . chain . value == CHAIN_ID )
167
180
. ok_or ( error ! ( ExecutorError :: GovernanceHeaderInvalidReceiverChain ) )
168
181
}
169
182
}
@@ -173,12 +186,17 @@ pub mod tests {
173
186
use {
174
187
super :: ExecutorPayload ,
175
188
crate :: {
176
- error,
177
189
error:: ExecutorError ,
178
- state:: governance_payload:: InstructionData ,
190
+ state:: governance_payload:: {
191
+ InstructionData ,
192
+ CHAIN_ID ,
193
+ } ,
179
194
} ,
180
195
anchor_lang:: {
181
- prelude:: Pubkey ,
196
+ prelude:: {
197
+ Pubkey ,
198
+ * ,
199
+ } ,
182
200
AnchorDeserialize ,
183
201
AnchorSerialize ,
184
202
} ,
@@ -188,22 +206,55 @@ pub mod tests {
188
206
fn test_check_deserialization_serialization ( ) {
189
207
// No instructions
190
208
let payload = ExecutorPayload {
191
- header : super :: GovernanceHeader :: executor_governance_header ( ) ,
209
+ header : super :: GovernanceHeader :: executor_governance_header ( CHAIN_ID ) ,
192
210
instructions : vec ! [ ] ,
193
211
} ;
194
212
195
213
assert ! ( payload. check_header( ) . is_ok( ) ) ;
196
214
197
215
let payload_bytes = payload. try_to_vec ( ) . unwrap ( ) ;
198
- assert_eq ! ( payload_bytes, vec![ 80 , 84 , 71 , 77 , 0 , 0 , 0 , 26 , 0 , 0 , 0 , 0 ] ) ;
216
+ assert_eq ! (
217
+ payload_bytes,
218
+ vec![
219
+ 80 ,
220
+ 84 ,
221
+ 71 ,
222
+ 77 ,
223
+ 0 ,
224
+ 0 ,
225
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
226
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
227
+ 0 ,
228
+ 0 ,
229
+ 0 ,
230
+ 0
231
+ ]
232
+ ) ;
233
+ assert_eq ! (
234
+ payload_bytes,
235
+ vec![
236
+ 80 ,
237
+ 84 ,
238
+ 71 ,
239
+ 77 ,
240
+ 0 ,
241
+ 0 ,
242
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
243
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
244
+ 0 ,
245
+ 0 ,
246
+ 0 ,
247
+ 0
248
+ ]
249
+ ) ;
199
250
200
251
let deserialized_payload =
201
252
ExecutorPayload :: try_from_slice ( payload_bytes. as_slice ( ) ) . unwrap ( ) ;
202
253
assert_eq ! ( payload, deserialized_payload) ;
203
254
204
255
// One instruction
205
256
let payload = ExecutorPayload {
206
- header : super :: GovernanceHeader :: executor_governance_header ( ) ,
257
+ header : super :: GovernanceHeader :: executor_governance_header ( CHAIN_ID ) ,
207
258
208
259
instructions : vec ! [ InstructionData :: from(
209
260
& anchor_lang:: solana_program:: system_instruction:: create_account(
@@ -221,19 +272,59 @@ pub mod tests {
221
272
let payload_bytes = payload. try_to_vec ( ) . unwrap ( ) ;
222
273
assert_eq ! (
223
274
payload_bytes[ ..12 ] ,
224
- vec![ 80 , 84 , 71 , 77 , 0 , 0 , 0 , 26 , 1 , 0 , 0 , 0 ]
275
+ vec![
276
+ 80 ,
277
+ 84 ,
278
+ 71 ,
279
+ 77 ,
280
+ 0 ,
281
+ 0 ,
282
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
283
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
284
+ 1 ,
285
+ 0 ,
286
+ 0 ,
287
+ 0
288
+ ]
225
289
) ;
226
290
227
291
let deserialized_payload =
228
292
ExecutorPayload :: try_from_slice ( payload_bytes. as_slice ( ) ) . unwrap ( ) ;
229
293
assert_eq ! ( payload, deserialized_payload) ;
230
294
231
295
// Module outside of range
232
- let payload_bytes = vec ! [ 80 , 84 , 71 , 77 , 3 , 0 , 0 , 26 , 0 , 0 , 0 , 0 , 0 ] ;
296
+ let payload_bytes = vec ! [
297
+ 80 ,
298
+ 84 ,
299
+ 71 ,
300
+ 77 ,
301
+ 3 ,
302
+ 0 ,
303
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
304
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
305
+ 0 ,
306
+ 0 ,
307
+ 0 ,
308
+ 0 ,
309
+ 0 ,
310
+ ] ;
233
311
assert ! ( ExecutorPayload :: try_from_slice( payload_bytes. as_slice( ) ) . is_err( ) ) ;
234
312
235
313
// Wrong module
236
- let payload_bytes = vec ! [ 80 , 84 , 71 , 77 , 1 , 0 , 0 , 26 , 0 , 0 , 0 , 0 ] ;
314
+ let payload_bytes = vec ! [
315
+ 80 ,
316
+ 84 ,
317
+ 71 ,
318
+ 77 ,
319
+ 1 ,
320
+ 0 ,
321
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
322
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
323
+ 0 ,
324
+ 0 ,
325
+ 0 ,
326
+ 0 ,
327
+ ] ;
237
328
let deserialized_payload =
238
329
ExecutorPayload :: try_from_slice ( payload_bytes. as_slice ( ) ) . unwrap ( ) ;
239
330
assert_eq ! (
@@ -242,7 +333,20 @@ pub mod tests {
242
333
) ;
243
334
244
335
// Wrong magic
245
- let payload_bytes = vec ! [ 81 , 84 , 71 , 77 , 1 , 0 , 0 , 26 , 0 , 0 , 0 , 0 ] ;
336
+ let payload_bytes = vec ! [
337
+ 81 ,
338
+ 84 ,
339
+ 71 ,
340
+ 77 ,
341
+ 1 ,
342
+ 0 ,
343
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
344
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
345
+ 0 ,
346
+ 0 ,
347
+ 0 ,
348
+ 0 ,
349
+ ] ;
246
350
let deserialized_payload =
247
351
ExecutorPayload :: try_from_slice ( payload_bytes. as_slice ( ) ) . unwrap ( ) ;
248
352
assert_eq ! (
@@ -251,11 +355,37 @@ pub mod tests {
251
355
) ;
252
356
253
357
// Action outside of range
254
- let payload_bytes = vec ! [ 80 , 84 , 71 , 77 , 0 , 1 , 0 , 26 , 0 , 0 , 0 , 0 ] ;
358
+ let payload_bytes = vec ! [
359
+ 80 ,
360
+ 84 ,
361
+ 71 ,
362
+ 77 ,
363
+ 0 ,
364
+ 1 ,
365
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
366
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
367
+ 0 ,
368
+ 0 ,
369
+ 0 ,
370
+ 0 ,
371
+ ] ;
255
372
assert ! ( ExecutorPayload :: try_from_slice( payload_bytes. as_slice( ) ) . is_err( ) ) ;
256
373
257
374
// Wrong receiver chain endianess
258
- let payload_bytes = vec ! [ 80 , 84 , 71 , 77 , 0 , 0 , 26 , 0 , 0 , 0 , 0 , 0 ] ;
375
+ let payload_bytes = vec ! [
376
+ 80 ,
377
+ 84 ,
378
+ 71 ,
379
+ 77 ,
380
+ 0 ,
381
+ 0 ,
382
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
383
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
384
+ 0 ,
385
+ 0 ,
386
+ 0 ,
387
+ 0 ,
388
+ ] ;
259
389
let deserialized_payload =
260
390
ExecutorPayload :: try_from_slice ( payload_bytes. as_slice ( ) ) . unwrap ( ) ;
261
391
assert_eq ! (
@@ -264,7 +394,20 @@ pub mod tests {
264
394
) ;
265
395
266
396
// Wrong vector format
267
- let payload_bytes = vec ! [ 80 , 84 , 71 , 77 , 0 , 0 , 0 , 26 , 1 , 0 , 0 , 0 ] ;
397
+ let payload_bytes = vec ! [
398
+ 80 ,
399
+ 84 ,
400
+ 71 ,
401
+ 77 ,
402
+ 0 ,
403
+ 0 ,
404
+ CHAIN_ID . to_be_bytes( ) [ 0 ] ,
405
+ CHAIN_ID . to_be_bytes( ) [ 1 ] ,
406
+ 1 ,
407
+ 0 ,
408
+ 0 ,
409
+ 0 ,
410
+ ] ;
268
411
assert ! ( ExecutorPayload :: try_from_slice( payload_bytes. as_slice( ) ) . is_err( ) ) ;
269
412
}
270
413
}
0 commit comments