From 9191ecec099a2aa1dc43f7547655796acdb10d57 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Thu, 9 Jan 2025 14:18:50 -0500 Subject: [PATCH 01/16] layout --- pages/_meta.json | 5 ++ pages/express-relay/_meta.json | 4 +- pages/home/_meta.json | 5 ++ pages/home/index.mdx | 1 + pages/lazer/_meta.json | 49 ++++++++++++++++++++ pages/lazer/getting-started.mdx | 3 ++ pages/lazer/index.md | 6 +++ pages/lazer/integrate-as-consumer.mdx | 3 ++ pages/lazer/integrate-as-consumer/_meta.json | 4 ++ pages/lazer/integrate-as-consumer/evm.mdx | 0 pages/lazer/integrate-as-consumer/svm.mdx | 0 pages/lazer/integrate-as-publisher.mdx | 3 ++ pages/lazer/price-feeds.mdx | 1 + 13 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 pages/lazer/_meta.json create mode 100644 pages/lazer/getting-started.mdx create mode 100644 pages/lazer/index.md create mode 100644 pages/lazer/integrate-as-consumer.mdx create mode 100644 pages/lazer/integrate-as-consumer/_meta.json create mode 100644 pages/lazer/integrate-as-consumer/evm.mdx create mode 100644 pages/lazer/integrate-as-consumer/svm.mdx create mode 100644 pages/lazer/integrate-as-publisher.mdx create mode 100644 pages/lazer/price-feeds.mdx diff --git a/pages/_meta.json b/pages/_meta.json index 2518e2ca..604a1d83 100644 --- a/pages/_meta.json +++ b/pages/_meta.json @@ -9,6 +9,11 @@ "type": "page" }, + "lazer": { + "title": "Lazer", + "type": "page" + }, + "benchmarks": { "title": "Benchmarks", "type": "page" diff --git a/pages/express-relay/_meta.json b/pages/express-relay/_meta.json index cb3ab5d1..9a599732 100644 --- a/pages/express-relay/_meta.json +++ b/pages/express-relay/_meta.json @@ -15,8 +15,8 @@ "type": "separator" }, - "integrate-as-protocol": "Integrate as a Protocol", - "integrate-as-searcher": "Integrate as a Searcher", + "integrate-as-consumer": "Integrate as a Consumer", + "integrate-as-publisher": "Integrate as a Publisher", "-- Reference Material": { "title": "Reference Material", diff --git a/pages/home/_meta.json b/pages/home/_meta.json index cb30232f..b67ff895 100644 --- a/pages/home/_meta.json +++ b/pages/home/_meta.json @@ -11,6 +11,11 @@ "href": "/price-feeds" }, + "Lazer": { + "title": "Lazer →", + "href": "/lazer" + }, + "Benchmarks": { "title": "Benchmarks →", "href": "/benchmarks" diff --git a/pages/home/index.mdx b/pages/home/index.mdx index edc7353b..c6a2c16b 100644 --- a/pages/home/index.mdx +++ b/pages/home/index.mdx @@ -8,6 +8,7 @@ Pyth Network offers several products for developers: - [Price Feeds](../price-feeds) provide real-time prices for 500+ assets on 55+ blockchain ecosystems, including Solana, many EVM chains, Aptos, Sui, NEAR, and several Cosmos chains. +- [Lazer](../lazer) [TODO] - [Benchmarks](../benchmarks) provides historical Pyth prices for both on- and off-chain use. - [Express Relay](../express-relay/) enables protocols to eliminate their MEV while gaining access to active searchers and liquidators. - [Entropy](../entropy) allows developers to generate secure random numbers on the blockchain. diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json new file mode 100644 index 00000000..bf892d8c --- /dev/null +++ b/pages/lazer/_meta.json @@ -0,0 +1,49 @@ +{ + "documentation-home": { + "title": "← Documentation Home", + "href": "/home" + }, + + "-- Lazer": { + "title": "Lazer", + "type": "separator" + }, + "index": "Introduction", + "getting-started": "Getting Started", + + "-- How-to Guides": { + "title": "How-To Guides", + "type": "separator" + }, + + "integrate-as-consumer": "Integrate as a Consumer", + "integrate-as-publisher": "Integrate as a Publisher", + + "-- Reference Material": { + "title": "Reference Material", + "type": "separator" + }, + "price-feeds": "Price Feeds", + + "api-reference": { + "title": "HTTP API Reference ↗", + "href": "TODO:", + "newWindow": true + }, + + "websocket-api-reference": "Websocket API Reference", + "contract-addresses": "Contract Addresses", + + "errors": "Error Codes", + "examples": { + "title": "Example Application ↗", + "href": "https://github.com/pyth-network/pyth-examples/tree/main/lazer", + "newWindow": true + }, + "-- Understand Lazer": { + "title": "Understanding Lazer", + "type": "separator" + }, + + "how-lazer-works": "How Lazer Works" +} diff --git a/pages/lazer/getting-started.mdx b/pages/lazer/getting-started.mdx new file mode 100644 index 00000000..0c5ea3f5 --- /dev/null +++ b/pages/lazer/getting-started.mdx @@ -0,0 +1,3 @@ +# Getting Started with Pyth Lazer + +TODO: Fill this up. diff --git a/pages/lazer/index.md b/pages/lazer/index.md new file mode 100644 index 00000000..36e86c5d --- /dev/null +++ b/pages/lazer/index.md @@ -0,0 +1,6 @@ +# Lazer + +TODO: Fill this up. + + +TODO: Add a banner up to get a access token. \ No newline at end of file diff --git a/pages/lazer/integrate-as-consumer.mdx b/pages/lazer/integrate-as-consumer.mdx new file mode 100644 index 00000000..7a9ee87a --- /dev/null +++ b/pages/lazer/integrate-as-consumer.mdx @@ -0,0 +1,3 @@ +# How to Integrate Pyth Lazer as a Consumer + +TODO: Fill this up. diff --git a/pages/lazer/integrate-as-consumer/_meta.json b/pages/lazer/integrate-as-consumer/_meta.json new file mode 100644 index 00000000..f2756ae9 --- /dev/null +++ b/pages/lazer/integrate-as-consumer/_meta.json @@ -0,0 +1,4 @@ +{ + "evm": "EVM chains", + "svm": "SVM chains" +} diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/lazer/integrate-as-consumer/svm.mdx b/pages/lazer/integrate-as-consumer/svm.mdx new file mode 100644 index 00000000..e69de29b diff --git a/pages/lazer/integrate-as-publisher.mdx b/pages/lazer/integrate-as-publisher.mdx new file mode 100644 index 00000000..dac6c3f7 --- /dev/null +++ b/pages/lazer/integrate-as-publisher.mdx @@ -0,0 +1,3 @@ +# How to Integrate Pyth Lazer as a Publisher + +TODO: Fill this up. diff --git a/pages/lazer/price-feeds.mdx b/pages/lazer/price-feeds.mdx new file mode 100644 index 00000000..3dd68bd7 --- /dev/null +++ b/pages/lazer/price-feeds.mdx @@ -0,0 +1 @@ +# Price Feeds \ No newline at end of file From 01d5a32992bff17a7d0a54ca8e895affc8aa6574 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Thu, 9 Jan 2025 16:57:56 -0500 Subject: [PATCH 02/16] table --- components/LazerPriceIdTable.tsx | 93 ++++++++++++++++++++++++++++++++ pages/lazer/price-feeds.mdx | 6 ++- 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 components/LazerPriceIdTable.tsx diff --git a/components/LazerPriceIdTable.tsx b/components/LazerPriceIdTable.tsx new file mode 100644 index 00000000..fbcbf18f --- /dev/null +++ b/components/LazerPriceIdTable.tsx @@ -0,0 +1,93 @@ +import { useEffect, useState } from "react"; +import { StyledTd } from "./Table"; + + + +const fetchLazerPriceIdMetadata = async () => { + const response = await fetch("https://pyth-lazer-staging.dourolabs.app/history/v1/symbols"); + const data = await response.json(); + return data; +} + +type LazerPriceIdMetadata = { + asset_type: string; + description: string; + exponent: number; + name: string; + pyth_lazer_id: number; + symbol: string; +} + +enum LazerPriceIdStateType { + NotLoaded, + Loading, + Loaded, + Error, +} + +const LazerPriceIdState = { + NotLoaded: () => ({ type: LazerPriceIdStateType.NotLoaded as const }), + Loading: () => ({ type: LazerPriceIdStateType.Loading as const }), + Loaded: (priceFeeds: LazerPriceIdMetadata[]) => ({ + type: LazerPriceIdStateType.Loaded as const, + priceFeeds, + }), + Error: (error: unknown) => ({ + type: LazerPriceIdStateType.Error as const, + error, + }), +}; + +type LazerPriceIdState = ReturnType; + +const useLazerPriceIdState = () => { + const [state, setState] = useState(LazerPriceIdState.NotLoaded()); + + useEffect(() => { + setState(LazerPriceIdState.Loading()); + fetchLazerPriceIdMetadata().then(priceFeeds => setState(LazerPriceIdState.Loaded(priceFeeds))) + .catch(error => setState(LazerPriceIdState.Error(error))); + }, []); + + return state; +} + +export function LazerPriceIdTable() { + const lazerPriceIdState = useLazerPriceIdState(); + + switch (lazerPriceIdState.type) { + case LazerPriceIdStateType.NotLoaded: + return
Loading...
; + case LazerPriceIdStateType.Loading: + return
Loading...
; + case LazerPriceIdStateType.Loaded: + return ( + + + + + + + + + + + + + {lazerPriceIdState.priceFeeds.map(priceFeed => ( + + {priceFeed.asset_type} + {priceFeed.description} + {priceFeed.name} + {priceFeed.symbol} + {priceFeed.pyth_lazer_id} + {priceFeed.exponent} + + ))} + +
Asset TypeDescriptionNameSymbolPyth Lazer IdExponent
+ ) + case LazerPriceIdStateType.Error: + return
Error
; + } +} \ No newline at end of file diff --git a/pages/lazer/price-feeds.mdx b/pages/lazer/price-feeds.mdx index 3dd68bd7..805fef2a 100644 --- a/pages/lazer/price-feeds.mdx +++ b/pages/lazer/price-feeds.mdx @@ -1 +1,5 @@ -# Price Feeds \ No newline at end of file +import {LazerPriceIdTable} from "../../components/LazerPriceIdTable"; + +# Lazer Price Feeds + + From 18c57aa2a08bbe8e883044e8fd4aa4e01f900f93 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Thu, 9 Jan 2025 17:01:06 -0500 Subject: [PATCH 03/16] pre-commit --- components/LazerPriceIdTable.tsx | 137 ++++++++++++++++--------------- pages/express-relay/_meta.json | 4 +- pages/lazer/_meta.json | 4 +- pages/lazer/index.md | 5 +- pages/lazer/price-feeds.mdx | 2 +- 5 files changed, 78 insertions(+), 74 deletions(-) diff --git a/components/LazerPriceIdTable.tsx b/components/LazerPriceIdTable.tsx index fbcbf18f..19dccae8 100644 --- a/components/LazerPriceIdTable.tsx +++ b/components/LazerPriceIdTable.tsx @@ -1,22 +1,22 @@ import { useEffect, useState } from "react"; import { StyledTd } from "./Table"; - - const fetchLazerPriceIdMetadata = async () => { - const response = await fetch("https://pyth-lazer-staging.dourolabs.app/history/v1/symbols"); - const data = await response.json(); - return data; -} + const response = await fetch( + "https://pyth-lazer-staging.dourolabs.app/history/v1/symbols" + ); + const data = await response.json(); + return data; +}; type LazerPriceIdMetadata = { - asset_type: string; - description: string; - exponent: number; - name: string; - pyth_lazer_id: number; - symbol: string; -} + asset_type: string; + description: string; + exponent: number; + name: string; + pyth_lazer_id: number; + symbol: string; +}; enum LazerPriceIdStateType { NotLoaded, @@ -26,68 +26,73 @@ enum LazerPriceIdStateType { } const LazerPriceIdState = { - NotLoaded: () => ({ type: LazerPriceIdStateType.NotLoaded as const }), - Loading: () => ({ type: LazerPriceIdStateType.Loading as const }), - Loaded: (priceFeeds: LazerPriceIdMetadata[]) => ({ - type: LazerPriceIdStateType.Loaded as const, - priceFeeds, - }), - Error: (error: unknown) => ({ + NotLoaded: () => ({ type: LazerPriceIdStateType.NotLoaded as const }), + Loading: () => ({ type: LazerPriceIdStateType.Loading as const }), + Loaded: (priceFeeds: LazerPriceIdMetadata[]) => ({ + type: LazerPriceIdStateType.Loaded as const, + priceFeeds, + }), + Error: (error: unknown) => ({ type: LazerPriceIdStateType.Error as const, error, }), }; -type LazerPriceIdState = ReturnType; +type LazerPriceIdState = ReturnType< + typeof LazerPriceIdState[keyof typeof LazerPriceIdState] +>; const useLazerPriceIdState = () => { - const [state, setState] = useState(LazerPriceIdState.NotLoaded()); + const [state, setState] = useState( + LazerPriceIdState.NotLoaded() + ); - useEffect(() => { - setState(LazerPriceIdState.Loading()); - fetchLazerPriceIdMetadata().then(priceFeeds => setState(LazerPriceIdState.Loaded(priceFeeds))) - .catch(error => setState(LazerPriceIdState.Error(error))); - }, []); + useEffect(() => { + setState(LazerPriceIdState.Loading()); + fetchLazerPriceIdMetadata() + .then((priceFeeds) => setState(LazerPriceIdState.Loaded(priceFeeds))) + .catch((error) => setState(LazerPriceIdState.Error(error))); + }, []); - return state; -} + return state; +}; export function LazerPriceIdTable() { - const lazerPriceIdState = useLazerPriceIdState(); + const lazerPriceIdState = useLazerPriceIdState(); - switch (lazerPriceIdState.type) { - case LazerPriceIdStateType.NotLoaded: - return
Loading...
; - case LazerPriceIdStateType.Loading: - return
Loading...
; - case LazerPriceIdStateType.Loaded: - return ( - - - - - - - - - - - - - {lazerPriceIdState.priceFeeds.map(priceFeed => ( - - {priceFeed.asset_type} - {priceFeed.description} - {priceFeed.name} - {priceFeed.symbol} - {priceFeed.pyth_lazer_id} - {priceFeed.exponent} - - ))} - -
Asset TypeDescriptionNameSymbolPyth Lazer IdExponent
- ) - case LazerPriceIdStateType.Error: - return
Error
; - } -} \ No newline at end of file + switch (lazerPriceIdState.type) { + case LazerPriceIdStateType.NotLoaded: + return
Loading...
; + case LazerPriceIdStateType.Loading: + return
Loading...
; + case LazerPriceIdStateType.Loaded: + return ( + + + + + + + + + + + + + {lazerPriceIdState.priceFeeds.map((priceFeed) => ( + + {priceFeed.asset_type} + {priceFeed.description} + {priceFeed.name} + {priceFeed.symbol} + {priceFeed.pyth_lazer_id} + {priceFeed.exponent} + + ))} + +
Asset TypeDescriptionNameSymbolPyth Lazer IdExponent
+ ); + case LazerPriceIdStateType.Error: + return
Error
; + } +} diff --git a/pages/express-relay/_meta.json b/pages/express-relay/_meta.json index 9a599732..cb3ab5d1 100644 --- a/pages/express-relay/_meta.json +++ b/pages/express-relay/_meta.json @@ -15,8 +15,8 @@ "type": "separator" }, - "integrate-as-consumer": "Integrate as a Consumer", - "integrate-as-publisher": "Integrate as a Publisher", + "integrate-as-protocol": "Integrate as a Protocol", + "integrate-as-searcher": "Integrate as a Searcher", "-- Reference Material": { "title": "Reference Material", diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json index bf892d8c..67041e66 100644 --- a/pages/lazer/_meta.json +++ b/pages/lazer/_meta.json @@ -30,10 +30,10 @@ "href": "TODO:", "newWindow": true }, - + "websocket-api-reference": "Websocket API Reference", "contract-addresses": "Contract Addresses", - + "errors": "Error Codes", "examples": { "title": "Example Application ↗", diff --git a/pages/lazer/index.md b/pages/lazer/index.md index 36e86c5d..d739cc4c 100644 --- a/pages/lazer/index.md +++ b/pages/lazer/index.md @@ -1,6 +1,5 @@ # Lazer -TODO: Fill this up. +TODO: Fill this up. - -TODO: Add a banner up to get a access token. \ No newline at end of file +TODO: Add a banner up to get a access token. diff --git a/pages/lazer/price-feeds.mdx b/pages/lazer/price-feeds.mdx index 805fef2a..9ac2fb3a 100644 --- a/pages/lazer/price-feeds.mdx +++ b/pages/lazer/price-feeds.mdx @@ -1,4 +1,4 @@ -import {LazerPriceIdTable} from "../../components/LazerPriceIdTable"; +import { LazerPriceIdTable } from "../../components/LazerPriceIdTable"; # Lazer Price Feeds From 4dfbdd53cda313ec2b5963c6b6a602a0e225e410 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 13 Jan 2025 12:34:22 -0500 Subject: [PATCH 04/16] temp --- pages/lazer/integrate-as-consumer/_meta.json | 4 +-- pages/lazer/integrate-as-consumer/evm.mdx | 29 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/pages/lazer/integrate-as-consumer/_meta.json b/pages/lazer/integrate-as-consumer/_meta.json index f2756ae9..6d90f4eb 100644 --- a/pages/lazer/integrate-as-consumer/_meta.json +++ b/pages/lazer/integrate-as-consumer/_meta.json @@ -1,4 +1,4 @@ { - "evm": "EVM chains", - "svm": "SVM chains" + "evm": "on EVM chains", + "svm": "on SVM chains" } diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx index e69de29b..e3f8b228 100644 --- a/pages/lazer/integrate-as-consumer/evm.mdx +++ b/pages/lazer/integrate-as-consumer/evm.mdx @@ -0,0 +1,29 @@ +import { Callout, Tabs, Steps } from "nextra/components"; + +# Integrate Pyth Lazer as a Consumer on EVM chains + +This guide is intended to serve for users who wants to consume prices from the Pyth Lazer price feed on EVM chains. + +Integrating with Pyth Lazer in your smart contracts as a consumer is a three-step process: + +1. **Integrate** Pyth Lazer SDK into your smart contracts. +2. **Subscribe** to Pyth Lazer websocket to receive price updates on your backend or frontend. +3. **Include** the price updates into your smart contract transactions. + + + + +### Integrate Pyth Lazer SDK into your smart contracts + +Pyth Lazer provides a solidity SDK, which allows consumers to TODO: + +```bash +forge install pythnet/pyth-crosschain +``` + +TODO: requiremnts.txt + +```bash +pyth-lazer-sdk/=lib/pythnet/pyth-crosschain/lazer/contracts/evm +``` + From d8d597eab99f4270ec9e639b04ad6f96d6cc9cd2 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 13 Jan 2025 15:32:01 -0500 Subject: [PATCH 05/16] fetch price updates guide --- pages/lazer/_meta.json | 1 + pages/lazer/fetch-price-updates.mdx | 122 ++++++++++++++++++++++ pages/lazer/integrate-as-consumer/evm.mdx | 7 +- 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 pages/lazer/fetch-price-updates.mdx diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json index 67041e66..accca301 100644 --- a/pages/lazer/_meta.json +++ b/pages/lazer/_meta.json @@ -16,6 +16,7 @@ "type": "separator" }, + "fetch-price-updates": "Fetch Price Updates", "integrate-as-consumer": "Integrate as a Consumer", "integrate-as-publisher": "Integrate as a Publisher", diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/fetch-price-updates.mdx new file mode 100644 index 00000000..1b8c309d --- /dev/null +++ b/pages/lazer/fetch-price-updates.mdx @@ -0,0 +1,122 @@ +import { Callout, Steps } from "nextra/components"; + +# How to Fetch Price Updates from Pyth Lazer + +Pyth Lazer provides a [websocket API (TODO: Prod)](https://pyth-lazer-staging.dourolabs.app/docs) to fetch price updates. + + +This guide explains how to **fetch** price updates, explore various **properties** of these updates, and configure the channel for **update frequency**. (TODO: Rewrite maybe) + +Fetching price updates is a three-step process: + +1. **Acquire** an access token. +2. **Adjust** subscription parameters. +3. **Subscribe** to the price updates via websocket API. + +The websocket server is available at `wss://pyth-lazer-staging.dourolabs.app/v1/stream`. +TODO: Add the prod URL. + + + +### 1. Acquire an access token + +Please fill out [this form](https://tally.so/r/nP2lG5) to contact the Pyth team and get the access token. + +Use the access token to authenticate the websocket connection as a `Bearer {token}{:bash}`. + + +### 2. Adjust subscription parameters + +One can configure the request/subscription parameters to customize the received price updates. A sample request is shown below: + +```json + client.send({ + type: "subscribe", + subscriptionId: 1, + priceFeedIds: [1, 2], + properties: ["price"], + chains: ["solana"], + channel: "fixed_rate@200ms", + }); +``` +Here: + +- `subscriptionId` is an arbitrary numeric identifier one can choose for a subscription. It will eb returned back in response by the server. It doesn not affect the signed payload. +- `priceFeedIds` is the list of price feeds one like to receive. Data for all price feeds will be present in the signed price updates generated. Refer to the [Price Feed IDs list](./price-feeds.mdx) for the supported price feeds. +- `properties` is the list of properties one can request, such as **price**, **bestBidPrice**, **bestAskPrice**, etc. TODO: Find more properties. +- `chains` is the list of chains for which one need a signed payload, such as **evm**, **solana**, etc. +- `channel` allows to configure the update rate: updates in the **real_time** channel are sent as frequently as possible, while **fixed_rate@200ms** and **fixed_rate@50ms** channels are updated at fixed rates. + +There are also a few other parameters one may use. Refer to the [API documentation](https://pyth-lazer-staging.dourolabs.app/docs) for more details. + +### 3. Subscribe to the price updates + +To subscribe to the price updates, one needs to send the request to the websocket server. The server will respond with a signed price update. + +1. Pyth Lazer provides a [SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to seamlessly integrate the websocket API into your application. +It can be installed using the following command: + +```bash +npm install --save @pythnetwork/pyth-lazer-sdk +``` + +2. Then create a [`PythLazerClient`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/sdk/js/src/client.ts#L32) object using the URL and the access token requested from the Pyth team in the first step. + +```js +import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; + +const client = new PythLazerClient("wss://pyth-lazer-staging.dourolabs.app/v1/stream", "ctoken1"); +``` + +3. After the client is created, one can adjust the subscription parameters and subscribe to the price updates. + +```js +client.ws.addEventListener("open", () => { + client.send({ + type: "subscribe", + subscriptionId: 1, + priceFeedIds: [1, 2], + properties: ["price"], + chains: ["solana"], + channel: "fixed_rate@200ms", + }); +}); +``` + +4. One the connection is established, the server will start sending the price updates to the client. + +```js +client.addMessageListener((message) => { + console.log(message); +}); +``` + +By default, price updates contain the `parsed` field that one can use to easily interpret the update in their backend or frontend, as well as evm and/or solana fields that contain data that one should include in the on-chain transaction: + +```json +{ + "type": "streamUpdated", + "subscriptionId": 1, + "parsed": { + "timestampUs": "1730986152400000", + "priceFeeds": [ + { + "priceFeedId": 1, + "price": "1006900000000" + }, + { + "priceFeedId": 2, + "price": "2006900000000" + } + ] + }, + "solana": { + "encoding": "hex", + "data": "b9011a82d239c094c52016990d6ca2b261dbb1157ad503cbd3ea0679493316150cf3457624d19ec3f6e0a0e94373ab0971e39d939beda15cc02eb3c5454eb700f1f7310df65210bee4fcf5b1cee1e537fabcfd95010297653b94af04d454fc473e94834f2a0075d3c7938094b99e52260600030201000000010000b5ea6fea00000002000000010000c58f44d3010000" + } +} +``` + + + + \ No newline at end of file diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx index e3f8b228..fd67f822 100644 --- a/pages/lazer/integrate-as-consumer/evm.mdx +++ b/pages/lazer/integrate-as-consumer/evm.mdx @@ -10,7 +10,6 @@ Integrating with Pyth Lazer in your smart contracts as a consumer is a three-ste 2. **Subscribe** to Pyth Lazer websocket to receive price updates on your backend or frontend. 3. **Include** the price updates into your smart contract transactions. - ### Integrate Pyth Lazer SDK into your smart contracts @@ -26,4 +25,10 @@ TODO: requiremnts.txt ```bash pyth-lazer-sdk/=lib/pythnet/pyth-crosschain/lazer/contracts/evm ``` + + +### Modify the smart contract to TODO: + +1. Import +2. State Variables. From b678762933f0cc17a17788686159456475fd26fb Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Mon, 13 Jan 2025 16:05:56 -0500 Subject: [PATCH 06/16] update --- pages/lazer/fetch-price-updates.mdx | 18 ++++---- pages/lazer/integrate-as-consumer/evm.mdx | 54 ++++++++++++++++++----- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/fetch-price-updates.mdx index 1b8c309d..c4d40a02 100644 --- a/pages/lazer/fetch-price-updates.mdx +++ b/pages/lazer/fetch-price-updates.mdx @@ -2,8 +2,7 @@ import { Callout, Steps } from "nextra/components"; # How to Fetch Price Updates from Pyth Lazer -Pyth Lazer provides a [websocket API (TODO: Prod)](https://pyth-lazer-staging.dourolabs.app/docs) to fetch price updates. - +Pyth Lazer provides a [websocket API (TODO: Prod)](https://pyth-lazer-staging.dourolabs.app/docs) to fetch price updates. This guide explains how to **fetch** price updates, explore various **properties** of these updates, and configure the channel for **update frequency**. (TODO: Rewrite maybe) @@ -24,7 +23,6 @@ Please fill out [this form](https://tally.so/r/nP2lG5) to contact the Pyth team Use the access token to authenticate the websocket connection as a `Bearer {token}{:bash}`. - ### 2. Adjust subscription parameters One can configure the request/subscription parameters to customize the received price updates. A sample request is shown below: @@ -39,6 +37,7 @@ One can configure the request/subscription parameters to customize the received channel: "fixed_rate@200ms", }); ``` + Here: - `subscriptionId` is an arbitrary numeric identifier one can choose for a subscription. It will eb returned back in response by the server. It doesn not affect the signed payload. @@ -53,8 +52,8 @@ There are also a few other parameters one may use. Refer to the [API documentati To subscribe to the price updates, one needs to send the request to the websocket server. The server will respond with a signed price update. -1. Pyth Lazer provides a [SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to seamlessly integrate the websocket API into your application. -It can be installed using the following command: +1. Pyth Lazer provides a [SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to seamlessly integrate the websocket API into your application. + It can be installed using the following command: ```bash npm install --save @pythnetwork/pyth-lazer-sdk @@ -65,7 +64,10 @@ npm install --save @pythnetwork/pyth-lazer-sdk ```js import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; -const client = new PythLazerClient("wss://pyth-lazer-staging.dourolabs.app/v1/stream", "ctoken1"); +const client = new PythLazerClient( + "wss://pyth-lazer-staging.dourolabs.app/v1/stream", + "ctoken1" +); ``` 3. After the client is created, one can adjust the subscription parameters and subscribe to the price updates. @@ -117,6 +119,4 @@ By default, price updates contain the `parsed` field that one can use to easily } ``` - - - \ No newline at end of file + diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx index fd67f822..c89f89c0 100644 --- a/pages/lazer/integrate-as-consumer/evm.mdx +++ b/pages/lazer/integrate-as-consumer/evm.mdx @@ -6,29 +6,63 @@ This guide is intended to serve for users who wants to consume prices from the P Integrating with Pyth Lazer in your smart contracts as a consumer is a three-step process: -1. **Integrate** Pyth Lazer SDK into your smart contracts. +1. **Use** Pyth Lazer SDK into your smart contracts to parse the price updates. 2. **Subscribe** to Pyth Lazer websocket to receive price updates on your backend or frontend. 3. **Include** the price updates into your smart contract transactions. -### Integrate Pyth Lazer SDK into your smart contracts +### Use Pyth Lazer SDK into your smart contracts -Pyth Lazer provides a solidity SDK, which allows consumers to TODO: +Pyth Lazer provides a solidity SDK, which allows consumers to parse the price updates. -```bash +```bash copy forge install pythnet/pyth-crosschain ``` -TODO: requiremnts.txt +Add the following to your `requirements.txt` file: -```bash +```bash copy pyth-lazer-sdk/=lib/pythnet/pyth-crosschain/lazer/contracts/evm ``` - +Once the SDK is installed, one can import the sdk into your smart contracts: + +```solidity copy +import { PythLazer } from "pyth-lazer/PythLazer.sol"; +import { PythLazerLib } from "pyth-lazer/PythLazerLib.sol"; + +``` -### Modify the smart contract to TODO: +After importing the SDK, initialize the `PythLazer` contract and set up state varables to store prices and timestamps: -1. Import -2. State Variables. +```solidity copy +contract ExampleConsumer { + // Example state. + PythLazer pythLazer; + uint64 public price; + uint64 public timestamp; + + //... + + constructor(address pythLazerAddress) { + pythLazer = PythLazer(pythLazerAddress); + } +} + +``` + +Add an argument of type `bytes calldata` to the method which will receive the Pyth Lazer price udpate: + +```solidity copy +function updatePrice(bytes calldata priceUpdate) public payable { + uint256 verification_fee = pythLazer.verification_fee(); + (bytes calldata payload, ) = verifyUpdate{ value: verification_fee }(update); + //... +} + +``` + +The `verifyUpdate` function will verify the price update and return the payload and the verification fee. This call takes a fee which can be queried from `verification_fee()` function and passed to the `verifyUpdate` call. This fee is used to cover the cost of verifying the price update. + + From b42aac1004454c6ac5e0e0dbd830b37f3b39a941 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 11:59:58 -0500 Subject: [PATCH 07/16] evm example --- pages/lazer/integrate-as-consumer/evm.mdx | 93 +++++++++++++++++++++-- 1 file changed, 85 insertions(+), 8 deletions(-) diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx index c89f89c0..d5848a4e 100644 --- a/pages/lazer/integrate-as-consumer/evm.mdx +++ b/pages/lazer/integrate-as-consumer/evm.mdx @@ -2,17 +2,17 @@ import { Callout, Tabs, Steps } from "nextra/components"; # Integrate Pyth Lazer as a Consumer on EVM chains -This guide is intended to serve for users who wants to consume prices from the Pyth Lazer price feed on EVM chains. +This guide is intended to serve users who wants to consume prices from the Pyth Lazer on EVM chains. -Integrating with Pyth Lazer in your smart contracts as a consumer is a three-step process: +Integrating with Pyth Lazer in smart contracts as a consumer is a three-step process: -1. **Use** Pyth Lazer SDK into your smart contracts to parse the price updates. -2. **Subscribe** to Pyth Lazer websocket to receive price updates on your backend or frontend. -3. **Include** the price updates into your smart contract transactions. +1. **Use** Pyth Lazer SDK into smart contracts to parse the price updates. +2. **Subscribe** to Pyth Lazer websocket to receive price updates on backend or frontend. +3. **Include** the price updates into the smart contract transactions. -### Use Pyth Lazer SDK into your smart contracts +### Use Pyth Lazer SDK into smart contracts Pyth Lazer provides a solidity SDK, which allows consumers to parse the price updates. @@ -20,13 +20,13 @@ Pyth Lazer provides a solidity SDK, which allows consumers to parse the price up forge install pythnet/pyth-crosschain ``` -Add the following to your `requirements.txt` file: +Add the following to `requirements.txt{:js}` file: ```bash copy pyth-lazer-sdk/=lib/pythnet/pyth-crosschain/lazer/contracts/evm ``` -Once the SDK is installed, one can import the sdk into your smart contracts: +Once the SDK is installed, one can import the sdk into smart contracts: ```solidity copy import { PythLazer } from "pyth-lazer/PythLazer.sol"; @@ -65,4 +65,81 @@ function updatePrice(bytes calldata priceUpdate) public payable { The `verifyUpdate` function will verify the price update and return the payload and the verification fee. This call takes a fee which can be queried from `verification_fee()` function and passed to the `verifyUpdate` call. This fee is used to cover the cost of verifying the price update. +This SDK provides `parsePayloadHeader` method to retrieve the values from the payload header. + +```solidity copy +(uint64 _timestamp, Channel channel, uint8 feedsLen, uint16 pos) = parsePayloadHeader(payload); +``` + +This method returns: + +- `_timestamp`: The timestamp of the price update. +- `channel`: The channel of the price update. +- `feedsLen`: The number of feeds in the price update. +- `pos`: The cursor position of the payload. + +One can iterate over all the feeds and properties present within the price update, modifying the state variables as necessary. + +Here is an example of how to iterate over the feeds and properties: + +```solidity copy +for (uint8 i = 0; i < feedsLen; i++) { + uint32 feedId; + uint8 num_properties; + (feedId, num_properties, pos) = parseFeedHeader(payload, pos); + for (uint8 j = 0; j < num_properties; j++) { + PriceFeedProperty property; + (property, pos) = parseFeedProperty(payload, pos); + if (property == PriceFeedProperty.Price) { + uint64 _price; + (_price, pos) = parseFeedValueUint64(payload, pos); + if (feedId == 2 && _timestamp > timestamp) { + price = _price; + timestamp = _timestamp; + } + } else if (property == PriceFeedProperty.BestBidPrice) { + uint64 _price; + (_price, pos) = parseFeedValueUint64(payload, pos); + } else if (property == PriceFeedProperty.BestAskPrice) { + uint64 _price; + (_price, pos) = parseFeedValueUint64(payload, pos); + } else { + revert("unknown property"); + } + } +} +``` + +### Subscribe to Pyth Lazer to receive Price Updates + +Pyth Lazer provides a websocket endpoint to receive price updates. Moreover, Pyth Lazer provides a typescript SDK to subscribe to the websocket endpoint. + +Consult [How to fetch price updates from Pyth Lazer](../fetch-price-updates.mdx) for a complete step-by-step guide. + +### Include the price updates into smart contract transactions + +Now that one have the price updates, and the smart contract is able to parse the price updates, one can include the price updates into the smart contract transactions by passing the price updates received from the websocket to the `updatePrice` method. + + +## Additional Resources + +You may find these additional resources helpful for integrating Pyth Lazer into your EVM smart contracts. + +### Price Feed IDs + +Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds.mdx) page for a complete list of supported price feeds. + +### Examples + +[Pyth-lazer-example-evm](https://github.com/pyth-network/pyth-examples/tree/main/lazer/evm) is a simple example contract that parses and consumes price updates from Pyth Lazer. + +[pyth-lazer-example-js](https://github.com/pyth-network/pyth-examples/tree/main/lazer/js) is a simple example for subscribing to the Pyth Lazer websocket. + +### API Reference + +TODO: + +### Error Codes + +TODO: Add error codes for EVM. From 4ee174b81b844bf4e17d1bf6e593b7cd70b92a7f Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 12:40:25 -0500 Subject: [PATCH 08/16] updates --- pages/lazer/_meta.json | 2 +- pages/lazer/fetch-price-updates.mdx | 55 +++++++++++++++++------------ 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json index accca301..f660d163 100644 --- a/pages/lazer/_meta.json +++ b/pages/lazer/_meta.json @@ -16,7 +16,7 @@ "type": "separator" }, - "fetch-price-updates": "Fetch Price Updates", + "subscribe-price-updates": "Subscribe to Price Updates", "integrate-as-consumer": "Integrate as a Consumer", "integrate-as-publisher": "Integrate as a Publisher", diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/fetch-price-updates.mdx index c4d40a02..5e154c74 100644 --- a/pages/lazer/fetch-price-updates.mdx +++ b/pages/lazer/fetch-price-updates.mdx @@ -1,19 +1,16 @@ import { Callout, Steps } from "nextra/components"; -# How to Fetch Price Updates from Pyth Lazer +# How to Subscribe to Price Updates from Pyth Lazer -Pyth Lazer provides a [websocket API (TODO: Prod)](https://pyth-lazer-staging.dourolabs.app/docs) to fetch price updates. +This guide explains how to subscribe to price updates from Pyth Lazer. This guide will also explain various properties and channels that one can use to customize the price updates. -This guide explains how to **fetch** price updates, explore various **properties** of these updates, and configure the channel for **update frequency**. (TODO: Rewrite maybe) - -Fetching price updates is a three-step process: +Subscribing to price updates is a three-step process: 1. **Acquire** an access token. 2. **Adjust** subscription parameters. -3. **Subscribe** to the price updates via websocket API. +3. **Subscribe** to the price updates via [websocket API](https://pyth-lazer-staging.dourolabs.app/docs). -The websocket server is available at `wss://pyth-lazer-staging.dourolabs.app/v1/stream`. -TODO: Add the prod URL. +The websocket server is available at `wss://pyth-lazer-staging.dourolabs.app/v1/stream{:bash}`. @@ -21,28 +18,28 @@ TODO: Add the prod URL. Please fill out [this form](https://tally.so/r/nP2lG5) to contact the Pyth team and get the access token. -Use the access token to authenticate the websocket connection as a `Bearer {token}{:bash}`. +Use the access token to authenticate the websocket connection by passing it as an `Authorization{:bash}` header with the value `Bearer {token}{:bash}`. ### 2. Adjust subscription parameters One can configure the request/subscription parameters to customize the received price updates. A sample request is shown below: -```json - client.send({ - type: "subscribe", - subscriptionId: 1, - priceFeedIds: [1, 2], - properties: ["price"], - chains: ["solana"], - channel: "fixed_rate@200ms", - }); +```js +client.send({ + type: "subscribe", + subscriptionId: 1, + priceFeedIds: [1, 2], + properties: ["price"], + chains: ["solana"], + channel: "fixed_rate@200ms", +}); ``` Here: -- `subscriptionId` is an arbitrary numeric identifier one can choose for a subscription. It will eb returned back in response by the server. It doesn not affect the signed payload. +- `subscriptionId` is an arbitrary numeric identifier one can choose for a subscription. It will be returned back in response by the server. It doesn not affect the signed payload. - `priceFeedIds` is the list of price feeds one like to receive. Data for all price feeds will be present in the signed price updates generated. Refer to the [Price Feed IDs list](./price-feeds.mdx) for the supported price feeds. -- `properties` is the list of properties one can request, such as **price**, **bestBidPrice**, **bestAskPrice**, etc. TODO: Find more properties. +- `properties` is the list of properties one can request, such as **price**, **bestBidPrice**, **bestAskPrice**, etc. - `chains` is the list of chains for which one need a signed payload, such as **evm**, **solana**, etc. - `channel` allows to configure the update rate: updates in the **real_time** channel are sent as frequently as possible, while **fixed_rate@200ms** and **fixed_rate@50ms** channels are updated at fixed rates. @@ -53,7 +50,7 @@ There are also a few other parameters one may use. Refer to the [API documentati To subscribe to the price updates, one needs to send the request to the websocket server. The server will respond with a signed price update. 1. Pyth Lazer provides a [SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to seamlessly integrate the websocket API into your application. - It can be installed using the following command: +It can be installed using the following command: ```bash npm install --save @pythnetwork/pyth-lazer-sdk @@ -93,7 +90,7 @@ client.addMessageListener((message) => { }); ``` -By default, price updates contain the `parsed` field that one can use to easily interpret the update in their backend or frontend, as well as evm and/or solana fields that contain data that one should include in the on-chain transaction: +By default, price updates contain the `parsed` field that one can use to easily interpret the price update in their backend or frontend, as well as `evm` and/or `solana` fields that contain data that one should include in the on-chain transaction: ```json { @@ -120,3 +117,17 @@ By default, price updates contain the `parsed` field that one can use to easily ``` + + + +## Additional Resources + +You may find these additional resources helpful for subscribing to price updates from Pyth Lazer. + +### Price Feed IDs + +Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds.mdx) page for a complete list of supported price feeds. + +### Examples + +[pyth-lazer-example-js](https://github.com/pyth-network/pyth-examples/tree/main/lazer/js) is a simple example for subscribing to the Pyth Lazer websocket. From 8b7335abde6e8f60758fce60f86953555e883d98 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 12:41:13 -0500 Subject: [PATCH 09/16] push --- pages/lazer/fetch-price-updates.mdx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/fetch-price-updates.mdx index 5e154c74..e8bf4e51 100644 --- a/pages/lazer/fetch-price-updates.mdx +++ b/pages/lazer/fetch-price-updates.mdx @@ -39,7 +39,7 @@ Here: - `subscriptionId` is an arbitrary numeric identifier one can choose for a subscription. It will be returned back in response by the server. It doesn not affect the signed payload. - `priceFeedIds` is the list of price feeds one like to receive. Data for all price feeds will be present in the signed price updates generated. Refer to the [Price Feed IDs list](./price-feeds.mdx) for the supported price feeds. -- `properties` is the list of properties one can request, such as **price**, **bestBidPrice**, **bestAskPrice**, etc. +- `properties` is the list of properties one can request, such as **price**, **bestBidPrice**, **bestAskPrice**, etc. - `chains` is the list of chains for which one need a signed payload, such as **evm**, **solana**, etc. - `channel` allows to configure the update rate: updates in the **real_time** channel are sent as frequently as possible, while **fixed_rate@200ms** and **fixed_rate@50ms** channels are updated at fixed rates. @@ -50,7 +50,7 @@ There are also a few other parameters one may use. Refer to the [API documentati To subscribe to the price updates, one needs to send the request to the websocket server. The server will respond with a signed price update. 1. Pyth Lazer provides a [SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to seamlessly integrate the websocket API into your application. -It can be installed using the following command: + It can be installed using the following command: ```bash npm install --save @pythnetwork/pyth-lazer-sdk @@ -118,8 +118,6 @@ By default, price updates contain the `parsed` field that one can use to easily - - ## Additional Resources You may find these additional resources helpful for subscribing to price updates from Pyth Lazer. From 011548ebe75aab9496b080b90d065f6956844b19 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 16:31:33 -0500 Subject: [PATCH 10/16] update --- images/lazer/Pyth_Laser_table.png | Bin 0 -> 163197 bytes pages/lazer/fetch-price-updates.mdx | 8 +- pages/lazer/index.md | 5 - pages/lazer/index.mdx | 20 +++ pages/lazer/integrate-as-consumer/_meta.json | 2 +- pages/lazer/integrate-as-consumer/evm.mdx | 33 ++-- pages/lazer/integrate-as-consumer/svm.mdx | 160 +++++++++++++++++++ pages/lazer/integrate-as-publisher.mdx | 2 +- 8 files changed, 210 insertions(+), 20 deletions(-) create mode 100644 images/lazer/Pyth_Laser_table.png delete mode 100644 pages/lazer/index.md create mode 100644 pages/lazer/index.mdx diff --git a/images/lazer/Pyth_Laser_table.png b/images/lazer/Pyth_Laser_table.png new file mode 100644 index 0000000000000000000000000000000000000000..9f010ff53dfe01b222e81432def593de772bf5f3 GIT binary patch literal 163197 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�VHtCt5~i8ig0 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 Q`*huVMt4!SAHDcL06FZ{q5uE@ literal 0 HcmV?d00001 diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/fetch-price-updates.mdx index e8bf4e51..8caa600a 100644 --- a/pages/lazer/fetch-price-updates.mdx +++ b/pages/lazer/fetch-price-updates.mdx @@ -8,9 +8,9 @@ Subscribing to price updates is a three-step process: 1. **Acquire** an access token. 2. **Adjust** subscription parameters. -3. **Subscribe** to the price updates via [websocket API](https://pyth-lazer-staging.dourolabs.app/docs). +3. **Subscribe** to the price updates via [websocket API](https://pyth-lazer.dourolabs.app/docs). -The websocket server is available at `wss://pyth-lazer-staging.dourolabs.app/v1/stream{:bash}`. +The websocket server is available at `wss://pyth-lazer.dourolabs.app/v1/stream{:bash}`. @@ -43,7 +43,7 @@ Here: - `chains` is the list of chains for which one need a signed payload, such as **evm**, **solana**, etc. - `channel` allows to configure the update rate: updates in the **real_time** channel are sent as frequently as possible, while **fixed_rate@200ms** and **fixed_rate@50ms** channels are updated at fixed rates. -There are also a few other parameters one may use. Refer to the [API documentation](https://pyth-lazer-staging.dourolabs.app/docs) for more details. +There are also a few other parameters one may use. Refer to the [API documentation](https://pyth-lazer.dourolabs.app/docs) for more details. ### 3. Subscribe to the price updates @@ -62,7 +62,7 @@ npm install --save @pythnetwork/pyth-lazer-sdk import { PythLazerClient } from "@pythnetwork/pyth-lazer-sdk"; const client = new PythLazerClient( - "wss://pyth-lazer-staging.dourolabs.app/v1/stream", + "wss://pyth-lazer.dourolabs.app/v1/stream", "ctoken1" ); ``` diff --git a/pages/lazer/index.md b/pages/lazer/index.md deleted file mode 100644 index d739cc4c..00000000 --- a/pages/lazer/index.md +++ /dev/null @@ -1,5 +0,0 @@ -# Lazer - -TODO: Fill this up. - -TODO: Add a banner up to get a access token. diff --git a/pages/lazer/index.mdx b/pages/lazer/index.mdx new file mode 100644 index 00000000..e9819a7f --- /dev/null +++ b/pages/lazer/index.mdx @@ -0,0 +1,20 @@ +import Image from "next/image"; + +# Pyth Lazer + +Pyth Lazer is a low latency, highly customizable price oracle. +It offers a customizable set of price feeds, target chains (EVM or Solana) and channels (real time or fixed rate): + +- Real time channels send updates as frequently as they become available; +- Fixed rate channels send updates at fixed time intervals (you can choose between 50 ms or 200 ms). + +The table below shows the difference between Pyth Core and Pyth Lazer: + +| | **Pyth Core** | **Pyth Lazer** | +| ----------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| **Solution Type** | Stable, secure, and decentralized price data source for a broad spectrum of DeFi or TradFi applications. | **Permissioned** service focused on **ultra-low-latency** price and market data for highly latency-sensitive users. | +| **Frequency** | 400ms on Pythnet appchain with support for risk mitigation via Benchmarks and confidence intervals. | **1ms** (**real-time**), 50ms, and 200ms channels, **customizable** frequencies, and throttling support to address different needs. | +| **Data Types** | Aggregate price and confidence intervals. | Aggregate price, bid/ask price, and **customizable** market data (market depth and more). | +| **Fees** | On-chain fee per signed cross-chain price update. | On-chain fee per signed cross-chain price update. | +| **Update Costs** | >1,000-byte proofs and complex signature verification. | **100-byte proofs** and simple signature verification. | +| **Integration Process** | Open and permissionless integration for any Web3 or Web2 protocol. | **Specialized** and **permissioned** solution for protocols prioritizing performance over some elements of decentralization. | diff --git a/pages/lazer/integrate-as-consumer/_meta.json b/pages/lazer/integrate-as-consumer/_meta.json index 6d90f4eb..f78d3668 100644 --- a/pages/lazer/integrate-as-consumer/_meta.json +++ b/pages/lazer/integrate-as-consumer/_meta.json @@ -1,4 +1,4 @@ { "evm": "on EVM chains", - "svm": "on SVM chains" + "svm": "on Solana" } diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx index d5848a4e..938b836b 100644 --- a/pages/lazer/integrate-as-consumer/evm.mdx +++ b/pages/lazer/integrate-as-consumer/evm.mdx @@ -2,11 +2,11 @@ import { Callout, Tabs, Steps } from "nextra/components"; # Integrate Pyth Lazer as a Consumer on EVM chains -This guide is intended to serve users who wants to consume prices from the Pyth Lazer on EVM chains. +This guide is intended to serve users who wants to consume prices from the Pyth Lazer on **EVM chains**. Integrating with Pyth Lazer in smart contracts as a consumer is a three-step process: -1. **Use** Pyth Lazer SDK into smart contracts to parse the price updates. +1. **Use** Pyth Lazer SDK into EVM smart contracts to parse the price updates. 2. **Subscribe** to Pyth Lazer websocket to receive price updates on backend or frontend. 3. **Include** the price updates into the smart contract transactions. @@ -14,7 +14,7 @@ Integrating with Pyth Lazer in smart contracts as a consumer is a three-step pro ### Use Pyth Lazer SDK into smart contracts -Pyth Lazer provides a solidity SDK, which allows consumers to parse the price updates. +Pyth Lazer provides a [solidity SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/contracts/evm), which allows consumers to parse the price updates. ```bash copy forge install pythnet/pyth-crosschain @@ -34,7 +34,7 @@ import { PythLazerLib } from "pyth-lazer/PythLazerLib.sol"; ``` -After importing the SDK, initialize the `PythLazer` contract and set up state varables to store prices and timestamps: +After importing the SDK, initialize the [`PythLazer`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazer.sol#L7) contract and set up state varables to store prices and timestamps: ```solidity copy contract ExampleConsumer { @@ -52,7 +52,7 @@ contract ExampleConsumer { ``` -Add an argument of type `bytes calldata` to the method which will receive the Pyth Lazer price udpate: +Add an argument of type `bytes calldata{:solidity}` to the method which will receive the Pyth Lazer price udpate: ```solidity copy function updatePrice(bytes calldata priceUpdate) public payable { @@ -63,9 +63,9 @@ function updatePrice(bytes calldata priceUpdate) public payable { ``` -The `verifyUpdate` function will verify the price update and return the payload and the verification fee. This call takes a fee which can be queried from `verification_fee()` function and passed to the `verifyUpdate` call. This fee is used to cover the cost of verifying the price update. +The `verifyUpdate` function will verify the price update and return the payload and the verification fee. This call takes a fee which can be queried from [`verification_fee(){:solidity}`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazer.sol#L9) function and passed to the `verifyUpdate` call. This fee is used to cover the cost of verifying the price update. -This SDK provides `parsePayloadHeader` method to retrieve the values from the payload header. +This SDK provides [`parsePayloadHeader`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazerLib.sol#L21) method to retrieve the values from the payload header. ```solidity copy (uint64 _timestamp, Channel channel, uint8 feedsLen, uint16 pos) = parsePayloadHeader(payload); @@ -110,15 +110,30 @@ for (uint8 i = 0; i < feedsLen; i++) { } ``` + + Make sure to pass the `pos` variable to every parsing call and assign the + returned `pos` value to the same variable. Failure to do so will cause + incorrect parsing results. + + + + When calling these parse functions, you must not skip price feeds or + properties. Every parsing function will modify your `pos` variable, so + skipping a call of `parseFeedHeader`, `parseFeedProperty`, or + `parseFeedValueUint64` will lead to incorrect parsing results. Keep in mind + that you can customize the set of price feeds and properties when requesting + price updates via WebSocket. This will be explained in the next step. + + ### Subscribe to Pyth Lazer to receive Price Updates -Pyth Lazer provides a websocket endpoint to receive price updates. Moreover, Pyth Lazer provides a typescript SDK to subscribe to the websocket endpoint. +Pyth Lazer provides a websocket endpoint to receive price updates. Moreover, Pyth Lazer also provides a [typescript SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to subscribe to the websocket endpoint. Consult [How to fetch price updates from Pyth Lazer](../fetch-price-updates.mdx) for a complete step-by-step guide. ### Include the price updates into smart contract transactions -Now that one have the price updates, and the smart contract is able to parse the price updates, one can include the price updates into the smart contract transactions by passing the price updates received from the websocket to the `updatePrice` method. +Now that you have the price updates, and your smart contract is able to parse the price updates, you can include the price updates into the smart contract transactions by passing the price updates received from the previous step as an argument to the `updatePrice` method of your smart contract. diff --git a/pages/lazer/integrate-as-consumer/svm.mdx b/pages/lazer/integrate-as-consumer/svm.mdx index e69de29b..cb650082 100644 --- a/pages/lazer/integrate-as-consumer/svm.mdx +++ b/pages/lazer/integrate-as-consumer/svm.mdx @@ -0,0 +1,160 @@ +import { Callout, Tabs, Steps } from "nextra/components"; + +# Integrate Pyth Lazer as a Consumer on Solana + +This guide is intended to serve users who wants to consume prices from the Pyth Lazer on **Solana**. + +Integrating with Pyth Lazer in smart contracts as a consumer is a three-step process: + +1. **Use** Pyth Lazer SDK into Solana smart contracts to parse the price updates. +2. **Subscribe** to Pyth Lazer websocket to receive price updates on backend or frontend. +3. **Include** the price updates into the smart contract transactions. + + + +### Use Pyth Lazer SDK into smart contracts + +Pyth Lazer provides a [solidity SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/contracts/evm), which allows consumers to parse the price updates. + +```bash copy +forge install pythnet/pyth-crosschain +``` + +Add the following to `requirements.txt{:js}` file: + +```bash copy +pyth-lazer-sdk/=lib/pythnet/pyth-crosschain/lazer/contracts/evm +``` + +Once the SDK is installed, one can import the sdk into smart contracts: + +```solidity copy +import { PythLazer } from "pyth-lazer/PythLazer.sol"; +import { PythLazerLib } from "pyth-lazer/PythLazerLib.sol"; + +``` + +After importing the SDK, initialize the [`PythLazer`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazer.sol#L7) contract and set up state varables to store prices and timestamps: + +```solidity copy +contract ExampleConsumer { + // Example state. + PythLazer pythLazer; + uint64 public price; + uint64 public timestamp; + + //... + + constructor(address pythLazerAddress) { + pythLazer = PythLazer(pythLazerAddress); + } +} + +``` + +Add an argument of type `bytes calldata{:solidity}` to the method which will receive the Pyth Lazer price udpate: + +```solidity copy +function updatePrice(bytes calldata priceUpdate) public payable { + uint256 verification_fee = pythLazer.verification_fee(); + (bytes calldata payload, ) = verifyUpdate{ value: verification_fee }(update); + //... +} + +``` + +The `verifyUpdate` function will verify the price update and return the payload and the verification fee. This call takes a fee which can be queried from [`verification_fee(){:solidity}`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazer.sol#L9) function and passed to the `verifyUpdate` call. This fee is used to cover the cost of verifying the price update. + +This SDK provides [`parsePayloadHeader`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazerLib.sol#L21) method to retrieve the values from the payload header. + +```solidity copy +(uint64 _timestamp, Channel channel, uint8 feedsLen, uint16 pos) = parsePayloadHeader(payload); +``` + +This method returns: + +- `_timestamp`: The timestamp of the price update. +- `channel`: The channel of the price update. +- `feedsLen`: The number of feeds in the price update. +- `pos`: The cursor position of the payload. + +One can iterate over all the feeds and properties present within the price update, modifying the state variables as necessary. + +Here is an example of how to iterate over the feeds and properties: + +```solidity copy +for (uint8 i = 0; i < feedsLen; i++) { + uint32 feedId; + uint8 num_properties; + (feedId, num_properties, pos) = parseFeedHeader(payload, pos); + for (uint8 j = 0; j < num_properties; j++) { + PriceFeedProperty property; + (property, pos) = parseFeedProperty(payload, pos); + if (property == PriceFeedProperty.Price) { + uint64 _price; + (_price, pos) = parseFeedValueUint64(payload, pos); + if (feedId == 2 && _timestamp > timestamp) { + price = _price; + timestamp = _timestamp; + } + } else if (property == PriceFeedProperty.BestBidPrice) { + uint64 _price; + (_price, pos) = parseFeedValueUint64(payload, pos); + } else if (property == PriceFeedProperty.BestAskPrice) { + uint64 _price; + (_price, pos) = parseFeedValueUint64(payload, pos); + } else { + revert("unknown property"); + } + } +} +``` + + + Make sure to pass the `pos` variable to every parsing call and assign the + returned `pos` value to the same variable. Failure to do so will cause + incorrect parsing results. + + + + When calling these parse functions, you must not skip price feeds or + properties. Every parsing function will modify your `pos` variable, so + skipping a call of `parseFeedHeader`, `parseFeedProperty`, or + `parseFeedValueUint64` will lead to incorrect parsing results. Keep in mind + that you can customize the set of price feeds and properties when requesting + price updates via WebSocket. This will be explained in the next step. + + +### Subscribe to Pyth Lazer to receive Price Updates + +Pyth Lazer provides a websocket endpoint to receive price updates. Moreover, Pyth Lazer also provides a [typescript SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to subscribe to the websocket endpoint. + +Consult [How to fetch price updates from Pyth Lazer](../fetch-price-updates.mdx) for a complete step-by-step guide. + +### Include the price updates into smart contract transactions + +Now that you have the price updates, and your smart contract is able to parse the price updates, you can include the price updates into the smart contract transactions by passing the price updates received from the previous step as an argument to the `updatePrice` method of your smart contract. + + + +## Additional Resources + +You may find these additional resources helpful for integrating Pyth Lazer into your EVM smart contracts. + +### Price Feed IDs + +Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds.mdx) page for a complete list of supported price feeds. + +### Examples + +[Pyth-lazer-example-evm](https://github.com/pyth-network/pyth-examples/tree/main/lazer/evm) is a simple example contract that parses and consumes price updates from Pyth Lazer. + +[pyth-lazer-example-js](https://github.com/pyth-network/pyth-examples/tree/main/lazer/js) is a simple example for subscribing to the Pyth Lazer websocket. + +### API Reference + +TODO: + +### Error Codes + +TODO: Add error codes for EVM. diff --git a/pages/lazer/integrate-as-publisher.mdx b/pages/lazer/integrate-as-publisher.mdx index dac6c3f7..25784d01 100644 --- a/pages/lazer/integrate-as-publisher.mdx +++ b/pages/lazer/integrate-as-publisher.mdx @@ -1,3 +1,3 @@ # How to Integrate Pyth Lazer as a Publisher -TODO: Fill this up. +We are working on this guide. Please check back later or contact us here if you wish to publish data on Pyth Lazer. From ff9a045f54066e65be96e4fb20b1a4a4f6c01d90 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 16:35:12 -0500 Subject: [PATCH 11/16] restructure --- pages/lazer/_meta.json | 9 ++++----- pages/lazer/fetch-price-updates.mdx | 4 ++-- pages/lazer/getting-started.mdx | 2 -- pages/lazer/integrate-as-consumer/evm.mdx | 2 +- pages/lazer/integrate-as-consumer/how-lazer-works.mdx | 5 +++++ 5 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 pages/lazer/integrate-as-consumer/how-lazer-works.mdx diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json index f660d163..f76a5328 100644 --- a/pages/lazer/_meta.json +++ b/pages/lazer/_meta.json @@ -24,15 +24,14 @@ "title": "Reference Material", "type": "separator" }, - "price-feeds": "Price Feeds", + "price-feeds-ids": "Price Feeds IDs", - "api-reference": { - "title": "HTTP API Reference ↗", - "href": "TODO:", + "websocket-api-reference": { + "title": "Websocket API Reference ↗", + "href": "https://pyth-lazer.dourolabs.app/docs", "newWindow": true }, - "websocket-api-reference": "Websocket API Reference", "contract-addresses": "Contract Addresses", "errors": "Error Codes", diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/fetch-price-updates.mdx index 8caa600a..6c1633c9 100644 --- a/pages/lazer/fetch-price-updates.mdx +++ b/pages/lazer/fetch-price-updates.mdx @@ -38,7 +38,7 @@ client.send({ Here: - `subscriptionId` is an arbitrary numeric identifier one can choose for a subscription. It will be returned back in response by the server. It doesn not affect the signed payload. -- `priceFeedIds` is the list of price feeds one like to receive. Data for all price feeds will be present in the signed price updates generated. Refer to the [Price Feed IDs list](./price-feeds.mdx) for the supported price feeds. +- `priceFeedIds` is the list of price feeds one like to receive. Data for all price feeds will be present in the signed price updates generated. Refer to the [Price Feed IDs list](../price-feeds-ids.mdx) for the supported price feeds. - `properties` is the list of properties one can request, such as **price**, **bestBidPrice**, **bestAskPrice**, etc. - `chains` is the list of chains for which one need a signed payload, such as **evm**, **solana**, etc. - `channel` allows to configure the update rate: updates in the **real_time** channel are sent as frequently as possible, while **fixed_rate@200ms** and **fixed_rate@50ms** channels are updated at fixed rates. @@ -124,7 +124,7 @@ You may find these additional resources helpful for subscribing to price updates ### Price Feed IDs -Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds.mdx) page for a complete list of supported price feeds. +Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds-ids.mdx) page for a complete list of supported price feeds. ### Examples diff --git a/pages/lazer/getting-started.mdx b/pages/lazer/getting-started.mdx index 0c5ea3f5..95b4a019 100644 --- a/pages/lazer/getting-started.mdx +++ b/pages/lazer/getting-started.mdx @@ -1,3 +1 @@ # Getting Started with Pyth Lazer - -TODO: Fill this up. diff --git a/pages/lazer/integrate-as-consumer/evm.mdx b/pages/lazer/integrate-as-consumer/evm.mdx index 938b836b..77626091 100644 --- a/pages/lazer/integrate-as-consumer/evm.mdx +++ b/pages/lazer/integrate-as-consumer/evm.mdx @@ -143,7 +143,7 @@ You may find these additional resources helpful for integrating Pyth Lazer into ### Price Feed IDs -Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds.mdx) page for a complete list of supported price feeds. +Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](../price-feeds-ids.mdx) page for a complete list of supported price feeds. ### Examples diff --git a/pages/lazer/integrate-as-consumer/how-lazer-works.mdx b/pages/lazer/integrate-as-consumer/how-lazer-works.mdx new file mode 100644 index 00000000..ea314c0e --- /dev/null +++ b/pages/lazer/integrate-as-consumer/how-lazer-works.mdx @@ -0,0 +1,5 @@ +# How Pyth Lazer works + +Pyth Lazer is a permissioned service that provides ultra-low-latency price and market data to highly latency-sensitive users. + +We are working on writing a detailed technical overview how Lazer works. Details will be added here as they are completed. From 135d015460c4e7e01fe59c7147ff4065a41df92a Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 16:55:13 -0500 Subject: [PATCH 12/16] update --- components/LazerPriceIdTable.tsx | 4 ++-- components/Spinner.tsx | 23 +++++++++++++++++++ pages/lazer/_meta.json | 2 +- .../{price-feeds.mdx => price-feeds-ids.mdx} | 0 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 components/Spinner.tsx rename pages/lazer/{price-feeds.mdx => price-feeds-ids.mdx} (100%) diff --git a/components/LazerPriceIdTable.tsx b/components/LazerPriceIdTable.tsx index 19dccae8..8d8f0110 100644 --- a/components/LazerPriceIdTable.tsx +++ b/components/LazerPriceIdTable.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; import { StyledTd } from "./Table"; - +import { Spinner } from "./Spinner"; const fetchLazerPriceIdMetadata = async () => { const response = await fetch( "https://pyth-lazer-staging.dourolabs.app/history/v1/symbols" @@ -64,7 +64,7 @@ export function LazerPriceIdTable() { case LazerPriceIdStateType.NotLoaded: return
Loading...
; case LazerPriceIdStateType.Loading: - return
Loading...
; + return ; case LazerPriceIdStateType.Loaded: return ( diff --git a/components/Spinner.tsx b/components/Spinner.tsx new file mode 100644 index 00000000..9134da8e --- /dev/null +++ b/components/Spinner.tsx @@ -0,0 +1,23 @@ +import { SVGProps } from "react"; +export const Spinner = (props: SVGProps) => ( +
+ + Loading... +
+); diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json index f76a5328..bc5688d3 100644 --- a/pages/lazer/_meta.json +++ b/pages/lazer/_meta.json @@ -24,7 +24,7 @@ "title": "Reference Material", "type": "separator" }, - "price-feeds-ids": "Price Feeds IDs", + "price-feeds-ids": "Price Feed IDs", "websocket-api-reference": { "title": "Websocket API Reference ↗", diff --git a/pages/lazer/price-feeds.mdx b/pages/lazer/price-feeds-ids.mdx similarity index 100% rename from pages/lazer/price-feeds.mdx rename to pages/lazer/price-feeds-ids.mdx From 15bdbc7ce96bdc36993bb9bc629861eaf8a0b969 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 16:57:18 -0500 Subject: [PATCH 13/16] udpate --- pages/lazer/integrate-as-consumer/svm.mdx | 123 +--------------------- 1 file changed, 1 insertion(+), 122 deletions(-) diff --git a/pages/lazer/integrate-as-consumer/svm.mdx b/pages/lazer/integrate-as-consumer/svm.mdx index cb650082..0316b5cf 100644 --- a/pages/lazer/integrate-as-consumer/svm.mdx +++ b/pages/lazer/integrate-as-consumer/svm.mdx @@ -14,128 +14,7 @@ Integrating with Pyth Lazer in smart contracts as a consumer is a three-step pro ### Use Pyth Lazer SDK into smart contracts -Pyth Lazer provides a [solidity SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/contracts/evm), which allows consumers to parse the price updates. - -```bash copy -forge install pythnet/pyth-crosschain -``` - -Add the following to `requirements.txt{:js}` file: - -```bash copy -pyth-lazer-sdk/=lib/pythnet/pyth-crosschain/lazer/contracts/evm -``` - -Once the SDK is installed, one can import the sdk into smart contracts: - -```solidity copy -import { PythLazer } from "pyth-lazer/PythLazer.sol"; -import { PythLazerLib } from "pyth-lazer/PythLazerLib.sol"; - -``` - -After importing the SDK, initialize the [`PythLazer`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazer.sol#L7) contract and set up state varables to store prices and timestamps: - -```solidity copy -contract ExampleConsumer { - // Example state. - PythLazer pythLazer; - uint64 public price; - uint64 public timestamp; - - //... - - constructor(address pythLazerAddress) { - pythLazer = PythLazer(pythLazerAddress); - } -} - -``` - -Add an argument of type `bytes calldata{:solidity}` to the method which will receive the Pyth Lazer price udpate: - -```solidity copy -function updatePrice(bytes calldata priceUpdate) public payable { - uint256 verification_fee = pythLazer.verification_fee(); - (bytes calldata payload, ) = verifyUpdate{ value: verification_fee }(update); - //... -} - -``` - -The `verifyUpdate` function will verify the price update and return the payload and the verification fee. This call takes a fee which can be queried from [`verification_fee(){:solidity}`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazer.sol#L9) function and passed to the `verifyUpdate` call. This fee is used to cover the cost of verifying the price update. - -This SDK provides [`parsePayloadHeader`](https://github.com/pyth-network/pyth-crosschain/blob/main/lazer/contracts/evm/src/PythLazerLib.sol#L21) method to retrieve the values from the payload header. - -```solidity copy -(uint64 _timestamp, Channel channel, uint8 feedsLen, uint16 pos) = parsePayloadHeader(payload); -``` - -This method returns: - -- `_timestamp`: The timestamp of the price update. -- `channel`: The channel of the price update. -- `feedsLen`: The number of feeds in the price update. -- `pos`: The cursor position of the payload. - -One can iterate over all the feeds and properties present within the price update, modifying the state variables as necessary. - -Here is an example of how to iterate over the feeds and properties: - -```solidity copy -for (uint8 i = 0; i < feedsLen; i++) { - uint32 feedId; - uint8 num_properties; - (feedId, num_properties, pos) = parseFeedHeader(payload, pos); - for (uint8 j = 0; j < num_properties; j++) { - PriceFeedProperty property; - (property, pos) = parseFeedProperty(payload, pos); - if (property == PriceFeedProperty.Price) { - uint64 _price; - (_price, pos) = parseFeedValueUint64(payload, pos); - if (feedId == 2 && _timestamp > timestamp) { - price = _price; - timestamp = _timestamp; - } - } else if (property == PriceFeedProperty.BestBidPrice) { - uint64 _price; - (_price, pos) = parseFeedValueUint64(payload, pos); - } else if (property == PriceFeedProperty.BestAskPrice) { - uint64 _price; - (_price, pos) = parseFeedValueUint64(payload, pos); - } else { - revert("unknown property"); - } - } -} -``` - - - Make sure to pass the `pos` variable to every parsing call and assign the - returned `pos` value to the same variable. Failure to do so will cause - incorrect parsing results. - - - - When calling these parse functions, you must not skip price feeds or - properties. Every parsing function will modify your `pos` variable, so - skipping a call of `parseFeedHeader`, `parseFeedProperty`, or - `parseFeedValueUint64` will lead to incorrect parsing results. Keep in mind - that you can customize the set of price feeds and properties when requesting - price updates via WebSocket. This will be explained in the next step. - - -### Subscribe to Pyth Lazer to receive Price Updates - -Pyth Lazer provides a websocket endpoint to receive price updates. Moreover, Pyth Lazer also provides a [typescript SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to subscribe to the websocket endpoint. - -Consult [How to fetch price updates from Pyth Lazer](../fetch-price-updates.mdx) for a complete step-by-step guide. - -### Include the price updates into smart contract transactions - -Now that you have the price updates, and your smart contract is able to parse the price updates, you can include the price updates into the smart contract transactions by passing the price updates received from the previous step as an argument to the `updatePrice` method of your smart contract. - - +Pyth Lazer provides [pyth-lazer-sdk]() crate, which allows consumers to parse the price updates. ## Additional Resources From d4af9c8b85b7d5550e6edab0b3cce431d53ebb4f Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 17:00:07 -0500 Subject: [PATCH 14/16] fix build --- pages/lazer/integrate-as-consumer/svm.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/lazer/integrate-as-consumer/svm.mdx b/pages/lazer/integrate-as-consumer/svm.mdx index 0316b5cf..da07ff92 100644 --- a/pages/lazer/integrate-as-consumer/svm.mdx +++ b/pages/lazer/integrate-as-consumer/svm.mdx @@ -16,6 +16,8 @@ Integrating with Pyth Lazer in smart contracts as a consumer is a three-step pro Pyth Lazer provides [pyth-lazer-sdk]() crate, which allows consumers to parse the price updates. + + ## Additional Resources You may find these additional resources helpful for integrating Pyth Lazer into your EVM smart contracts. From faa463731de409f3e17648091067c44fe9ba9741 Mon Sep 17 00:00:00 2001 From: Aditya Arora Date: Tue, 14 Jan 2025 17:38:44 -0500 Subject: [PATCH 15/16] svm guide update --- .../how-lazer-works.mdx | 0 pages/lazer/integrate-as-consumer/svm.mdx | 163 +++++++++++++++++- 2 files changed, 159 insertions(+), 4 deletions(-) rename pages/lazer/{integrate-as-consumer => }/how-lazer-works.mdx (100%) diff --git a/pages/lazer/integrate-as-consumer/how-lazer-works.mdx b/pages/lazer/how-lazer-works.mdx similarity index 100% rename from pages/lazer/integrate-as-consumer/how-lazer-works.mdx rename to pages/lazer/how-lazer-works.mdx diff --git a/pages/lazer/integrate-as-consumer/svm.mdx b/pages/lazer/integrate-as-consumer/svm.mdx index da07ff92..b103768e 100644 --- a/pages/lazer/integrate-as-consumer/svm.mdx +++ b/pages/lazer/integrate-as-consumer/svm.mdx @@ -14,13 +14,168 @@ Integrating with Pyth Lazer in smart contracts as a consumer is a three-step pro ### Use Pyth Lazer SDK into smart contracts -Pyth Lazer provides [pyth-lazer-sdk]() crate, which allows consumers to parse the price updates. +Pyth Lazer provides a [Rust SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/rust), which allows consumers to parse the price updates. + +Add the following to your `Cargo.toml` file: + +```toml copy +[dependencies] +pyth-lazer-sdk = 0.1.0 +``` + +Now you can create an instruction or multiple instructions that will receive Pyth Lazer messages. +The instruction data sent to your program should include a byte array containing the Pyth Lazer message. The instruction data can also contain any other parameters your contracts may need. + +In order to successfully validate the Pyth Lazer message, the instruction needs to receive the standard Solana sysvar account and Pyth Lazer storage account (`3rdJbqfnagQ4yx9HXJViD4zc4xpiSqmFsKpPuSCQVyQL`). You may also add any other accounts you need. + +The following code can be used to set up a new instruction within a Solana contract: + +```rust copy +use num_derive::FromPrimitive; +use num_traits::FromPrimitive; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, FromPrimitive)] +pub enum Instruction { + //... + /// Update price. + /// Data: `UpdateArgs` followed by a signed Pyth Lazer update. + /// Accounts: + /// 1. sysvar account [readonly] - required for Pyth Lazer + /// 2. data account [writable] - needed by our example contract + /// 3. pyth storage account [readonly] - required for Pyth Lazer + Update = 1, +} + +/// Inputs to the `Update` instruction. `UpdateArgs` must be followed by a signed Pyth Lazer message. +#[derive(Debug, Clone, Copy, Zeroable, Pod)] +#[repr(C, packed)] +pub struct UpdateArgs { + /// Example argument + pub hello: u64, +} + +/// Program entrypoint's implementation. +pub fn process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + instruction_data: &[u8], +) -> ProgramResult { + // In our example contract, the first byte is the ID of the instruction. + let instruction = *instruction_data + .first() + .ok_or(ProgramError::InvalidInstructionData)?; + let instruction = + Instruction::from_u8(instruction).ok_or(ProgramError::InvalidInstructionData)?; + let instruction_args = &instruction_data[1..]; + + match instruction { + Instruction::Initialize => { + process_initialize_instruction(program_id, accounts, instruction_args) + } + Instruction::Update => process_update_instruction(program_id, accounts, instruction_args), + } +} + +pub fn process_update_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + instruction_args: &[u8], +) -> ProgramResult { + // Verify accounts passed to the instruction. + if accounts.len() != 3 { + return Err(ProgramError::NotEnoughAccountKeys); + } + let sysvar_account = &accounts[0]; + let data_account = &accounts[1]; + let pyth_storage_account = &accounts[2]; + // See below for next steps... +} +``` + +Call `pyth_lazer_sdk::verify_message{:rust}` function with appropriate arguments to validate the Pyth Lazer signature of the message. + +```rust copy +// Offset of pyth message within the original instruction_data. +// 1 byte is the instruction id. +let pyth_message_total_offset = size_of::() + 1; +// We expect the instruction to the built-in ed25519 program to be +// the first instruction within the transaction. +let ed25519_instruction_index = 0; +// We expect our signature to be the first (and only) signature to be checked +// by the built-in ed25519 program within the transaction. +let signature_index = 0; +// Check signature verification. +let verified = pyth_lazer_sdk::verify_message( + pyth_storage_account, + sysvar_account, + pyth_message, + ed25519_instruction_index, + signature_index, + pyth_message_total_offset.try_into().unwrap(), +)?; +``` + + + Note: When using native ed25519 signatures on Solana, we must use the built-in + ed25519 program provided by the Solana runtime. This program can't be invoked + from another contract. Instead, it must be called in an explicit instruction + within the submitted transaction. This means that the sender of the + transaction must include that instruction in the transaction. Our SDK + leverages Solana runtime capabilities to ensure the ed25519 program has been + correctly called in the transaction. + + +Now Parse the Pyth Lazer message. + +```rust copy +// Deserialize and use the payload. +let data = PayloadData::deserialize_slice_le(verified.payload) + .map_err(|_| ProgramError::InvalidInstructionData)?; + +if data.feeds.is_empty() || data.feeds[0].properties.is_empty() { + return Err(ProgramError::InvalidInstructionData); +} +``` + +Now you can update the state accourding to the contract's logic. + +```rust copy +// Read the data PDA of our example contract. +let mut state_data = data_account.data.borrow_mut(); +let state = + try_from_bytes_mut::(*state_data).map_err(|_| ProgramError::InvalidAccountData)?; + +if state.price_feed != data.feeds[0].feed_id.0 { + return Err(ProgramError::InvalidInstructionData); +} +if data.channel_id != Channel::RealTime.id() { + return Err(ProgramError::InvalidInstructionData); +} +if data.timestamp_us.0 <= state.latest_timestamp { + return Err(ProgramError::AccountAlreadyInitialized); +} +let PayloadPropertyValue::Price(Some(price)) = data.feeds[0].properties[0] else { + return Err(ProgramError::InvalidInstructionData); +}; +state.latest_price = price.into_inner().into(); +state.latest_timestamp = data.timestamp_us.0; +``` + +### Subscribe to Pyth Lazer to receive Price Updates + +Pyth Lazer provides a websocket endpoint to receive price updates. Moreover, Pyth Lazer also provides a [typescript SDK](https://github.com/pyth-network/pyth-crosschain/tree/main/lazer/sdk/js) to subscribe to the websocket endpoint. + +Consult [How to fetch price updates from Pyth Lazer](../fetch-price-updates.mdx) for a complete step-by-step guide. + +### Include the price updates into smart contract transactions + +Now that you have the price updates, and your smart contract is able to parse the price updates, you can include the price updates into the smart contract transactions by passing the price updates received from the previous step as an argument to the `update_price` method of your smart contract. ## Additional Resources -You may find these additional resources helpful for integrating Pyth Lazer into your EVM smart contracts. +You may find these additional resources helpful for integrating Pyth Lazer into your Solana smart contracts. ### Price Feed IDs @@ -28,7 +183,7 @@ Pyth Lazer supports a wide range of price feeds. Consult the [Price Feed IDs](.. ### Examples -[Pyth-lazer-example-evm](https://github.com/pyth-network/pyth-examples/tree/main/lazer/evm) is a simple example contract that parses and consumes price updates from Pyth Lazer. +[pyth-lazer-example-solana](https://github.com/pyth-network/pyth-examples/tree/main/lazer/solana) is a simple example contract that parses and consumes price updates from Pyth Lazer. [pyth-lazer-example-js](https://github.com/pyth-network/pyth-examples/tree/main/lazer/js) is a simple example for subscribing to the Pyth Lazer websocket. @@ -38,4 +193,4 @@ TODO: ### Error Codes -TODO: Add error codes for EVM. +TODO: Add error codes for Solana. From 904588223c83151f4d07a9616eb23524f9f2ac7d Mon Sep 17 00:00:00 2001 From: Ali Behjati Date: Wed, 15 Jan 2025 11:00:06 +0100 Subject: [PATCH 16/16] fix: remove todos and non existent links --- pages/lazer/_meta.json | 5 +---- pages/lazer/getting-started.mdx | 2 ++ pages/lazer/integrate-as-consumer.mdx | 10 +++++++++- ...h-price-updates.mdx => subscribe-price-updates.mdx} | 0 4 files changed, 12 insertions(+), 5 deletions(-) rename pages/lazer/{fetch-price-updates.mdx => subscribe-price-updates.mdx} (100%) diff --git a/pages/lazer/_meta.json b/pages/lazer/_meta.json index bc5688d3..5c98e5e7 100644 --- a/pages/lazer/_meta.json +++ b/pages/lazer/_meta.json @@ -32,11 +32,8 @@ "newWindow": true }, - "contract-addresses": "Contract Addresses", - - "errors": "Error Codes", "examples": { - "title": "Example Application ↗", + "title": "Example Applications ↗", "href": "https://github.com/pyth-network/pyth-examples/tree/main/lazer", "newWindow": true }, diff --git a/pages/lazer/getting-started.mdx b/pages/lazer/getting-started.mdx index 95b4a019..da529c2b 100644 --- a/pages/lazer/getting-started.mdx +++ b/pages/lazer/getting-started.mdx @@ -1 +1,3 @@ # Getting Started with Pyth Lazer + +Please refer to the how-to guides to get started. diff --git a/pages/lazer/integrate-as-consumer.mdx b/pages/lazer/integrate-as-consumer.mdx index 7a9ee87a..94185d3d 100644 --- a/pages/lazer/integrate-as-consumer.mdx +++ b/pages/lazer/integrate-as-consumer.mdx @@ -1,3 +1,11 @@ # How to Integrate Pyth Lazer as a Consumer -TODO: Fill this up. +The following guides demonstrate how to integrate Pyth Lazer as a consumer in your application. + +Lazer is available in Solana and EVM. Please consult the following guides to get started: + +- [Solana](integrate-as-consumer/svm) +- [EVM](integrate-as-consumer/evm) + +Lazer price feeds can also be used in off-chain applications. See the +[subscription guide](subscribe-price-updates) for more information. diff --git a/pages/lazer/fetch-price-updates.mdx b/pages/lazer/subscribe-price-updates.mdx similarity index 100% rename from pages/lazer/fetch-price-updates.mdx rename to pages/lazer/subscribe-price-updates.mdx