|
| 1 | +use crate::error::PythReceiverError; |
| 2 | +use crate::structs::DataSource; |
1 | 3 | use alloc::vec::Vec;
|
2 | 4 | use stylus_sdk::alloy_primitives::{Address, FixedBytes, U16};
|
3 |
| -use crate::structs::DataSource; |
4 |
| -use crate::error::PythReceiverError; |
5 | 5 |
|
6 | 6 | const MAGIC: u32 = 0x5054474d;
|
7 | 7 | const MODULE_TARGET: u8 = 1;
|
@@ -98,12 +98,16 @@ pub fn parse_instruction(payload: Vec<u8>) -> Result<GovernanceInstruction, Pyth
|
98 | 98 |
|
99 | 99 | let mut cursor = 0;
|
100 | 100 |
|
101 |
| - let magic = u32::from_be_bytes([ |
102 |
| - payload[cursor], |
103 |
| - payload[cursor + 1], |
104 |
| - payload[cursor + 2], |
105 |
| - payload[cursor + 3], |
106 |
| - ]); |
| 101 | + let magic_bytes = payload |
| 102 | + .get(cursor..cursor + 4) |
| 103 | + .ok_or(PythReceiverError::InvalidGovernanceMessage)?; |
| 104 | + |
| 105 | + let magic = u32::from_be_bytes( |
| 106 | + magic_bytes |
| 107 | + .try_into() |
| 108 | + .map_err(|_| PythReceiverError::InvalidGovernanceMessage)?, |
| 109 | + ); |
| 110 | + |
107 | 111 | cursor += 4;
|
108 | 112 |
|
109 | 113 | if magic != MAGIC {
|
@@ -145,12 +149,16 @@ pub fn parse_instruction(payload: Vec<u8>) -> Result<GovernanceInstruction, Pyth
|
145 | 149 | if payload.len() < cursor + 4 {
|
146 | 150 | return Err(PythReceiverError::InvalidGovernanceMessage);
|
147 | 151 | }
|
148 |
| - let governance_data_source_index = u32::from_be_bytes([ |
149 |
| - payload[cursor], |
150 |
| - payload[cursor + 1], |
151 |
| - payload[cursor + 2], |
152 |
| - payload[cursor + 3], |
153 |
| - ]); |
| 152 | + let governance_data_source_bytes = payload |
| 153 | + .get(cursor..cursor + 4) |
| 154 | + .ok_or(PythReceiverError::InvalidGovernanceMessage)?; |
| 155 | + |
| 156 | + let governance_data_source_index = u32::from_be_bytes( |
| 157 | + governance_data_source_bytes |
| 158 | + .try_into() |
| 159 | + .map_err(|_| PythReceiverError::InvalidGovernanceMessage)?, |
| 160 | + ); |
| 161 | + |
154 | 162 | cursor += 4;
|
155 | 163 | GovernancePayload::RequestGovernanceDataSourceTransfer(
|
156 | 164 | RequestGovernanceDataSourceTransfer {
|
@@ -188,58 +196,59 @@ pub fn parse_instruction(payload: Vec<u8>) -> Result<GovernanceInstruction, Pyth
|
188 | 196 | if payload.len() < cursor + 16 {
|
189 | 197 | return Err(PythReceiverError::InvalidGovernanceMessage);
|
190 | 198 | }
|
191 |
| - let value = u64::from_be_bytes([ |
192 |
| - payload[cursor], |
193 |
| - payload[cursor + 1], |
194 |
| - payload[cursor + 2], |
195 |
| - payload[cursor + 3], |
196 |
| - payload[cursor + 4], |
197 |
| - payload[cursor + 5], |
198 |
| - payload[cursor + 6], |
199 |
| - payload[cursor + 7], |
200 |
| - ]); |
| 199 | + let fee_value_bytes = payload |
| 200 | + .get(cursor..cursor + 8) |
| 201 | + .ok_or(PythReceiverError::InvalidGovernanceMessage)?; |
| 202 | + |
| 203 | + let value = u64::from_be_bytes( |
| 204 | + fee_value_bytes |
| 205 | + .try_into() |
| 206 | + .map_err(|_| PythReceiverError::InvalidGovernanceMessage)?, |
| 207 | + ); |
| 208 | + |
201 | 209 | cursor += 8;
|
202 |
| - let expo = u64::from_be_bytes([ |
203 |
| - payload[cursor], |
204 |
| - payload[cursor + 1], |
205 |
| - payload[cursor + 2], |
206 |
| - payload[cursor + 3], |
207 |
| - payload[cursor + 4], |
208 |
| - payload[cursor + 5], |
209 |
| - payload[cursor + 6], |
210 |
| - payload[cursor + 7], |
211 |
| - ]); |
| 210 | + |
| 211 | + let expo_bytes = payload |
| 212 | + .get(cursor..cursor + 8) |
| 213 | + .ok_or(PythReceiverError::InvalidGovernanceMessage)?; |
| 214 | + let expo = u64::from_be_bytes( |
| 215 | + expo_bytes |
| 216 | + .try_into() |
| 217 | + .map_err(|_| PythReceiverError::InvalidGovernanceMessage)?, |
| 218 | + ); |
| 219 | + |
212 | 220 | cursor += 8;
|
213 | 221 | GovernancePayload::SetFee(SetFee { value, expo })
|
214 | 222 | }
|
215 | 223 | GovernanceAction::SetFeeInToken => {
|
216 | 224 | if payload.len() < cursor + 17 {
|
217 | 225 | return Err(PythReceiverError::InvalidGovernanceMessage);
|
218 | 226 | }
|
219 |
| - let value = u64::from_be_bytes([ |
220 |
| - payload[cursor], |
221 |
| - payload[cursor + 1], |
222 |
| - payload[cursor + 2], |
223 |
| - payload[cursor + 3], |
224 |
| - payload[cursor + 4], |
225 |
| - payload[cursor + 5], |
226 |
| - payload[cursor + 6], |
227 |
| - payload[cursor + 7], |
228 |
| - ]); |
| 227 | + |
| 228 | + let fee_token_value = payload |
| 229 | + .get(cursor..cursor + 8) |
| 230 | + .ok_or(PythReceiverError::InvalidGovernanceMessage)?; |
| 231 | + |
| 232 | + let value = u64::from_be_bytes( |
| 233 | + fee_token_value |
| 234 | + .try_into() |
| 235 | + .map_err(|_| PythReceiverError::InvalidGovernanceMessage)?, |
| 236 | + ); |
229 | 237 | cursor += 8;
|
230 |
| - let expo = u64::from_be_bytes([ |
231 |
| - payload[cursor], |
232 |
| - payload[cursor + 1], |
233 |
| - payload[cursor + 2], |
234 |
| - payload[cursor + 3], |
235 |
| - payload[cursor + 4], |
236 |
| - payload[cursor + 5], |
237 |
| - payload[cursor + 6], |
238 |
| - payload[cursor + 7], |
239 |
| - ]); |
| 238 | + |
| 239 | + let expo_bytes = payload |
| 240 | + .get(cursor..cursor + 8) |
| 241 | + .ok_or(PythReceiverError::InvalidGovernanceMessage)?; |
| 242 | + let expo = u64::from_be_bytes( |
| 243 | + expo_bytes |
| 244 | + .try_into() |
| 245 | + .map_err(|_| PythReceiverError::InvalidGovernanceMessage)?, |
| 246 | + ); |
240 | 247 | cursor += 8;
|
| 248 | + |
241 | 249 | let token_len = payload[cursor];
|
242 | 250 | cursor += 1;
|
| 251 | + |
243 | 252 | if token_len != 20 {
|
244 | 253 | return Err(PythReceiverError::InvalidGovernanceMessage);
|
245 | 254 | }
|
|
0 commit comments