|
7 | 7 | pythnet_sdk::{
|
8 | 8 | accumulators::{merkle::MerkleAccumulator, Accumulator},
|
9 | 9 | hashers::keccak256_160::Keccak160,
|
| 10 | + publisher_stake_caps::StakeCapParameters, |
10 | 11 | wormhole::{AccumulatorSequenceTracker, MessageData, PostedMessageUnreliableData},
|
11 | 12 | },
|
12 | 13 | solana_measure::measure::Measure,
|
@@ -44,6 +45,12 @@ lazy_static! {
|
44 | 45 | .parse()
|
45 | 46 | .unwrap(),
|
46 | 47 | );
|
| 48 | + pub static ref STAKE_CAPS_PARAMETERS_ADDR: Pubkey = env_pubkey_or( |
| 49 | + "STAKE_CAPS_PARAMETERS_ADDR", |
| 50 | + "879ZVNagiWaAKsWDjGVf8pLq1wUBeBz7sREjUh3hrU36" |
| 51 | + .parse() |
| 52 | + .unwrap(), |
| 53 | + ); |
47 | 54 | }
|
48 | 55 |
|
49 | 56 | /// Accumulator specific error type. It would be nice to use `transaction::Error` but it does
|
@@ -121,6 +128,10 @@ pub fn get_accumulator_keys() -> Vec<(
|
121 | 128 | ("ACCUMULATOR_SEQUENCE_ADDR", Ok(*ACCUMULATOR_SEQUENCE_ADDR)),
|
122 | 129 | ("WORMHOLE_PID", Ok(*WORMHOLE_PID)),
|
123 | 130 | ("ORACLE_PID", Ok(*ORACLE_PID)),
|
| 131 | + ( |
| 132 | + "STAKE_CAPS_PARAMETERS_ADDR", |
| 133 | + Ok(*STAKE_CAPS_PARAMETERS_ADDR), |
| 134 | + ), |
124 | 135 | ]
|
125 | 136 | }
|
126 | 137 |
|
@@ -408,11 +419,16 @@ pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV
|
408 | 419 | measure.as_us()
|
409 | 420 | );
|
410 | 421 |
|
411 |
| - let mut measure = Measure::start("update_v2_aggregate_price"); |
412 |
| - |
413 | 422 | let mut any_v1_aggregations = false;
|
414 | 423 | let mut v2_messages = Vec::new();
|
415 | 424 |
|
| 425 | + if let Some(publisher_stake_caps_message) = compute_publisher_stake_caps(bank, &accounts) { |
| 426 | + info!("PublisherStakeCaps: Adding publisher stake caps to the accumulator"); |
| 427 | + v2_messages.push(publisher_stake_caps_message); |
| 428 | + } |
| 429 | + |
| 430 | + let mut measure = Measure::start("update_v2_aggregate_price"); |
| 431 | + |
416 | 432 | for (pubkey, mut account) in accounts {
|
417 | 433 | let mut price_account_data = account.data().to_owned();
|
418 | 434 |
|
@@ -446,3 +462,42 @@ pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV
|
446 | 462 |
|
447 | 463 | update_v1(bank, &v2_messages, any_v1_aggregations)
|
448 | 464 | }
|
| 465 | + |
| 466 | +pub fn compute_publisher_stake_caps( |
| 467 | + bank: &Bank, |
| 468 | + accounts: &[(Pubkey, AccountSharedData)], |
| 469 | +) -> Option<Vec<u8>> { |
| 470 | + let mut measure = Measure::start("compute_publisher_stake_caps"); |
| 471 | + |
| 472 | + let parameters: StakeCapParameters = { |
| 473 | + let data = bank |
| 474 | + .get_account_with_fixed_root(&STAKE_CAPS_PARAMETERS_ADDR) |
| 475 | + .unwrap_or_default(); |
| 476 | + let data = data.data(); |
| 477 | + solana_sdk::borsh::try_from_slice_unchecked(data).unwrap_or_default() |
| 478 | + }; |
| 479 | + |
| 480 | + let message = pyth_oracle::validator::compute_publisher_stake_caps( |
| 481 | + accounts.iter().map(|(_, account)| account.data()), |
| 482 | + bank.clock().unix_timestamp, |
| 483 | + parameters.m, |
| 484 | + parameters.z, |
| 485 | + ); |
| 486 | + |
| 487 | + measure.stop(); |
| 488 | + debug!( |
| 489 | + "PublisherStakeCaps: Computed publisher stake caps with m : {} and z : {} in {} us", |
| 490 | + parameters.m, |
| 491 | + parameters.z, |
| 492 | + measure.as_us() |
| 493 | + ); |
| 494 | + |
| 495 | + if bank |
| 496 | + .feature_set |
| 497 | + .is_active(&feature_set::add_publisher_stake_caps_to_the_accumulator::id()) |
| 498 | + { |
| 499 | + Some(message) |
| 500 | + } else { |
| 501 | + None |
| 502 | + } |
| 503 | +} |
0 commit comments