Skip to content

Commit 42b64ac

Browse files
authored
refactor(target_chains/starknet): remove Result from merkle_tree and pyth setters (#1548)
* refactor(target_chains/starknet): remove Result from merkle_tree * refactor(target_chains/starknet): remove Result from pyth contract setters
1 parent 55cbe62 commit 42b64ac

File tree

3 files changed

+59
-75
lines changed

3 files changed

+59
-75
lines changed

target_chains/starknet/contracts/src/merkle_tree.cairo

+15-11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use super::reader::{Reader, ReaderImpl};
33
use super::byte_array::ByteArray;
44
use super::util::ONE_SHIFT_96;
55
use core::cmp::{min, max};
6+
use core::panic_with_felt252;
67

78
const MERKLE_LEAF_PREFIX: u8 = 0;
89
const MERKLE_NODE_PREFIX: u8 = 1;
@@ -14,6 +15,15 @@ pub enum MerkleVerificationError {
1415
DigestMismatch,
1516
}
1617

18+
impl MerkleVerificationErrorIntoFelt252 of Into<MerkleVerificationError, felt252> {
19+
fn into(self: MerkleVerificationError) -> felt252 {
20+
match self {
21+
MerkleVerificationError::Reader(err) => err.into(),
22+
MerkleVerificationError::DigestMismatch => 'digest mismatch',
23+
}
24+
}
25+
}
26+
1727
#[generate_trait]
1828
impl ResultReaderToMerkleVerification<T> of ResultReaderToMerkleVerificationTrait<T> {
1929
fn map_err(self: Result<T, pyth::reader::Error>) -> Result<T, MerkleVerificationError> {
@@ -24,12 +34,11 @@ impl ResultReaderToMerkleVerification<T> of ResultReaderToMerkleVerificationTrai
2434
}
2535
}
2636

27-
fn leaf_hash(mut reader: Reader) -> Result<u256, super::reader::Error> {
37+
fn leaf_hash(mut reader: Reader) -> u256 {
2838
let mut hasher = HasherImpl::new();
2939
hasher.push_u8(MERKLE_LEAF_PREFIX);
3040
hasher.push_reader(ref reader);
31-
let hash = hasher.finalize() / ONE_SHIFT_96;
32-
Result::Ok(hash)
41+
hasher.finalize() / ONE_SHIFT_96
3342
}
3443

3544
fn node_hash(a: u256, b: u256) -> u256 {
@@ -40,25 +49,20 @@ fn node_hash(a: u256, b: u256) -> u256 {
4049
hasher.finalize() / ONE_SHIFT_96
4150
}
4251

43-
pub fn read_and_verify_proof(
44-
root_digest: u256, message: @ByteArray, ref reader: Reader
45-
) -> Result<(), MerkleVerificationError> {
52+
pub fn read_and_verify_proof(root_digest: u256, message: @ByteArray, ref reader: Reader) {
4653
let mut message_reader = ReaderImpl::new(message.clone());
47-
let mut current_hash = leaf_hash(message_reader.clone()).map_err()?;
54+
let mut current_hash = leaf_hash(message_reader.clone());
4855

4956
let proof_size = reader.read_u8();
5057
let mut i = 0;
5158

52-
let mut result = Result::Ok(());
5359
while i < proof_size {
5460
let sibling_digest = reader.read_u160();
5561
current_hash = node_hash(current_hash, sibling_digest);
5662
i += 1;
5763
};
58-
result?;
5964

6065
if root_digest != current_hash {
61-
return Result::Err(MerkleVerificationError::DigestMismatch);
66+
panic_with_felt252(MerkleVerificationError::DigestMismatch.into());
6267
}
63-
Result::Ok(())
6468
}

target_chains/starknet/contracts/src/pyth.cairo

+43-63
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ pub use pyth::{Event, PriceFeedUpdateEvent};
99
pub trait IPyth<T> {
1010
fn get_price_unsafe(self: @T, price_id: u256) -> Result<Price, GetPriceUnsafeError>;
1111
fn get_ema_price_unsafe(self: @T, price_id: u256) -> Result<Price, GetPriceUnsafeError>;
12-
fn set_data_sources(
13-
ref self: T, sources: Array<DataSource>
14-
) -> Result<(), GovernanceActionError>;
15-
fn set_fee(ref self: T, single_update_fee: u256) -> Result<(), GovernanceActionError>;
16-
fn update_price_feeds(ref self: T, data: ByteArray) -> Result<(), UpdatePriceFeedsError>;
12+
fn set_data_sources(ref self: T, sources: Array<DataSource>);
13+
fn set_fee(ref self: T, single_update_fee: u256);
14+
fn update_price_feeds(ref self: T, data: ByteArray);
1715
}
1816

1917
#[derive(Copy, Drop, Debug, Serde, PartialEq)]
@@ -333,51 +331,44 @@ mod pyth {
333331
Result::Ok(price)
334332
}
335333

336-
fn set_data_sources(
337-
ref self: ContractState, sources: Array<DataSource>
338-
) -> Result<(), GovernanceActionError> {
334+
fn set_data_sources(ref self: ContractState, sources: Array<DataSource>) {
339335
if self.owner.read() != get_caller_address() {
340-
return Result::Err(GovernanceActionError::AccessDenied);
336+
panic_with_felt252(GovernanceActionError::AccessDenied.into());
341337
}
342338
write_data_sources(ref self, sources);
343-
Result::Ok(())
344339
}
345340

346-
fn set_fee(
347-
ref self: ContractState, single_update_fee: u256
348-
) -> Result<(), GovernanceActionError> {
341+
fn set_fee(ref self: ContractState, single_update_fee: u256) {
349342
if self.owner.read() != get_caller_address() {
350-
return Result::Err(GovernanceActionError::AccessDenied);
343+
panic_with_felt252(GovernanceActionError::AccessDenied.into());
351344
}
352345
self.single_update_fee.write(single_update_fee);
353-
Result::Ok(())
354346
}
355347

356-
fn update_price_feeds(
357-
ref self: ContractState, data: ByteArray
358-
) -> Result<(), UpdatePriceFeedsError> {
348+
fn update_price_feeds(ref self: ContractState, data: ByteArray) {
359349
let mut reader = ReaderImpl::new(data);
360350
let x = reader.read_u32();
361351
if x != ACCUMULATOR_MAGIC {
362-
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
352+
panic_with_felt252(UpdatePriceFeedsError::InvalidUpdateData.into());
363353
}
364354
if reader.read_u8() != MAJOR_VERSION {
365-
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
355+
panic_with_felt252(UpdatePriceFeedsError::InvalidUpdateData.into());
366356
}
367357
if reader.read_u8() < MINIMUM_ALLOWED_MINOR_VERSION {
368-
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
358+
panic_with_felt252(UpdatePriceFeedsError::InvalidUpdateData.into());
369359
}
370360

371361
let trailing_header_size = reader.read_u8();
372362
reader.skip(trailing_header_size);
373363

374-
let update_type: Option<UpdateType> = reader.read_u8().try_into();
364+
let update_type: UpdateType = reader
365+
.read_u8()
366+
.try_into()
367+
.expect(UpdatePriceFeedsError::InvalidUpdateData.into());
368+
375369
match update_type {
376-
Option::Some(v) => match v {
377-
UpdateType::WormholeMerkle => {}
378-
},
379-
Option::None => { return Result::Err(UpdatePriceFeedsError::InvalidUpdateData); }
380-
};
370+
UpdateType::WormholeMerkle => {}
371+
}
381372

382373
let wh_proof_size = reader.read_u16();
383374
let wh_proof = reader.read_byte_array(wh_proof_size.into());
@@ -388,22 +379,23 @@ mod pyth {
388379
emitter_chain_id: vm.emitter_chain_id, emitter_address: vm.emitter_address
389380
};
390381
if !self.is_valid_data_source.read(source) {
391-
return Result::Err(UpdatePriceFeedsError::InvalidUpdateDataSource);
382+
panic_with_felt252(UpdatePriceFeedsError::InvalidUpdateDataSource.into());
392383
}
393384

394385
let mut payload_reader = ReaderImpl::new(vm.payload);
395386
let x = payload_reader.read_u32();
396387
if x != ACCUMULATOR_WORMHOLE_MAGIC {
397-
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
388+
panic_with_felt252(UpdatePriceFeedsError::InvalidUpdateData.into());
398389
}
399390

400-
let update_type: Option<UpdateType> = payload_reader.read_u8().try_into();
391+
let update_type: UpdateType = payload_reader
392+
.read_u8()
393+
.try_into()
394+
.expect(UpdatePriceFeedsError::InvalidUpdateData.into());
395+
401396
match update_type {
402-
Option::Some(v) => match v {
403-
UpdateType::WormholeMerkle => {}
404-
},
405-
Option::None => { return Result::Err(UpdatePriceFeedsError::InvalidUpdateData); }
406-
};
397+
UpdateType::WormholeMerkle => {}
398+
}
407399

408400
let _slot = payload_reader.read_u64();
409401
let _ring_size = payload_reader.read_u32();
@@ -419,50 +411,39 @@ mod pyth {
419411
let caller = execution_info.caller_address;
420412
let contract = execution_info.contract_address;
421413
if fee_contract.allowance(caller, contract) < total_fee {
422-
return Result::Err(UpdatePriceFeedsError::InsufficientFeeAllowance);
414+
panic_with_felt252(UpdatePriceFeedsError::InsufficientFeeAllowance.into());
423415
}
424416
if !fee_contract.transferFrom(caller, contract, total_fee) {
425-
return Result::Err(UpdatePriceFeedsError::InsufficientFeeAllowance);
417+
panic_with_felt252(UpdatePriceFeedsError::InsufficientFeeAllowance.into());
426418
}
427419

428420
let mut i = 0;
429-
let mut result = Result::Ok(());
430421
while i < num_updates {
431-
let r = read_and_verify_message(ref reader, root_digest);
432-
match r {
433-
Result::Ok(message) => { update_latest_price_if_necessary(ref self, message); },
434-
Result::Err(err) => {
435-
result = Result::Err(err);
436-
break;
437-
}
438-
}
422+
let message = read_and_verify_message(ref reader, root_digest);
423+
update_latest_price_if_necessary(ref self, message);
439424
i += 1;
440425
};
441-
result?;
442426

443427
if reader.len() != 0 {
444-
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
428+
panic_with_felt252(UpdatePriceFeedsError::InvalidUpdateData.into());
445429
}
446-
447-
Result::Ok(())
448430
}
449431
}
450432

451-
fn read_and_verify_message(
452-
ref reader: Reader, root_digest: u256
453-
) -> Result<PriceFeedMessage, UpdatePriceFeedsError> {
433+
fn read_and_verify_message(ref reader: Reader, root_digest: u256) -> PriceFeedMessage {
454434
let message_size = reader.read_u16();
455435
let message = reader.read_byte_array(message_size.into());
456-
read_and_verify_proof(root_digest, @message, ref reader).map_err()?;
436+
read_and_verify_proof(root_digest, @message, ref reader);
457437

458438
let mut message_reader = ReaderImpl::new(message);
459-
let message_type: Option<MessageType> = message_reader.read_u8().try_into();
439+
let message_type: MessageType = message_reader
440+
.read_u8()
441+
.try_into()
442+
.expect(UpdatePriceFeedsError::InvalidUpdateData.into());
443+
460444
match message_type {
461-
Option::Some(v) => match v {
462-
MessageType::PriceFeed => {}
463-
},
464-
Option::None => { return Result::Err(UpdatePriceFeedsError::InvalidUpdateData); }
465-
};
445+
MessageType::PriceFeed => {}
446+
}
466447

467448
let price_id = message_reader.read_u256();
468449
let price = u64_as_i64(message_reader.read_u64());
@@ -473,10 +454,9 @@ mod pyth {
473454
let ema_price = u64_as_i64(message_reader.read_u64());
474455
let ema_conf = message_reader.read_u64();
475456

476-
let message = PriceFeedMessage {
457+
PriceFeedMessage {
477458
price_id, price, conf, expo, publish_time, prev_publish_time, ema_price, ema_conf,
478-
};
479-
Result::Ok(message)
459+
}
480460
}
481461

482462
fn update_latest_price_if_necessary(ref self: ContractState, message: PriceFeedMessage) {

target_chains/starknet/contracts/tests/pyth.cairo

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ fn update_price_feeds_works() {
5555
let mut spy = spy_events(SpyOn::One(pyth.contract_address));
5656

5757
start_prank(CheatTarget::One(pyth.contract_address), user.try_into().unwrap());
58-
pyth.update_price_feeds(good_update1()).unwrap_with_felt252();
58+
pyth.update_price_feeds(good_update1());
5959
stop_prank(CheatTarget::One(pyth.contract_address));
6060

6161
spy.fetch_events();

0 commit comments

Comments
 (0)