1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
pub mod structs;
pub use anchor_lang::prelude::*;
use solana_program::account_info::AccountInfo;
use solana_program::program_error::ProgramError;
use solana_program::pubkey::Pubkey;
use std::str::FromStr;
pub use structs::{AggregatorAccountData, SwitchboardDecimal, SwitchboardError};

declare_id!("3TSYZ3oXt9e42TdXFuYVaQyLP5ZX3fWtMhaQReHPau44");

const SWITCHBOARD_MAINNET_PID: &str = "5n43jDh58UzjqGE2sFuZPrkgx52BT6PWgcdL1CvBU9Ww";
const SWITCHBOARD_DEVNET_PID: &str = "5n43jDh58UzjqGE2sFuZPrkgx52BT6PWgcdL1CvBU9Ww";

pub fn get_aggregator_result_devnet(
    switchboard_feed: &AccountInfo,
) -> Result<SwitchboardDecimal, ProgramError> {
    let pid = Pubkey::from_str(&SWITCHBOARD_DEVNET_PID).unwrap();
    get_aggregator_result(switchboard_feed, &pid)
}

pub fn get_aggregator_result_mainnet(
    switchboard_feed: &AccountInfo,
) -> Result<SwitchboardDecimal, ProgramError> {
    let pid = Pubkey::from_str(&SWITCHBOARD_MAINNET_PID).unwrap();
    get_aggregator_result(switchboard_feed, &pid)
}

fn get_aggregator_result(
    switchboard_feed: &AccountInfo,
    program_id: &Pubkey,
) -> Result<SwitchboardDecimal, ProgramError> {
    let aggregator_account_loader =
        Loader::<AggregatorAccountData>::try_from(program_id, switchboard_feed)?;
    let aggregator = aggregator_account_loader.load()?;
    if aggregator.min_oracle_results > aggregator.latest_confirmed_round.num_success {
        return Err(ProgramError::from(SwitchboardError::InvalidAggregatorRound));
    }
    Ok(aggregator.latest_confirmed_round.result)
}