Skip to main content

Fetching Prices Using Rpc

If your requirements for calculating asset prices require a high grade of verifiability and leaves little room for client side calculation errors. You can fetch the prices for assets using the following on-chain rpc calls.

danger

These calls are currently not working on our mainnet and testnet, but will be supported in the 0.3.9 node release.

swaps.getSpotPrice()​

This method fetches the current spot price given an assetIn and and assetOut at a given block(default is current block).

(
poolId: u128 | Number | Uint8Array,
assetIn: ZeitgeistPrimitivesAsset | AssetId | string | Uint8Array,
assetOut: ZeitgeistPrimitivesAsset | AssetId | string | Uint8Array,
withFees: bool | boolean | Uint8Array,
at: Option<BlockHash> | null | Uint8Array | string,
) => Promise<u128>

Example​

Here we are fetching the price for the AssetId { CategoricalOutcome: [0, 0] } in *ZTG at the current best block not including the swap fees.

const sdk: Sdk<RpcContext> = await create(localhostRpc());

const price = await sdk.api.rpc.swaps.getSpotPrice(
0,
{ Ztg: null },
{ CategoricalOutcome: [0, 0] },
false,
null
);

console.log(new Decimal(price.toNumber()).div(ZTG).toNumber());

Full code snippet.

swaps.getSpotPrices()​

This method fetches the spot prices given an assetIn and and assetOut for a range of blocks.

Usefull when you need a graph of prices over a range of blocks.

(
poolId: u128 | Number | Uint8Array,
assetIn: ZeitgeistPrimitivesAsset | AssetId | string | Uint8Array,
assetOut: ZeitgeistPrimitivesAsset | AssetId | string | Uint8Array,
withFees: bool | boolean | Uint8Array,
blocks: Vec<u128> | Array<u128 | Number | Uint8Array>,
) => Promise<Vec<Balance>>

Example​

Here we are fetching the price for the AssetId { CategoricalOutcome: [0, 0] } in *ZTG for the blocks 55, 56 and 57 not including the swap fees.

const sdk: Sdk<RpcContext> = await create(localhostRpc());

const prices = await sdk.api.rpc.swaps.getSpotPrices(
0,
{ Ztg: null },
{ CategoricalOutcome: [0, 0] },
false,
[55, 56, 57]
);

prices.forEach((price) => {
console.log(new Decimal(price.toNumber()).div(ZTG).toNumber());
});

Full code snippet.