@@ -137,9 +137,6 @@ pub fn add_price(
137137 accounts : & [ AccountInfo ] ,
138138 instruction_data : & [ u8 ] ,
139139) -> OracleResult {
140- if instruction_data. len ( ) < size_of :: < cmd_add_price_t > ( ) {
141- return Err ( ProgramError :: InvalidArgument ) ;
142- }
143140 let cmd_args = load :: < cmd_add_price_t > ( instruction_data) ?;
144141
145142 if cmd_args. expo_ > PC_MAX_NUM_DECIMALS as i32
@@ -153,40 +150,29 @@ pub fn add_price(
153150 [ x, y, z]
154151 if valid_funding_account ( x)
155152 && valid_signable_account ( program_id, y, PC_PROD_ACC_SIZE as usize )
156- && valid_signable_account ( program_id, z, size_of :: < pc_price_t > ( ) ) =>
153+ && valid_signable_account ( program_id, z, size_of :: < pc_price_t > ( ) )
154+ && valid_fresh_account ( z) =>
157155 {
158156 Ok ( [ x, y, z] )
159157 }
160158 _ => Err ( ProgramError :: InvalidArgument ) ,
161159 } ?;
162160
163- let mut product_data = load_account_as_mut :: < pc_prod_t > ( product_account) ?;
164- {
165- let price_data = load_account_as :: < pc_price_t > ( price_account) ?;
166-
167- if product_data. magic_ != PC_MAGIC
168- || product_data. ver_ != cmd_args. ver_
169- || product_data. type_ != PC_ACCTYPE_PRODUCT
170- || price_data. magic_ != 0
171- {
172- return Err ( ProgramError :: InvalidArgument ) ;
173- }
174- }
161+ let mut product_data = load_product_account_mut ( product_account, cmd_args. ver_ ) ?;
175162
176163 clear_account ( price_account) ?;
177164
178- {
179- let mut price_data = load_account_as_mut :: < pc_price_t > ( price_account) ?;
180- price_data. magic_ = PC_MAGIC ;
181- price_data. ver_ = cmd_args. ver_ ;
182- price_data. type_ = PC_ACCTYPE_PRICE ;
183- price_data. size_ = ( size_of :: < pc_price_t > ( ) - size_of_val ( & price_data. comp_ ) ) as u32 ;
184- price_data. expo_ = cmd_args. expo_ ;
185- price_data. ptype_ = cmd_args. ptype_ ;
186- price_data. prod_ . k1_ = product_account. key . to_bytes ( ) ;
187- price_data. next_ = product_data. px_acc_ ;
188- product_data. px_acc_ . k1_ = price_account. key . to_bytes ( ) ;
189- }
165+ let mut price_data = load_account_as_mut :: < pc_price_t > ( price_account) ?;
166+ price_data. magic_ = PC_MAGIC ;
167+ price_data. ver_ = cmd_args. ver_ ;
168+ price_data. type_ = PC_ACCTYPE_PRICE ;
169+ price_data. size_ = ( size_of :: < pc_price_t > ( ) - size_of_val ( & price_data. comp_ ) ) as u32 ;
170+ price_data. expo_ = cmd_args. expo_ ;
171+ price_data. ptype_ = cmd_args. ptype_ ;
172+ price_data. prod_ . k1_ = product_account. key . to_bytes ( ) ;
173+ price_data. next_ = product_data. px_acc_ ;
174+ product_data. px_acc_ . k1_ = price_account. key . to_bytes ( ) ;
175+
190176 Ok ( SUCCESS )
191177}
192178
@@ -265,17 +251,16 @@ fn load_mapping_account_mut<'a>(
265251 account : & ' a AccountInfo ,
266252 expected_version : u32 ,
267253) -> Result < RefMut < ' a , pc_map_table_t > , ProgramError > {
268- let mapping_account_ref = load_account_as_mut :: < pc_map_table_t > ( account) ?;
269- let mapping_account = * mapping_account_ref;
254+ let mapping_data = load_account_as_mut :: < pc_map_table_t > ( account) ?;
270255
271256 pyth_assert (
272- mapping_account . magic_ == PC_MAGIC
273- && mapping_account . ver_ == expected_version
274- && mapping_account . type_ == PC_ACCTYPE_MAPPING ,
257+ mapping_data . magic_ == PC_MAGIC
258+ && mapping_data . ver_ == expected_version
259+ && mapping_data . type_ == PC_ACCTYPE_MAPPING ,
275260 ProgramError :: InvalidArgument ,
276261 ) ?;
277262
278- Ok ( mapping_account_ref )
263+ Ok ( mapping_data )
279264}
280265
281266/// Initialize account as a new mapping account. This function will zero out any existing data in
@@ -292,3 +277,19 @@ fn initialize_mapping_account(account: &AccountInfo, version: u32) -> Result<(),
292277
293278 Ok ( ( ) )
294279}
280+
281+ fn load_product_account_mut < ' a > (
282+ account : & ' a AccountInfo ,
283+ expected_version : u32 ,
284+ ) -> Result < RefMut < ' a , pc_prod_t > , ProgramError > {
285+ let product_data = load_account_as_mut :: < pc_prod_t > ( account) ?;
286+
287+ pyth_assert (
288+ product_data. magic_ == PC_MAGIC
289+ && product_data. ver_ == expected_version
290+ && product_data. type_ == PC_ACCTYPE_PRODUCT ,
291+ ProgramError :: InvalidArgument ,
292+ ) ?;
293+
294+ Ok ( product_data)
295+ }
0 commit comments