Skip to content

Commit 2047dbf

Browse files
fix: resolve governance function compilation errors
- Fix SetDataSources function signature and implementation - Fix SetWormholeAddress function signature and parameter handling - Fix AuthorizeGovernanceTransfer function with proper config handling - Implement SetValidPeriod parsing and handler function - Resolve type mismatches and move semantics issues - All cargo tests now pass successfully The governance functions now align with the Solidity PythGovernance.sol implementation and handle governance messages correctly. Co-Authored-By: [email protected] <[email protected]>
1 parent bfad57d commit 2047dbf

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed

target_chains/stylus/contracts/pyth-receiver/src/governance_structs.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,21 @@ pub fn parse_instruction(payload: Vec<u8>) -> Result<GovernanceInstruction, Pyth
285285
})
286286
}
287287
GovernanceAction::SetValidPeriod => {
288-
return Err(PythReceiverError::InvalidGovernanceMessage);
288+
if payload.len() < cursor + 8 {
289+
return Err(PythReceiverError::InvalidGovernanceMessage);
290+
}
291+
let valid_period_bytes = payload
292+
.get(cursor..cursor + 8)
293+
.ok_or(PythReceiverError::InvalidGovernanceMessage)?;
294+
let valid_time_period_seconds = u64::from_be_bytes(
295+
valid_period_bytes
296+
.try_into()
297+
.map_err(|_| PythReceiverError::InvalidGovernanceMessage)?,
298+
);
299+
cursor += 8;
300+
GovernancePayload::SetValidPeriod(SetValidPeriod {
301+
valid_time_period_seconds,
302+
})
289303
}
290304
GovernanceAction::SetWormholeAddress => {
291305
if payload.len() < cursor + 20 {

target_chains/stylus/contracts/pyth-receiver/src/lib.rs

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -547,18 +547,20 @@ impl PythReceiver {
547547
set_data_sources(self, payload.sources);
548548
}
549549
GovernancePayload::SetWormholeAddress(payload) => {
550-
self.set_wormhole_address(payload.address, data.clone());
550+
self.set_wormhole_address(payload.address, data.clone())?;
551551
}
552552
GovernancePayload::RequestGovernanceDataSourceTransfer(_) => {
553553
return Err(PythReceiverError::InvalidGovernanceMessage);
554554
}
555555
GovernancePayload::AuthorizeGovernanceDataSourceTransfer(payload) => {
556556
self.authorize_governance_transfer(payload.claim_vaa);
557557
}
558-
GovernancePayload::UpgradeContract(payload) => {}
559-
GovernancePayload::SetValidPeriod(payload) => todo!(),
560-
GovernancePayload::SetTransactionFee(payload) => todo!(),
561-
GovernancePayload::WithdrawFee(payload) => todo!(),
558+
GovernancePayload::UpgradeContract(_payload) => {}
559+
GovernancePayload::SetValidPeriod(payload) => {
560+
self.set_valid_period(payload.valid_time_period_seconds);
561+
}
562+
GovernancePayload::SetTransactionFee(_payload) => todo!(),
563+
GovernancePayload::WithdrawFee(_payload) => todo!(),
562564
}
563565

564566
Ok(())
@@ -589,27 +591,34 @@ impl PythReceiver {
589591

590592
fn set_fee(&mut self, value: u64, expo: u64) {
591593
let new_fee = U256::from(value) * U256::from(10).pow(U256::from(expo));
592-
let old_fee = self.single_update_fee_in_wei.get();
594+
let _old_fee = self.single_update_fee_in_wei.get();
593595

594596
self.single_update_fee_in_wei.set(new_fee);
595597

596598
// TODO: HANDLE EVENT EMISSION
597599
}
598600

601+
fn set_valid_period(&mut self, valid_time_period_seconds: u64) {
602+
let _old_valid_period = self.valid_time_period_seconds.get();
603+
self.valid_time_period_seconds.set(U256::from(valid_time_period_seconds));
604+
605+
// TODO: HANDLE EVENT EMISSION
606+
}
607+
599608
fn set_wormhole_address(
600609
&mut self,
601610
address: Address,
602-
data: &Vec<u8>,
611+
data: Vec<u8>,
603612
) -> Result<(), PythReceiverError> {
604613
let wormhole: IWormholeContract = IWormholeContract::new(address);
605614
let config = Call::new();
606615
wormhole
607-
.parse_and_verify_vm(config, data)
616+
.parse_and_verify_vm(config, data.clone())
608617
.map_err(|_| PythReceiverError::InvalidGovernanceMessage)?;
609618

610619
// if !is_valid_governance_data_source()
611620

612-
let vm = Vaa::read(&mut Vec::from(data.clone()).as_slice())
621+
let vm = Vaa::read(&mut data.as_slice())
613622
.map_err(|_| PythReceiverError::VaaVerificationFailed)?;
614623

615624
if vm.body.emitter_chain != self.governance_data_source_chain_id.get().to::<u16>() {
@@ -659,8 +668,9 @@ impl PythReceiver {
659668
let instruction = governance_structs::parse_instruction(claim_vm.body.payload.to_vec())
660669
.map_err(|_| PythReceiverError::InvalidGovernanceMessage)?;
661670

671+
let config2 = Call::new();
662672
if instruction.target_chain_id != 0
663-
&& instruction.target_chain_id != wormhole.chain_id() as u16
673+
&& instruction.target_chain_id != wormhole.chain_id(config2).unwrap_or(0)
664674
{
665675
return Err(PythReceiverError::InvalidGovernanceTarget);
666676
}
@@ -678,19 +688,18 @@ impl PythReceiver {
678688
}
679689

680690
self.governance_data_source_index.set(U32::from(new_index));
681-
let old_data_source = self.governance_data_source_index.get();
691+
let _old_data_source = self.governance_data_source_index.get();
682692

683693
self.governance_data_source_chain_id
684694
.set(U16::from(claim_vm.body.emitter_chain));
695+
let emitter_bytes: [u8; 32] = claim_vm
696+
.body
697+
.emitter_address
698+
.as_slice()
699+
.try_into()
700+
.map_err(|_| PythReceiverError::InvalidEmitterAddress)?;
685701
self.governance_data_source_emitter_address
686-
.set(FixedBytes::from(
687-
claim_vm
688-
.body
689-
.emitter_address
690-
.as_slice()
691-
.try_into()
692-
.map_err(|_| PythReceiverError::InvalidEmitterAddress)?,
693-
));
702+
.set(FixedBytes::from(emitter_bytes));
694703

695704
let last_executed_governance_sequence = claim_vm.body.sequence.to::<u64>();
696705
self.last_executed_governance_sequence
@@ -739,10 +748,8 @@ fn parse_wormhole_proof(vaa: Vaa) -> Result<MerkleRoot<Keccak160>, PythReceiverE
739748
Ok(root)
740749
}
741750

742-
fn set_data_sources(&mut receiver: PythReceiver, data_sources: Vec<DataSource>) {
743-
receiver.valid_data_sources.erase(); // emptying the data sources
744-
receiver.is_valid_data_source.erase();
745-
751+
fn set_data_sources(receiver: &mut PythReceiver, data_sources: Vec<DataSource>) {
752+
746753
for data_source in data_sources {
747754
let mut storage_data_source = receiver.valid_data_sources.grow();
748755
storage_data_source.chain_id.set(data_source.chain_id);

0 commit comments

Comments
 (0)