@@ -21,6 +21,10 @@ import pino from "pino";
21
21
import { Logger } from "pino" ;
22
22
import { HermesClient } from "@pythnetwork/hermes-client" ;
23
23
import { filterInvalidPriceItems } from "../utils" ;
24
+ import { PricePusherMetrics } from "../metrics" ;
25
+ import { createSolanaBalanceTracker } from "./balance-tracker" ;
26
+ import { IBalanceTracker } from "../interface" ;
27
+
24
28
export default {
25
29
command : "solana" ,
26
30
describe : "run price pusher for solana" ,
@@ -99,6 +103,8 @@ export default {
99
103
...options . pushingFrequency ,
100
104
...options . logLevel ,
101
105
...options . controllerLogLevel ,
106
+ ...options . enableMetrics ,
107
+ ...options . metricsPort ,
102
108
} ,
103
109
handler : async function ( argv : any ) {
104
110
const {
@@ -122,6 +128,8 @@ export default {
122
128
treasuryId,
123
129
logLevel,
124
130
controllerLogLevel,
131
+ enableMetrics,
132
+ metricsPort,
125
133
} = argv ;
126
134
127
135
const logger = pino ( { level : logLevel } ) ;
@@ -130,6 +138,14 @@ export default {
130
138
131
139
const hermesClient = new HermesClient ( priceServiceEndpoint ) ;
132
140
141
+ // Initialize metrics if enabled
142
+ let metrics : PricePusherMetrics | undefined ;
143
+ if ( enableMetrics ) {
144
+ metrics = new PricePusherMetrics ( logger . child ( { module : "Metrics" } ) ) ;
145
+ metrics . start ( metricsPort ) ;
146
+ logger . info ( `Metrics server started on port ${ metricsPort } ` ) ;
147
+ }
148
+
133
149
let priceItems = priceConfigs . map ( ( { id, alias } ) => ( { id, alias } ) ) ;
134
150
135
151
// Better to filter out invalid price items before creating the pyth listener
@@ -152,11 +168,10 @@ export default {
152
168
logger . child ( { module : "PythPriceListener" } ) ,
153
169
) ;
154
170
155
- const wallet = new NodeWallet (
156
- Keypair . fromSecretKey (
157
- Uint8Array . from ( JSON . parse ( fs . readFileSync ( keypairFile , "ascii" ) ) ) ,
158
- ) ,
171
+ const keypair = Keypair . fromSecretKey (
172
+ Uint8Array . from ( JSON . parse ( fs . readFileSync ( keypairFile , "ascii" ) ) ) ,
159
173
) ;
174
+ const wallet = new NodeWallet ( keypair ) ;
160
175
161
176
const connection = new Connection ( endpoint , "processed" ) ;
162
177
const pythSolanaReceiver = new PythSolanaReceiver ( {
@@ -166,6 +181,21 @@ export default {
166
181
treasuryId : treasuryId ,
167
182
} ) ;
168
183
184
+ // Create and start the balance tracker if metrics are enabled
185
+ if ( metrics ) {
186
+ const balanceTracker : IBalanceTracker = createSolanaBalanceTracker ( {
187
+ connection,
188
+ publicKey : keypair . publicKey ,
189
+ network : "solana" ,
190
+ updateInterval : 60 ,
191
+ metrics,
192
+ logger,
193
+ } ) ;
194
+
195
+ // Start the balance tracker
196
+ await balanceTracker . start ( ) ;
197
+ }
198
+
169
199
// Fetch the account lookup table if provided
170
200
const lookupTableAccount = addressLookupTableAccount
171
201
? await connection
@@ -220,7 +250,10 @@ export default {
220
250
solanaPriceListener ,
221
251
solanaPricePusher ,
222
252
logger . child ( { module : "Controller" } , { level : controllerLogLevel } ) ,
223
- { pushingFrequency } ,
253
+ {
254
+ pushingFrequency,
255
+ metrics,
256
+ } ,
224
257
) ;
225
258
226
259
controller . start ( ) ;
0 commit comments