diff --git a/third_party/pyth/price-service/package-lock.json b/third_party/pyth/price-service/package-lock.json index f1c40d9c14..af0a70c76c 100644 --- a/third_party/pyth/price-service/package-lock.json +++ b/third_party/pyth/price-service/package-lock.json @@ -1,12 +1,12 @@ { "name": "@pythnetwork/pyth-price-service", - "version": "2.2.2", + "version": "2.2.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@pythnetwork/pyth-price-service", - "version": "2.2.2", + "version": "2.2.3", "license": "Apache-2.0", "dependencies": { "@certusone/wormhole-sdk": "^0.1.4", diff --git a/third_party/pyth/price-service/package.json b/third_party/pyth/price-service/package.json index bc3164d4e6..bd1ed15750 100644 --- a/third_party/pyth/price-service/package.json +++ b/third_party/pyth/price-service/package.json @@ -1,6 +1,6 @@ { "name": "@pythnetwork/pyth-price-service", - "version": "2.2.2", + "version": "2.2.3", "description": "Pyth Price Service", "main": "index.js", "scripts": { diff --git a/third_party/pyth/price-service/src/listen.ts b/third_party/pyth/price-service/src/listen.ts index 781302a267..85ba3fc12f 100644 --- a/third_party/pyth/price-service/src/listen.ts +++ b/third_party/pyth/price-service/src/listen.ts @@ -155,6 +155,28 @@ export class Listener implements PriceStore { } } + isNewPriceInfo( + cachedInfo: PriceInfo | undefined, + observedInfo: PriceInfo + ): boolean { + if (cachedInfo === undefined) { + return true; + } + + if (cachedInfo.attestationTime < observedInfo.attestationTime) { + return true; + } + + if ( + cachedInfo.attestationTime === observedInfo.attestationTime && + cachedInfo.seqNum < observedInfo.seqNum + ) { + return true; + } + + return false; + } + async processVaa(vaa: Buffer) { const { parse_vaa } = await importCoreWasm(); @@ -184,55 +206,31 @@ export class Listener implements PriceStore { return; } - const isAnyPriceNew = batchAttestation.priceAttestations.some( - (priceAttestation) => { - const key = priceAttestation.priceId; - const lastAttestationTime = - this.priceFeedVaaMap.get(key)?.attestationTime; - return ( - lastAttestationTime === undefined || - lastAttestationTime < priceAttestation.attestationTime - ); - } - ); - - if (!isAnyPriceNew) { - return; - } - for (const priceAttestation of batchAttestation.priceAttestations) { const key = priceAttestation.priceId; - const lastAttestationTime = - this.priceFeedVaaMap.get(key)?.attestationTime; - - if ( - lastAttestationTime === undefined || - lastAttestationTime < priceAttestation.attestationTime - ) { - const priceFeed = priceAttestationToPriceFeed(priceAttestation); - const priceInfo = { - seqNum: parsedVaa.sequence, - vaa, - publishTime: priceAttestation.publishTime, - attestationTime: priceAttestation.attestationTime, - priceFeed, - emitterChainId: parsedVaa.emitter_chain, - priceServiceReceiveTime: Math.floor(new Date().getTime() / 1000), - }; + const priceFeed = priceAttestationToPriceFeed(priceAttestation); + const priceInfo = { + seqNum: parsedVaa.sequence, + vaa, + publishTime: priceAttestation.publishTime, + attestationTime: priceAttestation.attestationTime, + priceFeed, + emitterChainId: parsedVaa.emitter_chain, + priceServiceReceiveTime: Math.floor(new Date().getTime() / 1000), + }; + + const cachedPriceInfo = this.priceFeedVaaMap.get(key); + + if (this.isNewPriceInfo(cachedPriceInfo, priceInfo)) { this.priceFeedVaaMap.set(key, priceInfo); - if (lastAttestationTime !== undefined) { + if (cachedPriceInfo !== undefined) { this.promClient?.addPriceUpdatesAttestationTimeGap( - priceAttestation.attestationTime - lastAttestationTime + priceAttestation.attestationTime - cachedPriceInfo.attestationTime ); - } - - const lastPublishTime = this.priceFeedVaaMap.get(key)?.publishTime; - - if (lastPublishTime !== undefined) { this.promClient?.addPriceUpdatesPublishTimeGap( - priceAttestation.publishTime - lastPublishTime + priceAttestation.publishTime - cachedPriceInfo.publishTime ); }