From a72908c7ef24ba7d28b97f0ef4a4df2f7b1079cb Mon Sep 17 00:00:00 2001 From: Jayant Krishnamurthy Date: Mon, 1 Nov 2021 08:49:14 -0700 Subject: [PATCH 1/4] Check the status of the price --- src/example_usage.ts | 9 +++++++-- src/index.ts | 25 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/example_usage.ts b/src/example_usage.ts index 138eb52..edca17e 100644 --- a/src/example_usage.ts +++ b/src/example_usage.ts @@ -10,8 +10,13 @@ const pythConnection = new PythConnection(connection, pythPublicKey) pythConnection.onPriceChange((product, price) => { // sample output: // SRM/USD: $8.68725 ±$0.0131 - // tslint:disable-next-line:no-console - console.log(`${product.symbol}: $${price.price} \xB1$${price.confidence}`) + if (price.price && price.confidence) { + // tslint:disable-next-line:no-console + console.log(`${product.symbol}: $${price.price} \xB1$${price.confidence}`) + } else { + // tslint:disable-next-line:no-console + console.log(`${product.symbol}: price currently unavailable`) + } }) // tslint:disable-next-line:no-console diff --git a/src/index.ts b/src/index.ts index ef6780d..3571e21 100644 --- a/src/index.ts +++ b/src/index.ts @@ -67,7 +67,7 @@ export interface Ema { denominator: bigint } -export interface PriceData extends Base, Price { +export interface PriceData extends Base { priceType: number exponent: number numComponentPrices: number @@ -90,6 +90,15 @@ export interface PriceData extends Base, Price { drv3Component: bigint drv3: number priceComponents: PriceComponent[] + aggregate: Price, + // The current price and confidence. The typical use of this interface is to consume these two fields. + // If undefined, Pyth does not currently have price information for this product. This condition can + // happen for various reasons (e.g., US equity market is closed, or insufficient publishers), and your + // application should handle it gracefully. Note that other raw price information fields (such as + // aggregate.price) may be defined even if this is undefined; you most likely should not use those fields, + // as their value can be arbitrary when this is undefined. + price: number | undefined + confidence: number | undefined, } /** Parse data as a generic Pyth account. Use this method if you don't know the account type. */ @@ -257,7 +266,14 @@ export const parsePriceData = (data: Buffer): PriceData => { // space for future derived values const drv3Component = readBigInt64LE(data, 200) const drv3 = Number(drv3Component) * 10 ** exponent - const aggregatePriceInfo = parsePriceInfo(data.slice(208, 240), exponent) + const aggregate = parsePriceInfo(data.slice(208, 240), exponent) + + let price, confidence = undefined + if (aggregate.status == 1) { + price = aggregate.price + confidence = aggregate.confidence + } + // price components - up to 32 const priceComponents: PriceComponent[] = [] let offset = 240 @@ -275,6 +291,7 @@ export const parsePriceData = (data: Buffer): PriceData => { shouldContinue = false } } + return { magic, version, @@ -301,8 +318,10 @@ export const parsePriceData = (data: Buffer): PriceData => { previousConfidence, drv3Component, drv3, - ...aggregatePriceInfo, + aggregate, priceComponents, + price, + confidence } } From 98b738013df3501086789acc0c5d17eba94dd6b8 Mon Sep 17 00:00:00 2001 From: Jayant Krishnamurthy Date: Mon, 1 Nov 2021 08:51:00 -0700 Subject: [PATCH 2/4] fix lint errors --- src/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3571e21..313500a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -268,8 +268,9 @@ export const parsePriceData = (data: Buffer): PriceData => { const drv3 = Number(drv3Component) * 10 ** exponent const aggregate = parsePriceInfo(data.slice(208, 240), exponent) - let price, confidence = undefined - if (aggregate.status == 1) { + let price + let confidence + if (aggregate.status === 1) { price = aggregate.price confidence = aggregate.confidence } @@ -282,11 +283,11 @@ export const parsePriceData = (data: Buffer): PriceData => { const publisher = PKorNull(data.slice(offset, offset + 32)) offset += 32 if (publisher) { - const aggregate = parsePriceInfo(data.slice(offset, offset + 32), exponent) + const componentAggregate = parsePriceInfo(data.slice(offset, offset + 32), exponent) offset += 32 const latest = parsePriceInfo(data.slice(offset, offset + 32), exponent) offset += 32 - priceComponents.push({ publisher, aggregate, latest }) + priceComponents.push({ publisher, aggregate: componentAggregate, latest }) } else { shouldContinue = false } From 5dc81b21e554818656ec4a85b9749450e9a84d2d Mon Sep 17 00:00:00 2001 From: Jayant Krishnamurthy Date: Mon, 1 Nov 2021 09:11:17 -0700 Subject: [PATCH 3/4] drive-by: bump solana web3 version --- package-lock.json | 173 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 130 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0b951d2..341b390 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@pythnetwork/client", - "version": "2.3.0", + "version": "2.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@pythnetwork/client", - "version": "2.3.0", + "version": "2.3.2", "license": "Apache-2.0", "dependencies": { - "@solana/web3.js": "^1.10.1", + "@solana/web3.js": "^1.30.2", "assert": "^2.0.0", "buffer": "^6.0.1" }, @@ -621,6 +621,59 @@ "node": ">=0.1.95" } }, + "node_modules/@ethersproject/bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", + "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.5.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", + "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/sha2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", + "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "hash.js": "1.1.7" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -891,25 +944,39 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@solana/buffer-layout": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", + "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", + "dependencies": { + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" + } + }, "node_modules/@solana/web3.js": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.18.0.tgz", - "integrity": "sha512-ijAoRd4Sje1QYoPAwDr7KYlDK40FE7tAUa2V3wT4PGKatWf4ETDXoyYlW89J6vrqOT+mV3GUuaVC76tOFlrXyA==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.30.2.tgz", + "integrity": "sha512-hznCj+rkfvM5taRP3Z+l5lumB7IQnDrB4l55Wpsg4kDU9Zds8pE5YOH5Z9bbF/pUzZJKQjyBjnY/6kScBm3Ugg==", "dependencies": { "@babel/runtime": "^7.12.5", + "@ethersproject/sha2": "^5.5.0", + "@solana/buffer-layout": "^3.0.0", "bn.js": "^5.0.0", "borsh": "^0.4.0", "bs58": "^4.0.1", "buffer": "6.0.1", - "buffer-layout": "^1.2.0", - "crypto-hash": "^1.2.2", + "cross-fetch": "^3.1.4", "jayson": "^3.4.4", "js-sha3": "^0.8.0", - "node-fetch": "^2.6.1", "rpc-websockets": "^7.4.2", "secp256k1": "^4.0.2", "superstruct": "^0.14.2", "tweetnacl": "^1.0.0" + }, + "engines": { + "node": ">=12.20.0" } }, "node_modules/@solana/web3.js/node_modules/buffer": { @@ -1635,14 +1702,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "node_modules/buffer-layout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.1.tgz", - "integrity": "sha512-RUTGEYG1vX0Zp1dStQFl8yeU/LEBPXVtHwzzDbPWkE5zq+Prt9fkFLKNiwmaeHg6BBiRMcQAgj4cynazO6eekw==", - "engines": { - "node": ">=4.5" - } - }, "node_modules/bufferutil": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", @@ -2005,6 +2064,14 @@ "node": ">=0.10.0" } }, + "node_modules/cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2019,17 +2086,6 @@ "node": ">= 8" } }, - "node_modules/crypto-hash": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", - "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -7655,6 +7711,29 @@ "minimist": "^1.2.0" } }, + "@ethersproject/bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", + "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", + "requires": { + "@ethersproject/logger": "^5.5.0" + } + }, + "@ethersproject/logger": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", + "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==" + }, + "@ethersproject/sha2": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz", + "integrity": "sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA==", + "requires": { + "@ethersproject/bytes": "^5.5.0", + "@ethersproject/logger": "^5.5.0", + "hash.js": "1.1.7" + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -7884,21 +7963,29 @@ "@sinonjs/commons": "^1.7.0" } }, + "@solana/buffer-layout": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz", + "integrity": "sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w==", + "requires": { + "buffer": "~6.0.3" + } + }, "@solana/web3.js": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.18.0.tgz", - "integrity": "sha512-ijAoRd4Sje1QYoPAwDr7KYlDK40FE7tAUa2V3wT4PGKatWf4ETDXoyYlW89J6vrqOT+mV3GUuaVC76tOFlrXyA==", + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.30.2.tgz", + "integrity": "sha512-hznCj+rkfvM5taRP3Z+l5lumB7IQnDrB4l55Wpsg4kDU9Zds8pE5YOH5Z9bbF/pUzZJKQjyBjnY/6kScBm3Ugg==", "requires": { "@babel/runtime": "^7.12.5", + "@ethersproject/sha2": "^5.5.0", + "@solana/buffer-layout": "^3.0.0", "bn.js": "^5.0.0", "borsh": "^0.4.0", "bs58": "^4.0.1", "buffer": "6.0.1", - "buffer-layout": "^1.2.0", - "crypto-hash": "^1.2.2", + "cross-fetch": "^3.1.4", "jayson": "^3.4.4", "js-sha3": "^0.8.0", - "node-fetch": "^2.6.1", "rpc-websockets": "^7.4.2", "secp256k1": "^4.0.2", "superstruct": "^0.14.2", @@ -8475,11 +8562,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-layout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.1.tgz", - "integrity": "sha512-RUTGEYG1vX0Zp1dStQFl8yeU/LEBPXVtHwzzDbPWkE5zq+Prt9fkFLKNiwmaeHg6BBiRMcQAgj4cynazO6eekw==" - }, "bufferutil": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", @@ -8774,6 +8856,14 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8785,11 +8875,6 @@ "which": "^2.0.1" } }, - "crypto-hash": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", - "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==" - }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", diff --git a/package.json b/package.json index 69cefc0..8fc7885 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "typescript": "^4.2.4" }, "dependencies": { - "@solana/web3.js": "^1.10.1", + "@solana/web3.js": "^1.30.2", "assert": "^2.0.0", "buffer": "^6.0.1" } From 891674a07afe835fd6d256f2fbb635ab7966f569 Mon Sep 17 00:00:00 2001 From: Jayant Krishnamurthy Date: Mon, 1 Nov 2021 10:31:01 -0700 Subject: [PATCH 4/4] bump minor version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8fc7885..0be9173 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pythnetwork/client", - "version": "2.3.2", + "version": "2.4.0", "description": "Client for consuming Pyth price data", "homepage": "https://pyth.network", "main": "lib/index.js",