Skip to content

Commit 3085997

Browse files
authored
refactor(target_chains/starknet): remove Result from reader (#1536)
1 parent 587a6fa commit 3085997

File tree

6 files changed

+97
-145
lines changed

6 files changed

+97
-145
lines changed

target_chains/starknet/contracts/src/hash.cairo

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,9 @@ pub impl HasherImpl of HasherTrait {
6363
// reader.len() < 8
6464
chunk_len = reader.len().try_into().expect(UNEXPECTED_OVERFLOW);
6565
}
66-
match reader.read_num_bytes(chunk_len) {
67-
Result::Ok(value) => {
68-
// chunk_len <= 8 so value must fit in u64.
69-
self.push_to_last(value.try_into().expect(UNEXPECTED_OVERFLOW), chunk_len);
70-
},
71-
Result::Err(err) => {
72-
result = Result::Err(err);
73-
break;
74-
},
75-
}
66+
let value = reader.read_num_bytes(chunk_len);
67+
// chunk_len <= 8 so value must fit in u64.
68+
self.push_to_last(value.try_into().expect(UNEXPECTED_OVERFLOW), chunk_len);
7669
};
7770
result
7871
}

target_chains/starknet/contracts/src/merkle_tree.cairo

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,13 @@ pub fn read_and_verify_proof(
4646
let mut message_reader = ReaderImpl::new(message.clone());
4747
let mut current_hash = leaf_hash(message_reader.clone()).map_err()?;
4848

49-
let proof_size = reader.read_u8().map_err()?;
49+
let proof_size = reader.read_u8();
5050
let mut i = 0;
5151

5252
let mut result = Result::Ok(());
5353
while i < proof_size {
54-
match reader.read_u160().map_err() {
55-
Result::Ok(sibling_digest) => {
56-
current_hash = node_hash(current_hash, sibling_digest);
57-
},
58-
Result::Err(err) => {
59-
result = Result::Err(err);
60-
break;
61-
},
62-
}
54+
let sibling_digest = reader.read_u160();
55+
current_hash = node_hash(current_hash, sibling_digest);
6356
i += 1;
6457
};
6558
result?;

target_chains/starknet/contracts/src/pyth.cairo

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -357,30 +357,30 @@ mod pyth {
357357
ref self: ContractState, data: ByteArray
358358
) -> Result<(), UpdatePriceFeedsError> {
359359
let mut reader = ReaderImpl::new(data);
360-
let x = reader.read_u32().map_err()?;
360+
let x = reader.read_u32();
361361
if x != ACCUMULATOR_MAGIC {
362362
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
363363
}
364-
if reader.read_u8().map_err()? != MAJOR_VERSION {
364+
if reader.read_u8() != MAJOR_VERSION {
365365
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
366366
}
367-
if reader.read_u8().map_err()? < MINIMUM_ALLOWED_MINOR_VERSION {
367+
if reader.read_u8() < MINIMUM_ALLOWED_MINOR_VERSION {
368368
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
369369
}
370370

371-
let trailing_header_size = reader.read_u8().map_err()?;
372-
reader.skip(trailing_header_size).map_err()?;
371+
let trailing_header_size = reader.read_u8();
372+
reader.skip(trailing_header_size);
373373

374-
let update_type: Option<UpdateType> = reader.read_u8().map_err()?.try_into();
374+
let update_type: Option<UpdateType> = reader.read_u8().try_into();
375375
match update_type {
376376
Option::Some(v) => match v {
377377
UpdateType::WormholeMerkle => {}
378378
},
379379
Option::None => { return Result::Err(UpdatePriceFeedsError::InvalidUpdateData); }
380380
};
381381

382-
let wh_proof_size = reader.read_u16().map_err()?;
383-
let wh_proof = reader.read_byte_array(wh_proof_size.into()).map_err()?;
382+
let wh_proof_size = reader.read_u16();
383+
let wh_proof = reader.read_byte_array(wh_proof_size.into());
384384
let wormhole = IWormholeDispatcher { contract_address: self.wormhole_address.read() };
385385
let vm = wormhole.parse_and_verify_vm(wh_proof).map_err()?;
386386

@@ -392,24 +392,24 @@ mod pyth {
392392
}
393393

394394
let mut payload_reader = ReaderImpl::new(vm.payload);
395-
let x = payload_reader.read_u32().map_err()?;
395+
let x = payload_reader.read_u32();
396396
if x != ACCUMULATOR_WORMHOLE_MAGIC {
397397
return Result::Err(UpdatePriceFeedsError::InvalidUpdateData);
398398
}
399399

400-
let update_type: Option<UpdateType> = payload_reader.read_u8().map_err()?.try_into();
400+
let update_type: Option<UpdateType> = payload_reader.read_u8().try_into();
401401
match update_type {
402402
Option::Some(v) => match v {
403403
UpdateType::WormholeMerkle => {}
404404
},
405405
Option::None => { return Result::Err(UpdatePriceFeedsError::InvalidUpdateData); }
406406
};
407407

408-
let _slot = payload_reader.read_u64().map_err()?;
409-
let _ring_size = payload_reader.read_u32().map_err()?;
410-
let root_digest = payload_reader.read_u160().map_err()?;
408+
let _slot = payload_reader.read_u64();
409+
let _ring_size = payload_reader.read_u32();
410+
let root_digest = payload_reader.read_u160();
411411

412-
let num_updates = reader.read_u8().map_err()?;
412+
let num_updates = reader.read_u8();
413413

414414
let total_fee = get_total_fee(ref self, num_updates);
415415
let fee_contract = IERC20CamelDispatcher {
@@ -451,27 +451,27 @@ mod pyth {
451451
fn read_and_verify_message(
452452
ref reader: Reader, root_digest: u256
453453
) -> Result<PriceFeedMessage, UpdatePriceFeedsError> {
454-
let message_size = reader.read_u16().map_err()?;
455-
let message = reader.read_byte_array(message_size.into()).map_err()?;
454+
let message_size = reader.read_u16();
455+
let message = reader.read_byte_array(message_size.into());
456456
read_and_verify_proof(root_digest, @message, ref reader).map_err()?;
457457

458458
let mut message_reader = ReaderImpl::new(message);
459-
let message_type: Option<MessageType> = message_reader.read_u8().map_err()?.try_into();
459+
let message_type: Option<MessageType> = message_reader.read_u8().try_into();
460460
match message_type {
461461
Option::Some(v) => match v {
462462
MessageType::PriceFeed => {}
463463
},
464464
Option::None => { return Result::Err(UpdatePriceFeedsError::InvalidUpdateData); }
465465
};
466466

467-
let price_id = message_reader.read_u256().map_err()?;
468-
let price = u64_as_i64(message_reader.read_u64().map_err()?);
469-
let conf = message_reader.read_u64().map_err()?;
470-
let expo = u32_as_i32(message_reader.read_u32().map_err()?);
471-
let publish_time = message_reader.read_u64().map_err()?;
472-
let prev_publish_time = message_reader.read_u64().map_err()?;
473-
let ema_price = u64_as_i64(message_reader.read_u64().map_err()?);
474-
let ema_conf = message_reader.read_u64().map_err()?;
467+
let price_id = message_reader.read_u256();
468+
let price = u64_as_i64(message_reader.read_u64());
469+
let conf = message_reader.read_u64();
470+
let expo = u32_as_i32(message_reader.read_u32());
471+
let publish_time = message_reader.read_u64();
472+
let prev_publish_time = message_reader.read_u64();
473+
let ema_price = u64_as_i64(message_reader.read_u64());
474+
let ema_conf = message_reader.read_u64();
475475

476476
let message = PriceFeedMessage {
477477
price_id, price, conf, expo, publish_time, prev_publish_time, ema_price, ema_conf,

target_chains/starknet/contracts/src/reader.cairo

Lines changed: 49 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -42,112 +42,77 @@ pub impl ReaderImpl of ReaderTrait {
4242
}
4343

4444
/// Reads the specified number of bytes (up to 16) as a big endian unsigned integer.
45-
fn read_num_bytes(ref self: Reader, num_bytes: u8) -> Result<u128, Error> {
45+
fn read_num_bytes(ref self: Reader, num_bytes: u8) -> u128 {
4646
assert!(num_bytes <= 16, "Reader::read_num_bytes: num_bytes is too large");
4747
if num_bytes <= self.num_current_bytes {
48-
let x = self.read_from_current(num_bytes);
49-
return Result::Ok(x);
48+
return self.read_from_current(num_bytes);
5049
}
5150
let num_low_bytes = num_bytes - self.num_current_bytes;
5251
let high = self.current;
53-
self.fetch_next()?;
54-
let low = self.read_num_bytes(num_low_bytes)?;
55-
let value = if num_low_bytes == 16 {
52+
self.fetch_next();
53+
let low = self.read_num_bytes(num_low_bytes);
54+
if num_low_bytes == 16 {
5655
low
5756
} else {
5857
high * one_shift_left_bytes_u128(num_low_bytes) + low
59-
};
60-
Result::Ok(value)
58+
}
6159
}
6260

63-
fn read_u256(ref self: Reader) -> Result<u256, Error> {
64-
let high = self.read_num_bytes(16)?;
65-
let low = self.read_num_bytes(16)?;
61+
fn read_u256(ref self: Reader) -> u256 {
62+
let high = self.read_num_bytes(16);
63+
let low = self.read_num_bytes(16);
6664
let value = u256 { high, low };
67-
Result::Ok(value)
65+
value
6866
}
69-
fn read_u160(ref self: Reader) -> Result<u256, Error> {
70-
let high = self.read_num_bytes(4)?;
71-
let low = self.read_num_bytes(16)?;
72-
let value = u256 { high, low };
73-
Result::Ok(value)
67+
fn read_u160(ref self: Reader) -> u256 {
68+
let high = self.read_num_bytes(4);
69+
let low = self.read_num_bytes(16);
70+
u256 { high, low }
7471
}
75-
fn read_u128(ref self: Reader) -> Result<u128, Error> {
72+
fn read_u128(ref self: Reader) -> u128 {
7673
self.read_num_bytes(16)
7774
}
78-
fn read_u64(ref self: Reader) -> Result<u64, Error> {
79-
let value = self.read_num_bytes(8)?.try_into().expect(UNEXPECTED_OVERFLOW);
80-
Result::Ok(value)
75+
fn read_u64(ref self: Reader) -> u64 {
76+
self.read_num_bytes(8).try_into().expect(UNEXPECTED_OVERFLOW)
8177
}
82-
fn read_u32(ref self: Reader) -> Result<u32, Error> {
83-
let value = self.read_num_bytes(4)?.try_into().expect(UNEXPECTED_OVERFLOW);
84-
Result::Ok(value)
78+
fn read_u32(ref self: Reader) -> u32 {
79+
self.read_num_bytes(4).try_into().expect(UNEXPECTED_OVERFLOW)
8580
}
86-
fn read_u16(ref self: Reader) -> Result<u16, Error> {
87-
let value = self.read_num_bytes(2)?.try_into().expect(UNEXPECTED_OVERFLOW);
88-
Result::Ok(value)
81+
fn read_u16(ref self: Reader) -> u16 {
82+
self.read_num_bytes(2).try_into().expect(UNEXPECTED_OVERFLOW)
8983
}
90-
fn read_u8(ref self: Reader) -> Result<u8, Error> {
91-
let value = self.read_num_bytes(1)?.try_into().expect(UNEXPECTED_OVERFLOW);
92-
Result::Ok(value)
84+
fn read_u8(ref self: Reader) -> u8 {
85+
self.read_num_bytes(1).try_into().expect(UNEXPECTED_OVERFLOW)
9386
}
9487

9588
// TODO: skip without calculating values
96-
fn skip(ref self: Reader, mut num_bytes: u8) -> Result<(), Error> {
97-
let mut result = Result::Ok(());
89+
fn skip(ref self: Reader, mut num_bytes: u8) {
9890
while num_bytes > 0 {
9991
if num_bytes > 16 {
100-
match self.read_num_bytes(16) {
101-
Result::Ok(_) => {},
102-
Result::Err(err) => {
103-
result = Result::Err(err);
104-
break;
105-
}
106-
}
92+
self.read_num_bytes(16);
10793
num_bytes -= 16;
10894
} else {
109-
match self.read_num_bytes(num_bytes) {
110-
Result::Ok(_) => {},
111-
Result::Err(err) => {
112-
result = Result::Err(err);
113-
break;
114-
}
115-
}
116-
break;
95+
self.read_num_bytes(num_bytes);
11796
}
118-
};
119-
result
97+
}
12098
}
12199

122100
/// Reads the specified number of bytes as a new byte array.
123-
fn read_byte_array(ref self: Reader, num_bytes: usize) -> Result<ByteArray, Error> {
101+
fn read_byte_array(ref self: Reader, num_bytes: usize) -> ByteArray {
124102
let mut array: Array<bytes31> = array![];
125-
let mut num_last_bytes = Option::None;
103+
let mut num_last_bytes = 0;
126104
let mut num_remaining_bytes = num_bytes;
127105
loop {
128-
let r = self.read_bytes_iteration(num_remaining_bytes, ref array);
129-
match r {
130-
Result::Ok((
131-
num_read, eof
132-
)) => {
133-
num_remaining_bytes -= num_read;
134-
if eof {
135-
num_last_bytes = Option::Some(Result::Ok(num_read));
136-
break;
137-
}
138-
},
139-
Result::Err(err) => {
140-
num_last_bytes = Option::Some(Result::Err(err));
141-
break;
142-
}
106+
let (num_read, eof) = self.read_bytes_iteration(num_remaining_bytes, ref array);
107+
num_remaining_bytes -= num_read;
108+
if eof {
109+
num_last_bytes = num_read;
110+
break;
143111
}
144112
};
145-
// `num_last_bytes` is always set to Some before break.
146-
let num_last_bytes = num_last_bytes.unwrap()?;
147113
// num_last_bytes < 31
148114
let num_last_bytes = num_last_bytes.try_into().expect(UNEXPECTED_OVERFLOW);
149-
let array = ByteArrayImpl::new(array, num_last_bytes);
150-
Result::Ok(array)
115+
ByteArrayImpl::new(array, num_last_bytes)
151116
}
152117

153118
/// Returns number of remaining bytes to read.
@@ -179,15 +144,18 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
179144
/// Replenishes `self.current` and `self.num_current_bytes`.
180145
/// This should only be called when all bytes from `self.current` has been read.
181146
/// Returns `EOF` error if no more data is available.
182-
fn fetch_next(ref self: Reader) -> Result<(), Error> {
147+
fn fetch_next(ref self: Reader) {
183148
match self.next {
184149
Option::Some(next) => {
185150
self.next = Option::None;
186151
self.current = next;
187152
self.num_current_bytes = 16;
188153
},
189154
Option::None => {
190-
let (value, bytes) = self.array.pop_front().ok_or(Error::UnexpectedEndOfInput)?;
155+
let (value, bytes) = self
156+
.array
157+
.pop_front()
158+
.expect(Error::UnexpectedEndOfInput.into());
191159
let value: u256 = value.into();
192160
if bytes > 16 {
193161
self.current = value.high;
@@ -199,33 +167,31 @@ impl ReaderPrivateImpl of ReaderPrivateTrait {
199167
}
200168
},
201169
}
202-
Result::Ok(())
203170
}
204171

205172
// Moved out from `read_bytes` because we cannot use `return` or `?` within a loop.
206173
fn read_bytes_iteration(
207174
ref self: Reader, num_bytes: usize, ref array: Array<bytes31>
208-
) -> Result<(usize, bool), Error> {
175+
) -> (usize, bool) {
209176
if num_bytes >= 31 {
210-
let high = self.read_num_bytes(15)?;
211-
let low = self.read_num_bytes(16)?;
177+
let high = self.read_num_bytes(15);
178+
let low = self.read_num_bytes(16);
212179
let value: felt252 = u256 { high, low }.try_into().expect(UNEXPECTED_OVERFLOW);
213180
array.append(value.try_into().expect(UNEXPECTED_OVERFLOW));
214-
Result::Ok((31, false))
181+
(31, false)
215182
} else if num_bytes > 16 {
216183
// num_bytes < 31
217-
let high = self
218-
.read_num_bytes((num_bytes - 16).try_into().expect(UNEXPECTED_OVERFLOW))?;
219-
let low = self.read_num_bytes(16)?;
184+
let high = self.read_num_bytes((num_bytes - 16).try_into().expect(UNEXPECTED_OVERFLOW));
185+
let low = self.read_num_bytes(16);
220186
let value: felt252 = u256 { high, low }.try_into().expect(UNEXPECTED_OVERFLOW);
221187
array.append(value.try_into().expect(UNEXPECTED_OVERFLOW));
222-
Result::Ok((num_bytes, true))
188+
(num_bytes, true)
223189
} else {
224190
// bytes < 16
225-
let low = self.read_num_bytes(num_bytes.try_into().expect(UNEXPECTED_OVERFLOW))?;
191+
let low = self.read_num_bytes(num_bytes.try_into().expect(UNEXPECTED_OVERFLOW));
226192
let value: felt252 = low.try_into().expect(UNEXPECTED_OVERFLOW);
227193
array.append(value.try_into().expect(UNEXPECTED_OVERFLOW));
228-
Result::Ok((num_bytes, true))
194+
(num_bytes, true)
229195
}
230196
}
231197
}

0 commit comments

Comments
 (0)