-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunding-rates.ts
More file actions
93 lines (79 loc) · 2.71 KB
/
Copy pathfunding-rates.ts
File metadata and controls
93 lines (79 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { Injectable, Logger, Inject } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
import { EnvService } from '@/common/env';
import { DatabaseService } from '@/common/database';
import { S3_CLIENT } from '@/common/object-storage';
import {
HyperliquidService,
type PredictedFundingData,
type HlPerpData,
} from '@/common/hyperliquid';
@Injectable()
export class FundingRatesJob {
private readonly logger = new Logger(FundingRatesJob.name);
private readonly bucket: string;
constructor(
private readonly hyperliquidService: HyperliquidService,
private readonly envService: EnvService,
private readonly databaseService: DatabaseService,
@Inject(S3_CLIENT) private readonly s3Client: S3Client,
) {
const { S3_BUCKET } = this.envService.get();
this.bucket = S3_BUCKET;
}
@Cron(CronExpression.EVERY_HOUR)
async fetchAndSaveFundingData(): Promise<void> {
try {
this.logger.log('Starting scheduled funding data fetch');
const { rawData, hlPerpData } =
await this.hyperliquidService.fetchPredictedFundings();
await Promise.all([
this.saveRawData(rawData),
this.processFundingData(hlPerpData),
]);
this.logger.log('Successfully completed funding data fetch and save');
} catch (error) {
this.logger.error('Failed to fetch and save funding data', error);
}
}
private async saveRawData(rawData: PredictedFundingData[]): Promise<void> {
try {
const timestamp = new Date().toISOString();
const key = `funding-rates/raw/${timestamp}.json`;
const jsonString = JSON.stringify(rawData, null, 2);
await this.s3Client.send(
new PutObjectCommand({
Bucket: this.bucket,
Key: key,
Body: jsonString,
ContentType: 'application/json',
}),
);
this.logger.log(`Saved raw funding data to ${key}`);
} catch (error) {
this.logger.error(`Failed to save raw data: ${(error as Error).message}`);
throw error;
}
}
private async processFundingData(fundingData: HlPerpData[]): Promise<void> {
try {
const readingTime = new Date();
const fundingRateEntries = fundingData.map(({ ticker, fundingRate }) => ({
ticker,
fundingRate,
readingTime,
}));
await this.databaseService.fundingRates.createMany({
data: fundingRateEntries,
skipDuplicates: true,
});
this.logger.log(
`Successfully saved ${fundingRateEntries.length} funding rate entries`,
);
} catch (error) {
this.logger.error('Failed to process funding data', error);
throw error;
}
}
}