11 个不稳定版本 (4 个破坏性更新)
0.5.1 | 2022年5月3日 |
---|---|
0.5.0 | 2022年2月24日 |
0.4.0 | 2022年2月18日 |
0.3.0-beta.1 | 2021年12月29日 |
0.2.2 | 2021年7月12日 |
#10 in #pyth
1,389 每月下载次数
在 15 个crate中使用 (直接使用6个)
52KB
882 行
Pyth 客户端
此crate已弃用。请使用pyth-sdk-solana代替。pyth-sdk-solana提供与更易于使用的接口相同的所有功能。
此crate提供了从Solana网络上的pyth.network预言机读取价格数据的功能。该crate包含用于链上程序和链下示例程序的库。
该库的关键特性包括
- 获取50多个产品的当前价格,包括加密货币、美国股票、外汇等。
- 将列出的产品组合以创建新的价格数据,例如,用于代币篮子或非美元报价货币。
- 在链上Solana程序或链下应用程序中消耗价格。
有关pyth.network的更多信息,请参阅pyth.network 文档。
安装
在Cargo.toml中添加依赖项
[dependencies]
pyth-client="<version>"
如果您想将此库用于您的链上程序,您应使用no-entrypoint
特性以防止您的程序与此库的程序发生冲突。
[dependencies]
pyth-client = {version = "<version>", features = ["no-entrypoint"]}
请参阅crates.io上的pyth-client以获取库的最新版本。
用法
Pyth Network将其价格数据存储在一系列Solana账户中。此crate提供了解析和操作这些账户内容的功能。应用程序可以通过两种不同的方式获取这些账户的内容
- 链上程序应将这些账户传递给需要价格数据的指令。
- 链下程序可以使用Solana RPC客户端(例如在示例程序中)访问这些账户。
在这两种情况下,账户的内容将以二进制blob的形式提供给应用程序(Vec<u8>
)。以下示例假设用户已经获得了这些账户数据。
解析账户数据
Pyth网络有多种不同类型的账户
- 价格账户存储产品的当前价格
- 产品账户存储有关产品的元数据,例如其符号(例如,“BTC/USD”)。
- 映射账户存储所有Pyth账户的列表
有关不同类型Pyth账户的更多信息,请参阅账户结构文档。pyth.network网站还列出了账户的公钥(例如,BTC/USD账户)。
此库提供了一些load_*
方法,这些方法将每个账户中的二进制数据转换为适当的结构体
// replace with account data, either passed to on-chain program or from RPC node
let price_account_data: Vec<u8> = ...;
let price_account: Price = load_price( &price_account_data ).unwrap();
let product_account_data: Vec<u8> = ...;
let product_account: Product = load_product( &product_account_data ).unwrap();
let mapping_account_data: Vec<u8> = ...;
let mapping_account: Mapping = load_mapping( &mapping_account_data ).unwrap();
获取当前价格
从Price
账户中读取当前价格
let price: PriceConf = price_account.get_current_price().unwrap();
println!("price: ({} +- {}) x 10^{}", price.price, price.conf, price.expo);
返回的价格包括一个置信区间,表示价格的不确定性程度。这两个值都表示为定点数,a * 10^e
。如果价格当前不可用,则方法将返回None
。
价格源的状态决定了价格是否可用。您可以使用以下方法获取当前状态
let price_status: PriceStatus = price_account.get_current_price_status();
非USD价格
Pyth中的大多数资产都以USD计价。应用程序可以将两个USD价格结合起来,以不同的报价货币计价资产
let btc_usd: Price = ...;
let eth_usd: Price = ...;
// -8 is the desired exponent for the result
let btc_eth: PriceConf = btc_usd.get_price_in_quote(ð_usd, -8);
println!("BTC/ETH price: ({} +- {}) x 10^{}", price.price, price.conf, price.expo);
计价一篮子资产
应用程序还可以计算多个资产篮子的价值
let btc_usd: Price = ...;
let eth_usd: Price = ...;
// Quantity of each asset in fixed-point a * 10^e.
// This represents 0.1 BTC and .05 ETH.
// -8 is desired exponent for result
let basket_price: PriceConf = Price::price_basket(&[
(btc_usd, 10, -2),
(eth_usd, 5, -2)
], -8);
println!("0.1 BTC and 0.05 ETH are worth: ({} +- {}) x 10^{} USD",
basket_price.price, basket_price.conf, basket_price.expo);
此函数还将价格的不确定性传播到篮子价值的不确定性中。
链下示例程序
示例程序打印了Pyth在Solana devnet上的产品参考数据和当前价格信息。运行以下命令尝试此示例程序
cargo build --examples
cargo run --example get_accounts
此命令的输出是Pyth账户的列表,例如
product_account ............ 6MEwdxe4g1NeAF9u6KDG14anJpFsVEa2cvr5H6iriFZ8
symbol.................... SRM/USD
asset_type................ Crypto
quote_currency............ USD
description............... SRM/USD
generic_symbol............ SRMUSD
base...................... SRM
price_account ............ 992moaMQKs32GKZ9dxi8keyM2bUmbrwBZpK4p2K6X5Vs
price .................. 7398000000
conf ................... 3200000
price_type ............. price
exponent ............... -9
status ................. trading
corp_act ............... nocorpact
num_qt ................. 1
valid_slot ............. 91340924
publish_slot ........... 91340925
ema_price .............. 7426390900
ema_confidence ......... 2259870
开发
此库可以构建为您的本地平台或BPF(由Solana程序使用)。使用cargo build
/ cargo test
以本地方式构建和测试。使用cargo build-bpf
/ cargo test-bpf
在BPF中构建Solana;这些命令需要您已安装Solana CLI工具。
BPF测试还将运行一个指令计数程序,该程序记录各种库函数的资源消耗。您也可以使用cargo test-bpf --test instruction_count
单独运行此程序。
发布
要发布此包的新版本,请执行以下步骤
- 在
Cargo.toml
中增加版本号。您可以使用带有-beta.x
后缀的版本号,例如0.0.1-beta.0
来创建可选测试版本。 - 将您的更改合并到github上的
main
分支。 - 创建并发布一个新的github版本。版本名称应与版本号相同,标签应使用前缀为
v
的版本号。发布版本将触发github动作,自动将pyth-client rust crate发布到crates.io
。
依赖项
~17–25MB
~437K SLoC