@@ -16,6 +16,8 @@ pub enum GovernanceAction {
16
16
RequestGovernanceDataSourceTransfer ,
17
17
SetWormholeAddress ,
18
18
SetFeeInToken ,
19
+ SetTransactionFee ,
20
+ WithdrawFee ,
19
21
}
20
22
21
23
impl TryFrom < u8 > for GovernanceAction {
@@ -31,6 +33,8 @@ impl TryFrom<u8> for GovernanceAction {
31
33
5 => Ok ( GovernanceAction :: RequestGovernanceDataSourceTransfer ) ,
32
34
6 => Ok ( GovernanceAction :: SetWormholeAddress ) ,
33
35
7 => Ok ( GovernanceAction :: SetFeeInToken ) ,
36
+ 8 => Ok ( GovernanceAction :: SetTransactionFee ) ,
37
+ 9 => Ok ( GovernanceAction :: WithdrawFee ) ,
34
38
_ => Err ( PythReceiverError :: InvalidGovernanceAction ) ,
35
39
}
36
40
}
@@ -313,6 +317,71 @@ pub fn parse_instruction(payload: Vec<u8>) -> Result<GovernanceInstruction, Pyth
313
317
address : Address :: from ( address_bytes) ,
314
318
} )
315
319
}
320
+ GovernanceAction :: SetTransactionFee => {
321
+ if payload. len ( ) < cursor + 16 {
322
+ return Err ( PythReceiverError :: InvalidGovernanceMessage ) ;
323
+ }
324
+ let fee_value_bytes = payload
325
+ . get ( cursor..cursor + 8 )
326
+ . ok_or ( PythReceiverError :: InvalidGovernanceMessage ) ?;
327
+
328
+ let value = u64:: from_be_bytes (
329
+ fee_value_bytes
330
+ . try_into ( )
331
+ . map_err ( |_| PythReceiverError :: InvalidGovernanceMessage ) ?,
332
+ ) ;
333
+
334
+ cursor += 8 ;
335
+
336
+ let expo_bytes = payload
337
+ . get ( cursor..cursor + 8 )
338
+ . ok_or ( PythReceiverError :: InvalidGovernanceMessage ) ?;
339
+ let expo = u64:: from_be_bytes (
340
+ expo_bytes
341
+ . try_into ( )
342
+ . map_err ( |_| PythReceiverError :: InvalidGovernanceMessage ) ?,
343
+ ) ;
344
+
345
+ cursor += 8 ;
346
+ GovernancePayload :: SetTransactionFee ( SetTransactionFee { value, expo } )
347
+ }
348
+ GovernanceAction :: WithdrawFee => {
349
+ if payload. len ( ) < cursor + 28 {
350
+ return Err ( PythReceiverError :: InvalidGovernanceMessage ) ;
351
+ }
352
+
353
+ let mut target_address_bytes = [ 0u8 ; 20 ] ;
354
+ target_address_bytes. copy_from_slice ( & payload[ cursor..cursor + 20 ] ) ;
355
+ cursor += 20 ;
356
+
357
+ let fee_value_bytes = payload
358
+ . get ( cursor..cursor + 8 )
359
+ . ok_or ( PythReceiverError :: InvalidGovernanceMessage ) ?;
360
+
361
+ let value = u64:: from_be_bytes (
362
+ fee_value_bytes
363
+ . try_into ( )
364
+ . map_err ( |_| PythReceiverError :: InvalidGovernanceMessage ) ?,
365
+ ) ;
366
+
367
+ cursor += 8 ;
368
+
369
+ let expo_bytes = payload
370
+ . get ( cursor..cursor + 8 )
371
+ . ok_or ( PythReceiverError :: InvalidGovernanceMessage ) ?;
372
+ let expo = u64:: from_be_bytes (
373
+ expo_bytes
374
+ . try_into ( )
375
+ . map_err ( |_| PythReceiverError :: InvalidGovernanceMessage ) ?,
376
+ ) ;
377
+
378
+ cursor += 8 ;
379
+ GovernancePayload :: WithdrawFee ( WithdrawFee {
380
+ value,
381
+ expo,
382
+ target_address : Address :: from ( target_address_bytes) ,
383
+ } )
384
+ }
316
385
} ;
317
386
318
387
if cursor != payload. len ( ) {
0 commit comments