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 魔法豆

Download history 1420/week @ 2024-04-20 1424/week @ 2024-04-27 1375/week @ 2024-05-04 1470/week @ 2024-05-11 1594/week @ 2024-05-18 1552/week @ 2024-05-25 1983/week @ 2024-06-01 1429/week @ 2024-06-08 1360/week @ 2024-06-15 1470/week @ 2024-06-22 1472/week @ 2024-06-29 1459/week @ 2024-07-06 1986/week @ 2024-07-13 2510/week @ 2024-07-20 2215/week @ 2024-07-27 2066/week @ 2024-08-03

8,931 每月下载量
42 个 crate 中使用 (4 直接使用)

Apache-2.0

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(&eth_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 接收协议中的总存入金额,并在 0rate_discount_inital)和(deposits_endpointrate_discount_final)之间进行线性插值,以计算在 deposits 处的折扣。请注意,此函数根据提供的折扣和存入输入调整价格,但不会改变置信度。

要调整借入头寸的估值价格,协议可以类似地结合当前 Pyth 价格及其对流动性的估计,但现在使用的是 get_borrow_valuation_price 函数,而不是 get_collateral_valuation_price

依赖关系

~2.7–4MB
~71K SLoC