Skip to content

Commit 81142a1

Browse files
committed
Refactor load product
1 parent 460e125 commit 81142a1

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

program/rust/src/rust_oracle.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)