Skip to content

Commit 281e9d4

Browse files
committed
feat: combine v1 and v2 aggregation price feed messages in the merkle tree
1 parent 48d01f7 commit 281e9d4

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

runtime/src/bank/pyth_accumulator.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ pub fn get_accumulator_keys() -> Vec<(
131131
accumulator_pubkeys
132132
}
133133

134-
pub fn update_v1(
134+
pub fn update_v1<'a>(
135135
bank: &Bank,
136-
v2_messages: Vec<&[u8]>,
136+
v2_messages: Vec<&'a [u8]>,
137137
use_message_buffers: bool,
138138
) -> std::result::Result<(), AccumulatorUpdateErrorV1> {
139139
use {
@@ -214,8 +214,8 @@ pub fn update_v1(
214214
Vec::new()
215215
};
216216

217-
let mut messages = v1_messages;
218-
messages.extend(v2_messages);
217+
let mut messages = v2_messages;
218+
messages.extend(v1_messages);
219219

220220
// We now generate a Proof PDA (Owned by the System Program) to store the resulting Proof
221221
// Set. The derivation includes the ring buffer index to simulate a ring buffer in order
@@ -384,7 +384,8 @@ pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV
384384
.get_program_accounts(&oracle_pubkey, &ScanConfig::new(true))
385385
.map_err(AccumulatorUpdateErrorV1::GetProgramAccounts)?;
386386

387-
let mut any_legacy_mode = false;
387+
let mut any_v1_aggregations = false;
388+
let mut v2_messages = Vec::new();
388389

389390
// 3. Call Aggregation on Price Accounts.
390391
for (pubkey, mut account) in accounts {
@@ -394,26 +395,31 @@ pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV
394395
match pyth_oracle::validator::aggregate_price(
395396
bank.slot(),
396397
bank.clock().unix_timestamp,
398+
&pubkey.to_bytes().into(),
397399
&mut price_account_data,
398400
) {
399-
Ok(()) => {
400-
account.set_data(price_account_data);
401-
bank.store_account_and_update_capitalization(&pubkey, &account);
401+
Ok(outcome) => {
402+
if outcome.commit {
403+
account.set_data(price_account_data);
404+
bank.store_account_and_update_capitalization(&pubkey, &account);
405+
}
406+
v2_messages.extend(outcome.messages);
402407
}
403408
Err(err) => match err {
404409
AggregationError::NotPriceFeedAccount => {}
405-
AggregationError::LegacyAggregationMode => {
406-
any_legacy_mode = true;
407-
}
408-
AggregationError::NotTradingStatus => {
409-
trace!("Aggregation: failed to update_price_cumulative, {:?}", err);
410+
AggregationError::V1AggregationMode => {
411+
any_v1_aggregations = true;
410412
}
411413
},
412414
}
413415
}
414416

415417
// TODO: make new messages
416-
update_v1(bank, Vec::new(), any_legacy_mode)?;
418+
update_v1(
419+
bank,
420+
v2_messages.iter().map(|x| &**x).collect(),
421+
any_v1_aggregations,
422+
)?;
417423

418424
// 5. Merkleize the results.
419425

0 commit comments

Comments
 (0)