Skip to content

Commit

Permalink
add mex token charts
Browse files Browse the repository at this point in the history
  • Loading branch information
cfaur09 committed Sep 19, 2024
1 parent 28dce31 commit 8159283
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 1 deletion.
17 changes: 17 additions & 0 deletions src/endpoints/mex/entities/mex.token.chart.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Field, ObjectType } from "@nestjs/graphql";
import { ApiProperty } from "@nestjs/swagger";

@ObjectType("MexTokenChart", { description: "MexTokenChart object type." })
export class MexTokenChart {
constructor(init?: Partial<MexTokenChart>) {
Object.assign(this, init);
}

@Field(() => String, { description: "Timestamp details." })
@ApiProperty()
timestamp: number = 0;

@Field(() => String, { description: "Value details." })
@ApiProperty()
value: number = 0;
}
18 changes: 17 additions & 1 deletion src/endpoints/mex/mex.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import { QueryPagination } from 'src/common/entities/query.pagination';
import { ParseIntPipe, ParseTokenPipe, ParseEnumPipe } from '@multiversx/sdk-nestjs-common';
import { MexPairExchange } from './entities/mex.pair.exchange';
import { MexPairsFilter } from './entities/mex.pairs..filter';
import { MexTokenChartsService } from './mex.token.charts.service';
import { MexTokenChart } from './entities/mex.token.chart';

@Controller()
@ApiTags('xexchange')
Expand All @@ -23,7 +25,8 @@ export class MexController {
private readonly mexSettingsService: MexSettingsService,
private readonly mexPairsService: MexPairService,
private readonly mexTokensService: MexTokenService,
private readonly mexFarmsService: MexFarmService
private readonly mexFarmsService: MexFarmService,
private readonly mexTokenChartsService: MexTokenChartsService
) { }

@Get("/mex/settings")
Expand Down Expand Up @@ -154,4 +157,17 @@ export class MexController {

return pair;
}

@Get('mex/tokens/prices/hourly/:identifier')
async getTokenPricesHourResolution(
@Param('identifier', new ParseTokenPipe) identifier: string): Promise<MexTokenChart[]> {
return await this.mexTokenChartsService.getTokenPricesHourResolution(identifier);
}

@Get('mex/tokens/prices/daily/:identifier')
async getTokenPricesDayResolution(
@Param('identifier',new ParseTokenPipe) identifier: string,
@Query('start') start: string): Promise<MexTokenChart[]> {
return await this.mexTokenChartsService.getTokenPricesDayResolution(identifier, start);
}
}
3 changes: 3 additions & 0 deletions src/endpoints/mex/mex.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { MexEconomicsService } from "./mex.economics.service";
import { MexFarmService } from "./mex.farm.service";
import { MexPairService } from "./mex.pair.service";
import { MexSettingsService } from "./mex.settings.service";
import { MexTokenChartsService } from "./mex.token.charts.service";
import { MexTokenService } from "./mex.token.service";
import { MexWarmerService } from "./mex.warmer.service";

Expand All @@ -19,6 +20,7 @@ export class MexModule {
MexPairService,
MexTokenService,
MexFarmService,
MexTokenChartsService,
];

const isExchangeEnabled = configuration().features?.exchange?.enabled ?? false;
Expand All @@ -38,6 +40,7 @@ export class MexModule {
MexSettingsService,
MexTokenService,
MexFarmService,
MexTokenChartsService,
],
};
}
Expand Down
66 changes: 66 additions & 0 deletions src/endpoints/mex/mex.token.charts.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { Injectable } from "@nestjs/common";
import { GraphQlService } from "src/common/graphql/graphql.service";
import { OriginLogger } from "@multiversx/sdk-nestjs-common";
import { gql } from 'graphql-request';
import { MexTokenChart } from "./entities/mex.token.chart";

@Injectable()
export class MexTokenChartsService {
private readonly logger = new OriginLogger(MexTokenChartsService.name);

constructor(
private readonly graphQlService: GraphQlService
) { }

async getTokenPricesHourResolution(tokenIdentifier: string): Promise<MexTokenChart[]> {
const query = gql`
query tokenPricesHourResolution {
values24h(
series: "${tokenIdentifier}",
metric: "priceUSD"
) {
timestamp
value
}
}
`;

try {
const data = await this.graphQlService.getExchangeServiceData(query);
return this.convertToMexTokenChart(data?.values24h) || [];
} catch (error) {
this.logger.error(`An error occurred while fetching hourly token prices for ${tokenIdentifier}`, error);
return [];
}
}

async getTokenPricesDayResolution(tokenIdentifier: string, start: string): Promise<MexTokenChart[]> {
const query = gql`
query tokenPriceDayResolution {
latestCompleteValues(
series: "${tokenIdentifier}",
metric: "priceUSD",
start: "${start}"
) {
timestamp
value
}
}
`;

try {
const data = await this.graphQlService.getExchangeServiceData(query);
return this.convertToMexTokenChart(data?.latestCompleteValues) || [];
} catch (error) {
this.logger.error(`An error occurred while fetching daily token prices for ${tokenIdentifier}`, error);
return [];
}
}

private convertToMexTokenChart(data: { timestamp: string; value: string }[]): MexTokenChart[] {
return data?.map(item => new MexTokenChart({
timestamp: Math.floor(new Date(item.timestamp).getTime() / 1000),
value: Number(item.value),
})) || [];
}
}
6 changes: 6 additions & 0 deletions src/graphql/schema/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -3649,8 +3649,14 @@ type TokenAssets {

"""Token assets price source object type."""
type TokenAssetsPriceSource {
"""(Optional) path to fetch the price info in case of customUrl type"""
path: String

"""Type of price source"""
type: String

"""URL of price source in case of customUrl type"""
url: String
}

"""TokenDetailed object type."""
Expand Down

0 comments on commit 8159283

Please sign in to comment.