diff --git a/src/payment/models/exchange/exchange.module.ts b/src/payment/models/exchange/exchange.module.ts index beeded7218..f02e3d92b0 100644 --- a/src/payment/models/exchange/exchange.module.ts +++ b/src/payment/models/exchange/exchange.module.ts @@ -7,11 +7,20 @@ import { Module } from '@nestjs/common'; import { SharedModule } from 'src/shared/shared.module'; import { CurrencyService } from './services/currency.service'; import { FixerService } from './services/fixer.service'; +import { FtxService } from './services/ftx.service'; @Module({ imports: [SharedModule], controllers: [ExchangeController], - providers: [KrakenService, BinanceService, BitstampService, BitpandaService, FixerService, CurrencyService], - exports: [KrakenService, BinanceService, BitstampService, BitpandaService, FixerService, CurrencyService], + providers: [ + KrakenService, + BinanceService, + BitstampService, + BitpandaService, + FtxService, + FixerService, + CurrencyService, + ], + exports: [KrakenService, BinanceService, BitstampService, BitpandaService, FtxService, FixerService, CurrencyService], }) export class ExchangeModule {} diff --git a/src/payment/models/exchange/services/ftx.service.ts b/src/payment/models/exchange/services/ftx.service.ts new file mode 100644 index 0000000000..de5498936b --- /dev/null +++ b/src/payment/models/exchange/services/ftx.service.ts @@ -0,0 +1,11 @@ +import { Injectable } from '@nestjs/common'; +import { ExchangeService } from './exchange.service'; +import { ftx } from 'ccxt'; +import { GetConfig } from 'src/config/config'; + +@Injectable() +export class FtxService extends ExchangeService { + constructor() { + super(new ftx(GetConfig().exchange)); + } +} diff --git a/src/payment/models/pricing/__tests__/pricing.integration.spec.ts b/src/payment/models/pricing/__tests__/pricing.integration.spec.ts index 396b580c53..0d3f7a9314 100644 --- a/src/payment/models/pricing/__tests__/pricing.integration.spec.ts +++ b/src/payment/models/pricing/__tests__/pricing.integration.spec.ts @@ -7,6 +7,7 @@ import { BitpandaService } from '../../exchange/services/bitpanda.service'; import { BitstampService } from '../../exchange/services/bitstamp.service'; import { CurrencyService } from '../../exchange/services/currency.service'; import { FixerService } from '../../exchange/services/fixer.service'; +import { FtxService } from '../../exchange/services/ftx.service'; import { KrakenService } from '../../exchange/services/kraken.service'; import { PricingService } from '../services/pricing.service'; @@ -16,6 +17,7 @@ describe('Pricing Module Integration Tests', () => { let binanceService: BinanceService; let bitstampService: BitstampService; let bitpandaService: BitpandaService; + let ftxService: FtxService; let currencyService: CurrencyService; let fixerService: FixerService; @@ -23,6 +25,7 @@ describe('Pricing Module Integration Tests', () => { let binanceServiceGetPriceSpy: jest.SpyInstance; let bitstampServiceGetPriceSpy: jest.SpyInstance; let bitpandaServiceGetPriceSpy: jest.SpyInstance; + let ftxServiceGetPriceSpy: jest.SpyInstance; let currencyServiceGetPriceSpy: jest.SpyInstance; let fixerServiceGetPriceSpy: jest.SpyInstance; @@ -34,6 +37,7 @@ describe('Pricing Module Integration Tests', () => { binanceService = mock({ name: 'Binance' }); bitstampService = mock({ name: 'Bitstamp' }); bitpandaService = mock({ name: 'Bitpanda' }); + ftxService = mock({ name: 'Ftx' }); currencyService = mock({ name: 'CurrencyService' }); fixerService = mock({ name: 'FixerService' }); @@ -43,6 +47,7 @@ describe('Pricing Module Integration Tests', () => { binanceService, bitstampService, bitpandaService, + ftxService, currencyService, fixerService, ); @@ -51,6 +56,7 @@ describe('Pricing Module Integration Tests', () => { binanceServiceGetPriceSpy = jest.spyOn(binanceService, 'getPrice'); bitstampServiceGetPriceSpy = jest.spyOn(bitstampService, 'getPrice'); bitpandaServiceGetPriceSpy = jest.spyOn(bitpandaService, 'getPrice'); + ftxServiceGetPriceSpy = jest.spyOn(ftxService, 'getPrice'); currencyServiceGetPriceSpy = jest.spyOn(currencyService, 'getPrice'); fixerServiceGetPriceSpy = jest.spyOn(fixerService, 'getPrice'); }); @@ -60,6 +66,7 @@ describe('Pricing Module Integration Tests', () => { binanceServiceGetPriceSpy.mockClear(); bitstampServiceGetPriceSpy.mockClear(); bitpandaServiceGetPriceSpy.mockClear(); + ftxServiceGetPriceSpy.mockClear(); currencyServiceGetPriceSpy.mockClear(); fixerServiceGetPriceSpy.mockClear(); }); @@ -121,8 +128,8 @@ describe('Pricing Module Integration Tests', () => { .spyOn(binanceService, 'getPrice') .mockImplementationOnce(async (source, target) => createCustomPrice({ source, target, price: 0.014 })); - krakenServiceGetPriceSpy = jest - .spyOn(krakenService, 'getPrice') + ftxServiceGetPriceSpy = jest + .spyOn(ftxService, 'getPrice') .mockImplementationOnce(async (source, target) => createCustomPrice({ source, target, price: 0.014 })); const request = { from: 'BNB', to: 'BTC' }; @@ -147,6 +154,12 @@ describe('Pricing Module Integration Tests', () => { }); it('calculates price path for FIAT_TO_ALTCOIN', async () => { + krakenServiceGetPriceSpy = jest + .spyOn(krakenService, 'getPrice') + .mockImplementationOnce(async (source: string, target: string) => + createCustomPrice({ source, target, price: 0.000058 }), + ); + binanceServiceGetPriceSpy = jest .spyOn(binanceService, 'getPrice') .mockImplementationOnce(async (source: string, target: string) => @@ -156,11 +169,8 @@ describe('Pricing Module Integration Tests', () => { createCustomPrice({ source, target, price: 71.3 }), ); - krakenServiceGetPriceSpy = jest - .spyOn(krakenService, 'getPrice') - .mockImplementationOnce(async (source: string, target: string) => - createCustomPrice({ source, target, price: 0.000058 }), - ) + ftxServiceGetPriceSpy = jest + .spyOn(ftxService, 'getPrice') .mockImplementationOnce(async (source: string, target: string) => createCustomPrice({ source, target, price: 71.3 }), ); @@ -205,8 +215,8 @@ describe('Pricing Module Integration Tests', () => { createCustomPrice({ source, target, price: 71.3 }), ); - krakenServiceGetPriceSpy = jest - .spyOn(krakenService, 'getPrice') + ftxServiceGetPriceSpy = jest + .spyOn(ftxService, 'getPrice') .mockImplementationOnce(async (source: string, target: string) => createCustomPrice({ source, target, price: 0.081 }), ) @@ -249,8 +259,8 @@ describe('Pricing Module Integration Tests', () => { .spyOn(binanceService, 'getPrice') .mockImplementationOnce(async (source, target) => createCustomPrice({ source, target, price: 12.38 })); - krakenServiceGetPriceSpy = jest - .spyOn(krakenService, 'getPrice') + ftxServiceGetPriceSpy = jest + .spyOn(ftxService, 'getPrice') .mockImplementationOnce(async (source, target) => createCustomPrice({ source, target, price: 12.38 })); const request = { from: 'BTC', to: 'ETH' }; diff --git a/src/payment/models/pricing/services/pricing.service.ts b/src/payment/models/pricing/services/pricing.service.ts index 8e5931ba55..8163baadaf 100644 --- a/src/payment/models/pricing/services/pricing.service.ts +++ b/src/payment/models/pricing/services/pricing.service.ts @@ -6,6 +6,7 @@ import { BitpandaService } from '../../exchange/services/bitpanda.service'; import { BitstampService } from '../../exchange/services/bitstamp.service'; import { CurrencyService } from '../../exchange/services/currency.service'; import { FixerService } from '../../exchange/services/fixer.service'; +import { FtxService } from '../../exchange/services/ftx.service'; import { KrakenService } from '../../exchange/services/kraken.service'; import { Altcoin, USDStableCoin, Fiat } from '../enums'; import { BadPriceRequestException } from '../exceptions/bad-price-request.exception'; @@ -36,6 +37,7 @@ export class PricingService { private readonly binanceService: BinanceService, private readonly bitstampService: BitstampService, private readonly bitpandaService: BitpandaService, + private readonly ftxService: FtxService, private readonly currencyService: CurrencyService, private readonly fixerService: FixerService, ) { @@ -98,7 +100,7 @@ export class PricingService { new PriceStep({ providers: { primary: [this.binanceService], - reference: [this.krakenService, this.bitstampService, this.bitpandaService], + reference: [this.ftxService, this.krakenService, this.bitstampService, this.bitpandaService], }, }), ]), @@ -117,7 +119,7 @@ export class PricingService { from: 'BTC', providers: { primary: [this.binanceService], - reference: [this.krakenService, this.bitstampService, this.bitpandaService], + reference: [this.ftxService, this.krakenService, this.bitstampService, this.bitpandaService], }, }), ]), @@ -129,14 +131,14 @@ export class PricingService { to: 'BTC', providers: { primary: [this.binanceService], - reference: [this.krakenService, this.bitstampService, this.bitpandaService], + reference: [this.ftxService, this.krakenService, this.bitstampService, this.bitpandaService], }, }), new PriceStep({ from: 'BTC', providers: { primary: [this.binanceService], - reference: [this.krakenService, this.bitstampService, this.bitpandaService], + reference: [this.ftxService, this.krakenService, this.bitstampService, this.bitpandaService], }, }), ]), @@ -147,7 +149,7 @@ export class PricingService { new PriceStep({ providers: { primary: [this.binanceService], - reference: [this.krakenService, this.bitstampService, this.bitpandaService], + reference: [this.ftxService, this.krakenService, this.bitstampService, this.bitpandaService], }, }), ]),