diff --git a/package-lock.json b/package-lock.json index b0825e7..54bd91e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@pythnetwork/pyth-sdk-js", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@pythnetwork/pyth-sdk-js", - "version": "1.1.0", + "version": "1.2.0", "license": "Apache-2.0", "devDependencies": { "@types/jest": "^27.4.1", diff --git a/package.json b/package.json index ef4819a..1338394 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pythnetwork/pyth-sdk-js", - "version": "1.1.0", + "version": "1.2.0", "description": "Pyth Network SDK in JS", "homepage": "https://pyth.network", "main": "lib/index.js", diff --git a/src/__tests__/PriceFeed.test.ts b/src/__tests__/PriceFeed.test.ts index ab7a277..fbb64ee 100644 --- a/src/__tests__/PriceFeed.test.ts +++ b/src/__tests__/PriceFeed.test.ts @@ -84,3 +84,28 @@ test("getMetadata returns PriceFeedMetadata as expected", () => { }) ); }); + +test("getVAA returns string as expected", () => { + const data = { + ema_price: { + conf: "2", + expo: 4, + price: "3", + publish_time: 11, + }, + id: "abcdef0123456789", + price: { + conf: "1", + expo: 4, + price: "10", + publish_time: 11, + }, + vaa: "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef", + }; + + const priceFeed = PriceFeed.fromJson(data); + + expect(priceFeed.getVAA()).toStrictEqual( + "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef" + ); +}); diff --git a/src/index.ts b/src/index.ts index 76dc51b..5312e57 100644 --- a/src/index.ts +++ b/src/index.ts @@ -153,6 +153,10 @@ export class PriceFeed { * Metadata of the price */ metadata?: PriceFeedMetadata; + /** + * VAA of the price + */ + vaa?: string; /** * Price */ @@ -162,11 +166,13 @@ export class PriceFeed { emaPrice: Price; id: HexString; metadata?: PriceFeedMetadata; + vaa?: string; price: Price; }) { this.emaPrice = rawFeed.emaPrice; this.id = rawFeed.id; this.metadata = rawFeed.metadata; + this.vaa = rawFeed.vaa; this.price = rawFeed.price; } @@ -176,6 +182,7 @@ export class PriceFeed { emaPrice: Price.fromJson(jsonFeed.ema_price), id: jsonFeed.id, metadata: PriceFeedMetadata.fromJson(jsonFeed.metadata), + vaa: jsonFeed.vaa, price: Price.fromJson(jsonFeed.price), }); } @@ -293,4 +300,14 @@ export class PriceFeed { getMetadata(): PriceFeedMetadata | undefined { return this.metadata; } + + /** + * Get the price feed vaa. + * + * @returns vaa in base64. + * Returns `undefined` if vaa is unavailable. + */ + getVAA(): string | undefined { + return this.vaa; + } } diff --git a/src/schemas/PriceFeed.ts b/src/schemas/PriceFeed.ts index 3e3cb1f..8e2b26a 100644 --- a/src/schemas/PriceFeed.ts +++ b/src/schemas/PriceFeed.ts @@ -27,10 +27,18 @@ export interface PriceFeed { * Price */ price: Price; + /** + * VAA of the price + */ + vaa?: string; } /** + * Exponentially-weighted moving average Price + * * Represents a Pyth price + * + * Price */ export interface Price { /** @@ -261,6 +269,7 @@ const typeMap: any = { typ: u(undefined, r("PriceFeedMetadata")), }, { json: "price", js: "price", typ: r("Price") }, + { json: "vaa", js: "vaa", typ: u(undefined, "") }, ], "any" ), diff --git a/src/schemas/price_feed.json b/src/schemas/price_feed.json index 0fb4678..c103de6 100644 --- a/src/schemas/price_feed.json +++ b/src/schemas/price_feed.json @@ -3,11 +3,7 @@ "title": "PriceFeed", "description": "Represents an aggregate price from Pyth publisher feeds.", "type": "object", - "required": [ - "id", - "price", - "ema_price" - ], + "required": ["id", "price", "ema_price"], "properties": { "id": { "description": "Unique identifier for this price.", @@ -24,6 +20,10 @@ "metadata": { "description": "Metadata of the price", "$ref": "#/definitions/PriceFeedMetadata" + }, + "vaa": { + "description": "VAA of the price", + "$ref": "#/definitions/Identifier" } }, "definitions": { @@ -52,13 +52,18 @@ "description": "Publish Time of the price", "type": "integer", "format": "int64" - } + } } }, "PriceFeedMetadata": { "description": "Represents metadata of a price feed.", "type": "object", - "required": ["attestation_time", "emitter_chain", "price_service_receive_time", "sequence_number"], + "required": [ + "attestation_time", + "emitter_chain", + "price_service_receive_time", + "sequence_number" + ], "properties": { "attestation_time": { "description": "Attestation time of the price",