Struct pyth_sdk_solana::Price
source · [−]Expand description
A price with a degree of uncertainty, represented as a price +- a confidence interval.
The confidence interval roughly corresponds to the standard error of a normal distribution.
Both the price and confidence are stored in a fixed-point numeric representation, x * 10^expo
, where expo
is the exponent. For example:
use pyth_sdk::Price;
Price { price: 12345, conf: 267, expo: -2 }; // represents 123.45 +- 2.67
Price { price: 123, conf: 1, expo: 2 }; // represents 12300 +- 100
Price
supports a limited set of mathematical operations. All of these operations will
propagate any uncertainty in the arguments into the result. However, the uncertainty in the
result may overestimate the true uncertainty (by at most a factor of sqrt(2)
) due to
computational limitations. Furthermore, all of these operations may return None
if their
result cannot be represented within the numeric representation (e.g., the exponent is so
small that the price does not fit into an i64). Users of these methods should (1) select
their exponents to avoid this problem, and (2) handle the None
case gracefully.
Fields
price: i64
Price.
conf: u64
Confidence Interval.
expo: i32
Exponent.
Implementations
sourceimpl Price
impl Price
sourcepub fn get_price_in_quote(&self, quote: &Price, result_expo: i32) -> Option<Price>
pub fn get_price_in_quote(&self, quote: &Price, result_expo: i32) -> Option<Price>
Get the current price of this account in a different quote currency.
If this account represents the price of the product X/Z, and quote
represents the price
of the product Y/Z, this method returns the price of X/Y. Use this method to get the
price of e.g., mSOL/SOL from the mSOL/USD and SOL/USD accounts.
result_expo
determines the exponent of the result, i.e., the number of digits below the
decimal point. This method returns None
if either the price or confidence are too
large to be represented with the requested exponent.
Example:
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);
sourcepub fn price_basket(
amounts: &[(Price, i64, i32)],
result_expo: i32
) -> Option<Price>
pub fn price_basket(
amounts: &[(Price, i64, i32)],
result_expo: i32
) -> Option<Price>
Get the price of a basket of currencies.
Each entry in amounts
is of the form (price, qty, qty_expo)
, and the result is the sum
of price * qty * 10^qty_expo
. The result is returned with exponent result_expo
.
An example use case for this function is to get the value of an LP token.
Example:
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);
sourcepub fn div(&self, other: &Price) -> Option<Price>
pub fn div(&self, other: &Price) -> Option<Price>
Divide this price by other
while propagating the uncertainty in both prices into the
result.
This method will automatically select a reasonable exponent for the result. If both
self
and other
are normalized, the exponent is self.expo + PD_EXPO - other.expo
(i.e., the fraction has PD_EXPO
digits of additional precision). If they are not
normalized, this method will normalize them, resulting in an unpredictable result
exponent. If the result is used in a context that requires a specific exponent,
please call scale_to_exponent
on it.
sourcepub fn add(&self, other: &Price) -> Option<Price>
pub fn add(&self, other: &Price) -> Option<Price>
Add other
to this, propagating uncertainty in both prices.
Requires both Price
s to have the same exponent – use scale_to_exponent
on
the arguments if necessary.
TODO: could generalize this method to support different exponents.
sourcepub fn cmul(&self, c: i64, e: i32) -> Option<Price>
pub fn cmul(&self, c: i64, e: i32) -> Option<Price>
Multiply this Price
by a constant c * 10^e
.
sourcepub fn mul(&self, other: &Price) -> Option<Price>
pub fn mul(&self, other: &Price) -> Option<Price>
Multiply this Price
by other
, propagating any uncertainty.
sourcepub fn normalize(&self) -> Option<Price>
pub fn normalize(&self) -> Option<Price>
Get a copy of this struct where the price and confidence
have been normalized to be between MIN_PD_V_I64
and MAX_PD_V_I64
.
sourcepub fn scale_to_exponent(&self, target_expo: i32) -> Option<Price>
pub fn scale_to_exponent(&self, target_expo: i32) -> Option<Price>
Scale this price/confidence so that its exponent is target_expo
.
Return None
if this number is outside the range of numbers representable in target_expo
,
which will happen if target_expo
is too small.
Warning: if target_expo
is significantly larger than the current exponent, this
function will return 0 +- 0.
Trait Implementations
sourceimpl BorshDeserialize for Price where
i64: BorshDeserialize,
u64: BorshDeserialize,
i32: BorshDeserialize,
impl BorshDeserialize for Price where
i64: BorshDeserialize,
u64: BorshDeserialize,
i32: BorshDeserialize,
sourceimpl BorshSerialize for Price where
i64: BorshSerialize,
u64: BorshSerialize,
i32: BorshSerialize,
impl BorshSerialize for Price where
i64: BorshSerialize,
u64: BorshSerialize,
i32: BorshSerialize,
sourceimpl<'de> Deserialize<'de> for Price
impl<'de> Deserialize<'de> for Price
sourcefn deserialize<__D>(
__deserializer: __D
) -> Result<Price, <__D as Deserializer<'de>>::Error> where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D
) -> Result<Price, <__D as Deserializer<'de>>::Error> where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
sourceimpl JsonSchema for Price
impl JsonSchema for Price
sourcefn schema_name() -> String
fn schema_name() -> String
The name of the generated JSON Schema. Read more
sourcefn json_schema(gen: &mut SchemaGenerator) -> Schema
fn json_schema(gen: &mut SchemaGenerator) -> Schema
Generates a JSON Schema for this type. Read more
fn is_referenceable() -> bool
fn is_referenceable() -> bool
Whether JSON Schemas generated for this type should be re-used where possible using the $ref
keyword. Read more
sourceimpl PartialEq<Price> for Price
impl PartialEq<Price> for Price
sourceimpl Serialize for Price
impl Serialize for Price
sourcefn serialize<__S>(
&self,
__serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error> where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error> where
__S: Serializer,
Serialize this value into the given Serde serializer. Read more
impl Copy for Price
impl Eq for Price
impl StructuralEq for Price
impl StructuralPartialEq for Price
Auto Trait Implementations
impl RefUnwindSafe for Price
impl Send for Price
impl Sync for Price
impl Unpin for Price
impl UnwindSafe for Price
Blanket Implementations
impl<T> AbiEnumVisitor for T where
T: Serialize + ?Sized,
impl<T> AbiEnumVisitor for T where
T: Serialize + ?Sized,
default fn visit_for_abi(
&self,
_digester: &mut AbiDigester
) -> Result<AbiDigester, DigestError>
impl<T> AbiEnumVisitor for T where
T: Serialize + AbiExample + ?Sized,
impl<T> AbiEnumVisitor for T where
T: Serialize + AbiExample + ?Sized,
default fn visit_for_abi(
&self,
digester: &mut AbiDigester
) -> Result<AbiDigester, DigestError>
impl<T> AbiExample for T
impl<T> AbiExample for T
default fn example() -> T
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more