#switchboard #solana #oracle

switchboard-v2

用于与 Switchboard V2 账户交互的 Rust 库

27 个版本

0.4.0 2023年6月20日
0.2.0 2023年6月20日
0.1.23 2023年3月16日
0.1.17 2022年12月19日
0.1.8 2022年3月3日

#1788 in 魔法豆

Download history 351/week @ 2024-04-08 440/week @ 2024-04-15 433/week @ 2024-04-22 307/week @ 2024-04-29 145/week @ 2024-05-06 248/week @ 2024-05-13 392/week @ 2024-05-20 365/week @ 2024-05-27 351/week @ 2024-06-03 313/week @ 2024-06-10 244/week @ 2024-06-17 295/week @ 2024-06-24 216/week @ 2024-07-01 252/week @ 2024-07-08 360/week @ 2024-07-15 442/week @ 2024-07-22

1,292 每月下载量
psyoracleutils 中使用

MIT 许可证

115KB
2.5K SLoC

2023年6月12日 - 已弃用,改用 switchboard-solana 包。

Switchboard Logo

switchboard-v2

用于与 Solana 上的 Switchboard 账户交互的 Rust 库。

Crates.io

安装

在您的项目目录中运行以下 Cargo 命令

cargo add switchboard-v2

或者在您的 Cargo.toml 中添加以下行

[dependencies]
switchboard-v2 = "0.3.0"

用法

目录

读取最新结果

读取链上的聚合器结果

use anchor_lang::solana_program::clock;
use std::convert::TryInto;
use switchboard_v2::{AggregatorAccountData, SwitchboardDecimal, SWITCHBOARD_PROGRAM_ID};

// check feed owner
let owner = *aggregator.owner;
if owner != SWITCHBOARD_PROGRAM_ID {
  return Err(error!(ErrorCode::InvalidSwitchboardAccount));
}

// deserialize account info
let feed = ctx.accounts.aggregator.load()?;
// OR
let feed = AggregatorAccountData::new(feed_account_info)?;

// get result
let decimal: f64 = feed.get_result()?.try_into()?;

// check if feed has been updated in the last 5 minutes
feed.check_staleness(clock::Clock::get().unwrap().unix_timestamp, 300)?;

// check if feed exceeds a confidence interval of +/i $0.80
feed.check_confidence_interval(SwitchboardDecimal::from_f64(0.80))?;

读取历史缓冲区

注意:在使用之前,聚合器必须初始化历史缓冲区

use switchboard_v2::AggregatorHistoryBuffer;
use std::convert::TryInto;

let history_buffer = AggregatorHistoryBuffer::new(history_account_info)?;
let current_timestamp = Clock::get()?.unix_timestamp;
let one_hour_ago: f64 = history_buffer.lower_bound(current_timestamp - 3600).unwrap().try_into()?;

读取 VRF

use switchboard_v2::VrfAccountData;

// deserialize the account info
let vrf = ctx.accounts.vrf.load()?;
// OR
let vrf = VrfAccountData::new(vrf_account_info)?;

// read the result
let result_buffer = vrf.get_result()?;
let value: &[u128] = bytemuck::cast_slice(&result_buffer[..]);
let result = value[0] % 256000 as u128;

请求随机性 CPI

pub use switchboard_v2::{VrfAccountData, VrfRequestRandomness};

let switchboard_program = ctx.accounts.switchboard_program.to_account_info();

let vrf_request_randomness = VrfRequestRandomness {
  authority: ctx.accounts.state.to_account_info(),
  vrf: ctx.accounts.vrf.to_account_info(),
  oracle_queue: ctx.accounts.oracle_queue.to_account_info(),
  queue_authority: ctx.accounts.queue_authority.to_account_info(),
  data_buffer: ctx.accounts.data_buffer.to_account_info(),
  permission: ctx.accounts.permission.to_account_info(),
  escrow: ctx.accounts.escrow.clone(),
  payer_wallet: ctx.accounts.payer_wallet.clone(),
  payer_authority: ctx.accounts.payer_authority.to_account_info(),
  recent_blockhashes: ctx.accounts.recent_blockhashes.to_account_info(),
  program_state: ctx.accounts.program_state.to_account_info(),
  token_program: ctx.accounts.token_program.to_account_info(),
};

let vrf_key = ctx.accounts.vrf.key.clone();
let authority_key = ctx.accounts.authority.key.clone();

let state_seeds: &[&[&[u8]]] = &[&[
  &STATE_SEED,
  vrf_key.as_ref(),
  authority_key.as_ref(),
  &[bump],
]];
msg!("requesting randomness");
vrf_request_randomness.invoke_signed(
  switchboard_program,
  params.switchboard_state_bump,
  params.permission_bump,
  state_seeds,
)?;

读取缓冲区中继

use anchor_lang::solana_program::clock;
use std::convert::TryInto;
use switchboard_v2::{BufferRelayerAccountData, SWITCHBOARD_PROGRAM_ID};

// check feed owner
let owner = *aggregator.owner;
if owner != SWITCHBOARD_PROGRAM_ID {
  return Err(error!(ErrorCode::InvalidSwitchboardAccount));
}

// deserialize account info
let buffer = BufferRelayerAccountData::new(feed_account_info)?;

// get result
let buffer_result = buffer.get_result();

// check if feed has been updated in the last 5 minutes
buffer.check_staleness(clock::Clock::get().unwrap().unix_timestamp, 300)?;

// convert buffer to a string
let result_string = String::from_utf8(buffer.result)
  .map_err(|_| error!(ErrorCode::StringConversionFailed))?;
msg!("Buffer string {:?}!", result_string);

依赖项

~19–28MB
~465K SLoC