From f9dbeaa19acf5a29572299d3aaeb6be418e727ab Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:02:53 +0000 Subject: [PATCH 01/12] add dynamic jito tips --- apps/price_pusher/src/solana/solana.ts | 36 +++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 49d686a81b..f04f50f2d2 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -14,6 +14,7 @@ import { import { SearcherClient } from "jito-ts/dist/sdk/block-engine/searcher"; import { sliceAccumulatorUpdateData } from "@pythnetwork/price-service-sdk"; import { Logger } from "pino"; +import { LAMPORTS_PER_SOL } from "@solana/web3.js"; const HEALTH_CHECK_TIMEOUT_SECONDS = 60; @@ -161,11 +162,34 @@ export class SolanaPricePusherJito implements IPricePusher { private updatesPerJitoBundle: number ) {} + async getRecentJitoTipsLamports(): Promise { + try { + const response = await fetch( + "http://bundles-api-rest.jito.wtf/api/v1/bundles/tip_floor" + ); + if (!response.ok) { + this.logger.error(`Failed to fetch Jito tips: ${response.statusText}`); + return 0; + } + const data = await response.json(); + this.logger.info({ data }, "getRecentJitoTipsLamports"); + return Math.floor( + Number(data[0].landed_tips_25th_percentile) * LAMPORTS_PER_SOL + ); + } catch (err: any) { + this.logger.error(err, "getRecentJitoTips failed"); + return undefined; + } + } + async updatePriceFeed( priceIds: string[], // eslint-disable-next-line @typescript-eslint/no-unused-vars _pubTimesToPush: number[] ): Promise { + let jitoTip = + (await this.getRecentJitoTipsLamports()) ?? this.jitoTipLamports; + this.logger.info(`using jito tip of ${jitoTip} lamports`); let priceFeedUpdateData: string[]; try { priceFeedUpdateData = await this.priceServiceConnection.getLatestVaas( @@ -192,16 +216,16 @@ export class SolanaPricePusherJito implements IPricePusher { ); const transactions = await transactionBuilder.buildVersionedTransactions({ - jitoTipLamports: this.jitoTipLamports, + jitoTipLamports: jitoTip, tightComputeBudget: true, jitoBundleSize: this.jitoBundleSize, }); - await sendTransactionsJito( - transactions, - this.searcherClient, - this.pythSolanaReceiver.wallet - ); + // await sendTransactionsJito( + // transactions, + // this.searcherClient, + // this.pythSolanaReceiver.wallet + // ); } } } From 73ed1107da411e891d440093395f4db3dd7351c0 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:05:05 +0000 Subject: [PATCH 02/12] uncomment --- apps/price_pusher/src/solana/solana.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index f04f50f2d2..9e784fa29c 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -156,7 +156,7 @@ export class SolanaPricePusherJito implements IPricePusher { private priceServiceConnection: PriceServiceConnection, private logger: Logger, private shardId: number, - private jitoTipLamports: number, + private defaultJitoTipLamports: number, private searcherClient: SearcherClient, private jitoBundleSize: number, private updatesPerJitoBundle: number @@ -188,7 +188,7 @@ export class SolanaPricePusherJito implements IPricePusher { _pubTimesToPush: number[] ): Promise { let jitoTip = - (await this.getRecentJitoTipsLamports()) ?? this.jitoTipLamports; + (await this.getRecentJitoTipsLamports()) ?? this.defaultJitoTipLamports; this.logger.info(`using jito tip of ${jitoTip} lamports`); let priceFeedUpdateData: string[]; try { @@ -221,11 +221,11 @@ export class SolanaPricePusherJito implements IPricePusher { jitoBundleSize: this.jitoBundleSize, }); - // await sendTransactionsJito( - // transactions, - // this.searcherClient, - // this.pythSolanaReceiver.wallet - // ); + await sendTransactionsJito( + transactions, + this.searcherClient, + this.pythSolanaReceiver.wallet + ); } } } From c8c325950cd39ee4ae6e50d740677cb0a3268ec0 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:10:50 +0000 Subject: [PATCH 03/12] go --- apps/price_pusher/src/solana/solana.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 9e784fa29c..ab35532574 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -162,22 +162,24 @@ export class SolanaPricePusherJito implements IPricePusher { private updatesPerJitoBundle: number ) {} - async getRecentJitoTipsLamports(): Promise { + async getRecentJitoTipLamports(): Promise { try { const response = await fetch( "http://bundles-api-rest.jito.wtf/api/v1/bundles/tip_floor" ); if (!response.ok) { - this.logger.error(`Failed to fetch Jito tips: ${response.statusText}`); - return 0; + this.logger.error( + { status: response.status, statusText: response.statusText }, + "getRecentJitoTips http request failed" + ); + return undefined; } const data = await response.json(); - this.logger.info({ data }, "getRecentJitoTipsLamports"); return Math.floor( Number(data[0].landed_tips_25th_percentile) * LAMPORTS_PER_SOL ); } catch (err: any) { - this.logger.error(err, "getRecentJitoTips failed"); + this.logger.error({ err }, "getRecentJitoTips failed"); return undefined; } } @@ -187,8 +189,8 @@ export class SolanaPricePusherJito implements IPricePusher { // eslint-disable-next-line @typescript-eslint/no-unused-vars _pubTimesToPush: number[] ): Promise { - let jitoTip = - (await this.getRecentJitoTipsLamports()) ?? this.defaultJitoTipLamports; + const jitoTip = + (await this.getRecentJitoTipLamports()) ?? this.defaultJitoTipLamports; this.logger.info(`using jito tip of ${jitoTip} lamports`); let priceFeedUpdateData: string[]; try { From 60be3348f56709b4bc5dc23e1ec8c1913cc6cfb6 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:12:56 +0000 Subject: [PATCH 04/12] using jito tip --- apps/price_pusher/src/solana/solana.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index ab35532574..bac15392b7 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -191,7 +191,8 @@ export class SolanaPricePusherJito implements IPricePusher { ): Promise { const jitoTip = (await this.getRecentJitoTipLamports()) ?? this.defaultJitoTipLamports; - this.logger.info(`using jito tip of ${jitoTip} lamports`); + this.logger.info({ jitoTip }, "using jito tip of"); + let priceFeedUpdateData: string[]; try { priceFeedUpdateData = await this.priceServiceConnection.getLatestVaas( From ce4c1c92e62a16d9cfe8c8dc03ceee550d209087 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:21:44 +0000 Subject: [PATCH 05/12] go --- apps/price_pusher/src/solana/command.ts | 7 +++++++ apps/price_pusher/src/solana/solana.ts | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/price_pusher/src/solana/command.ts b/apps/price_pusher/src/solana/command.ts index edefd404be..e9910c5ad1 100644 --- a/apps/price_pusher/src/solana/command.ts +++ b/apps/price_pusher/src/solana/command.ts @@ -61,6 +61,11 @@ export default { type: "number", optional: true, } as Options, + "dynamic-jito-tips": { + description: "Use dynamic jito tips", + type: "boolean", + default: false, + } as Options, "jito-bundle-size": { description: "Number of transactions in each bundle", type: "number", @@ -94,6 +99,7 @@ export default { jitoEndpoint, jitoKeypairFile, jitoTipLamports, + dynamicJitoTips, jitoBundleSize, updatesPerJitoBundle, logLevel, @@ -148,6 +154,7 @@ export default { logger.child({ module: "SolanaPricePusherJito" }), shardId, jitoTipLamports, + dynamicJitoTips, jitoClient, jitoBundleSize, updatesPerJitoBundle diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index bac15392b7..5425c71c64 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -157,6 +157,7 @@ export class SolanaPricePusherJito implements IPricePusher { private logger: Logger, private shardId: number, private defaultJitoTipLamports: number, + private dynamicJitoTips: boolean, private searcherClient: SearcherClient, private jitoBundleSize: number, private updatesPerJitoBundle: number @@ -189,8 +190,9 @@ export class SolanaPricePusherJito implements IPricePusher { // eslint-disable-next-line @typescript-eslint/no-unused-vars _pubTimesToPush: number[] ): Promise { - const jitoTip = - (await this.getRecentJitoTipLamports()) ?? this.defaultJitoTipLamports; + const jitoTip = this.dynamicJitoTips + ? (await this.getRecentJitoTipLamports()) ?? this.defaultJitoTipLamports + : this.defaultJitoTipLamports; this.logger.info({ jitoTip }, "using jito tip of"); let priceFeedUpdateData: string[]; From 0567705010a46ae3644c838a0f42584d796b204d Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:27:19 +0000 Subject: [PATCH 06/12] bump --- apps/price_pusher/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/price_pusher/package.json b/apps/price_pusher/package.json index 5b98e86706..bbc8a5e516 100644 --- a/apps/price_pusher/package.json +++ b/apps/price_pusher/package.json @@ -1,6 +1,6 @@ { "name": "@pythnetwork/price-pusher", - "version": "8.1.0", + "version": "8.2.0", "description": "Pyth Price Pusher", "homepage": "https://pyth.network", "main": "lib/index.js", From 511d1cddce14e72b39e8b2d20f30975afc789ae2 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:33:27 +0000 Subject: [PATCH 07/12] cap it --- apps/price_pusher/src/solana/solana.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 5425c71c64..98ec158811 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -17,6 +17,7 @@ import { Logger } from "pino"; import { LAMPORTS_PER_SOL } from "@solana/web3.js"; const HEALTH_CHECK_TIMEOUT_SECONDS = 60; +const MAX_JITO_TIP_LAMPORTS = LAMPORTS_PER_SOL / 100; export class SolanaPriceListener extends ChainPriceListener { constructor( @@ -193,7 +194,9 @@ export class SolanaPricePusherJito implements IPricePusher { const jitoTip = this.dynamicJitoTips ? (await this.getRecentJitoTipLamports()) ?? this.defaultJitoTipLamports : this.defaultJitoTipLamports; - this.logger.info({ jitoTip }, "using jito tip of"); + + const cappedJitoTip = Math.min(jitoTip, MAX_JITO_TIP_LAMPORTS); + this.logger.info({ cappedJitoTip }, "using jito tip of"); let priceFeedUpdateData: string[]; try { @@ -221,7 +224,7 @@ export class SolanaPricePusherJito implements IPricePusher { ); const transactions = await transactionBuilder.buildVersionedTransactions({ - jitoTipLamports: jitoTip, + jitoTipLamports: cappedJitoTip, tightComputeBudget: true, jitoBundleSize: this.jitoBundleSize, }); From 9b340fc20bc80dee792b739b3bc587d61d9b3e12 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:37:44 +0000 Subject: [PATCH 08/12] go --- apps/price_pusher/src/solana/solana.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 98ec158811..bb714ba346 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -229,11 +229,11 @@ export class SolanaPricePusherJito implements IPricePusher { jitoBundleSize: this.jitoBundleSize, }); - await sendTransactionsJito( - transactions, - this.searcherClient, - this.pythSolanaReceiver.wallet - ); + // await sendTransactionsJito( + // transactions, + // this.searcherClient, + // this.pythSolanaReceiver.wallet + // ); } } } From 1583c8a0e9995310f9fb4d39217ff9b24f19cec7 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Tue, 12 Nov 2024 20:38:25 +0000 Subject: [PATCH 09/12] go --- apps/price_pusher/src/solana/solana.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index bb714ba346..98ec158811 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -229,11 +229,11 @@ export class SolanaPricePusherJito implements IPricePusher { jitoBundleSize: this.jitoBundleSize, }); - // await sendTransactionsJito( - // transactions, - // this.searcherClient, - // this.pythSolanaReceiver.wallet - // ); + await sendTransactionsJito( + transactions, + this.searcherClient, + this.pythSolanaReceiver.wallet + ); } } } From 7669f2435df2913646d10df4f187f8a6acaf0d7f Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 13 Nov 2024 16:20:14 +0000 Subject: [PATCH 10/12] test --- apps/price_pusher/src/solana/command.ts | 9 ++++++++- apps/price_pusher/src/solana/solana.ts | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/price_pusher/src/solana/command.ts b/apps/price_pusher/src/solana/command.ts index e9910c5ad1..8d4e1dcb3d 100644 --- a/apps/price_pusher/src/solana/command.ts +++ b/apps/price_pusher/src/solana/command.ts @@ -11,7 +11,7 @@ import { import { Controller } from "../controller"; import { PythSolanaReceiver } from "@pythnetwork/pyth-solana-receiver"; import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; -import { Keypair, Connection } from "@solana/web3.js"; +import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js"; import fs from "fs"; import { PublicKey } from "@solana/web3.js"; import { @@ -66,6 +66,11 @@ export default { type: "boolean", default: false, } as Options, + "max-jito-tip-lamports": { + description: "Maximum jito tip lamports", + type: "number", + default: LAMPORTS_PER_SOL / 100, + } as Options, "jito-bundle-size": { description: "Number of transactions in each bundle", type: "number", @@ -100,6 +105,7 @@ export default { jitoKeypairFile, jitoTipLamports, dynamicJitoTips, + maxJitoTipLamports, jitoBundleSize, updatesPerJitoBundle, logLevel, @@ -155,6 +161,7 @@ export default { shardId, jitoTipLamports, dynamicJitoTips, + maxJitoTipLamports, jitoClient, jitoBundleSize, updatesPerJitoBundle diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 98ec158811..b463e9214f 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -17,7 +17,6 @@ import { Logger } from "pino"; import { LAMPORTS_PER_SOL } from "@solana/web3.js"; const HEALTH_CHECK_TIMEOUT_SECONDS = 60; -const MAX_JITO_TIP_LAMPORTS = LAMPORTS_PER_SOL / 100; export class SolanaPriceListener extends ChainPriceListener { constructor( @@ -159,6 +158,7 @@ export class SolanaPricePusherJito implements IPricePusher { private shardId: number, private defaultJitoTipLamports: number, private dynamicJitoTips: boolean, + private maxJitoTipLamports: number, private searcherClient: SearcherClient, private jitoBundleSize: number, private updatesPerJitoBundle: number @@ -195,7 +195,7 @@ export class SolanaPricePusherJito implements IPricePusher { ? (await this.getRecentJitoTipLamports()) ?? this.defaultJitoTipLamports : this.defaultJitoTipLamports; - const cappedJitoTip = Math.min(jitoTip, MAX_JITO_TIP_LAMPORTS); + const cappedJitoTip = Math.min(jitoTip, this.maxJitoTipLamports); this.logger.info({ cappedJitoTip }, "using jito tip of"); let priceFeedUpdateData: string[]; From 1ee31056a0e29a8d91aafe7cca165e202d734a52 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 13 Nov 2024 16:43:37 +0000 Subject: [PATCH 11/12] disable health check --- apps/price_pusher/src/solana/solana.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index b463e9214f..5362bc1eaf 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -49,7 +49,6 @@ export class SolanaPriceListener extends ChainPriceListener { } seconds` ); } - throw new Error("Solana connection is unhealthy"); } } From 4a350a6cd493245c10c5f4b82df953e9a950b90f Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Wed, 13 Nov 2024 16:46:22 +0000 Subject: [PATCH 12/12] go --- apps/price_pusher/src/solana/solana.ts | 30 +++++++++++++++----------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/apps/price_pusher/src/solana/solana.ts b/apps/price_pusher/src/solana/solana.ts index 5362bc1eaf..cab4899a20 100644 --- a/apps/price_pusher/src/solana/solana.ts +++ b/apps/price_pusher/src/solana/solana.ts @@ -35,20 +35,24 @@ export class SolanaPriceListener extends ChainPriceListener { // and ensuring it is not older than 30 seconds. private async checkHealth() { const slot = await this.pythSolanaReceiver.connection.getSlot("finalized"); - const blockTime = await this.pythSolanaReceiver.connection.getBlockTime( - slot - ); - if ( - blockTime === null || - blockTime < Date.now() / 1000 - HEALTH_CHECK_TIMEOUT_SECONDS - ) { - if (blockTime !== null) { - this.logger.info( - `Solana connection is behind by ${ - Date.now() / 1000 - blockTime - } seconds` - ); + try { + const blockTime = await this.pythSolanaReceiver.connection.getBlockTime( + slot + ); + if ( + blockTime === null || + blockTime < Date.now() / 1000 - HEALTH_CHECK_TIMEOUT_SECONDS + ) { + if (blockTime !== null) { + this.logger.info( + `Solana connection is behind by ${ + Date.now() / 1000 - blockTime + } seconds` + ); + } } + } catch (err) { + this.logger.error({ err }, "checkHealth failed"); } }