11 个版本 (7 个重大更改)
0.8.0 | 2023 年 7 月 7 日 |
---|---|
0.7.0 | 2022 年 12 月 7 日 |
0.6.1 | 2022 年 9 月 2 日 |
0.5.0 | 2022 年 8 月 18 日 |
0.1.0 | 2022 年 3 月 14 日 |
#231 in 魔法豆
8,931 每月下载量
在 42 个 crate 中使用 (4 直接使用)
95KB
2K SLoC
Pyth 网络通用 Rust SDK
此 crate 包含 Pyth 网络数据结构,这些结构在所有基于 Rust 的 Pyth 网络数据消费者中共享。此 crate 通常与特定平台 crate(如上所述)结合使用,例如 pyth-sdk-solana。
用法
SDK 有两种核心数据类型
PriceFeed
是一个容器,用于存储关于产品(例如,BTC/USD)的所有当前可用定价信息。Price
表示一个具有不确定程度的定价。
此 SDK 的典型用法是首先检索您应用程序所需的关于一个或多个产品的 PriceFeed
。此步骤通常使用上述平台特定 crate 之一,这些 crate 提供特定区块链的检索方法。一旦您有了 PriceFeed
,您就可以调用以下方法之一来获取您应用程序所需的定价
获取当前价格
从其 PriceFeed
获取产品的当前价格
const STALENESS_THRESHOLD : u64 = 60; // staleness threshold in seconds
let current_timestamp = ...;
let current_price: Price = price_feed.get_price_no_older_than(current_timestamp, STALENESS_THRESHOLD).ok_or(StdError::not_found("Current price is not available"))?;
println!("price: ({} +- {}) x 10^{}", current_price.price, current_price.conf, current_price.expo);
价格与表示价格不确定程度的置信区间一同返回。这两个值都表示为定点数,a * 10^e
。如果当前价格不可用,该方法将返回 None
。
请参阅消费者最佳实践指南,以获取有关如何消费 Pyth Network 价格的额外建议,例如如何使用置信区间,以及如果价格当前不可用时应做什么。
EMA 价格
PriceFeed
包含一个指数加权移动平均(EMA)价格,它表示最近价格的时平均。EMA 价格可以按以下方式检索
const STALENESS_THRESHOLD : u64 = 60; // staleness threshold in seconds
let current_timestamp = ...;
let ema_price: Price = price_feed.get_ema_price_no_older_than(current_timestamp, STALENESS_THRESHOLD).ok_or(StdError::not_found("EMA price is not available"))?;
println!("price: ({} +- {}) x 10^{}", ema_price.price, ema_price.conf, ema_price.expo);
操纵价格
Price
结构支持算术运算,允许您将来自多个产品的价格组合起来。这些运算可以用来对在 Pyth Network 上未直接列出的一些产品进行定价
非美元价格
Pyth Network 上列出的大多数资产都是按美元报价的,例如,BTC/USD 价格提供器提供每 BTC 的美元数量。但是,某些应用程序希望以其他报价货币表示价格,例如每 BTC 的 ETH 数量。应用程序可以将两个美元价格组合起来,以不同报价货币定价资产
let btc_usd: Price = ...;
let eth_usd: Price = ...;
// -8 is the desired exponent for the result
let btc_eth: Price = 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: Price = 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);
此操作对于定价很有用,例如,由两种基础货币支持的 LP 令牌。
使用流动性调整价格
应用程序可以将 Pyth 价格调整以纳入大额头寸的市场影响和流动性,因为大额头寸的有效交易价格与中间价和订单簿价格不同。假设应用程序希望根据 1000 BTC 以 10% 的折扣(中间价的 90%)出售的事实来评估卖出 100 BTC 的有效执行价格,如果假设市场影响与售出数量成正比,则应用程序可以将当前 Pyth 价格及其流动性视图结合起来,以计算调整后的价格
let btc_usd: Price = ...;
// deposits is the total number of tokens deposited in the protocol
let deposits: u64 = 100;
// deposits_endpoint represents the token deposits at which rate_discount_final kicks in
let deposits_endpoint: u64 = 1000;
// rate_discount_initial and _final are percentages, expressed in fixed point as x * 10^discount_exponent.
// E.g. 50 with discount_exponent = -2 is 50%.
let rate_discount_initial: u64 = 100;
let rate_discount_final: u64 = 90;
let discount_exponent: i32 = 2;
let price_collateral: Price = btc_usd.get_collateral_valuation_price(
deposits,
deposits_endpoint,
rate_discount_initial,
rate_discount_final,
discount_exponent).ok_or(StdError::not_found("Issue with querying collateral price"))?;
println!("The valuation price for the collateral given {} tokens deposited is ({} +- {}) x 10^{} USD",
deposits, price_collateral.price, price_collateral.conf, price_collateral.expo);
在这里,deposits
表示存入的总抵押品金额。 get_collateral_valuation_price
接收协议中的总存入金额,并在 0
,rate_discount_inital
)和(deposits_endpoint
,rate_discount_final
)之间进行线性插值,以计算在 deposits
处的折扣。请注意,此函数根据提供的折扣和存入输入调整价格,但不会改变置信度。
要调整借入头寸的估值价格,协议可以类似地结合当前 Pyth 价格及其对流动性的估计,但现在使用的是 get_borrow_valuation_price
函数,而不是 get_collateral_valuation_price
。
依赖关系
~2.7–4MB
~71K SLoC