Skip to content

Commit acc023c

Browse files
authored
TW-1416: BTC exchange rate (#168)
* load btc exchange rates from coingecko * fix backwards compatibility / refactor * refactor
1 parent 185a3aa commit acc023c

File tree

4 files changed

+33
-32
lines changed

4 files changed

+33
-32
lines changed

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ import { getAliceBobEstimationPayload } from './utils/alice-bob/get-alice-bob-es
3030
import { getAliceBobOrderInfo } from './utils/alice-bob/get-alice-bob-order-info';
3131
import { getAliceBobPairInfo } from './utils/alice-bob/get-alice-bob-pair-info';
3232
import { getAliceBobPairsInfo } from './utils/alice-bob/get-alice-bob-pairs-info';
33+
import { btcExchangeRateProvider, tezExchangeRateProvider } from './utils/coingecko';
3334
import { CodedError } from './utils/errors';
3435
import { coinGeckoTokens } from './utils/gecko-tokens';
3536
import { getExternalApiErrorPayload, isDefined, isNonEmptyString } from './utils/helpers';
3637
import logger from './utils/logger';
3738
import { getSignedMoonPayUrl } from './utils/moonpay/get-signed-moonpay-url';
3839
import { getSigningNonce } from './utils/signing-nonce';
3940
import SingleQueryDataProvider from './utils/SingleQueryDataProvider';
40-
import { tezExchangeRateProvider } from './utils/tezos';
4141
import { getExchangeRates } from './utils/tokens';
4242

4343
const PINO_LOGGER = {
@@ -175,6 +175,7 @@ app.get('/api/abtest', (_, res) => {
175175
});
176176

177177
app.get('/api/exchange-rates/tez', makeProviderDataRequestHandler(tezExchangeRateProvider));
178+
app.get('/api/exchange-rates/btc', makeProviderDataRequestHandler(btcExchangeRateProvider));
178179

179180
app.get('/api/exchange-rates', async (_req, res) => {
180181
const tokensExchangeRates = await getExchangeRates();

src/utils/coingecko.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { range } from './helpers';
1+
import { AxiosError } from 'axios';
2+
3+
import { isDefined, range } from './helpers';
4+
import logger from './logger';
25
import { makeBuildQueryFn } from './makeBuildQueryFn';
36
import SingleQueryDataProvider from './SingleQueryDataProvider';
47

@@ -89,3 +92,29 @@ export const getMarketsBySymbols = async (symbols: string[]) => {
8992

9093
return chunks.flat();
9194
};
95+
96+
const createCoingeckoExchangeRateProvider = (tokenSymbol: string) =>
97+
new SingleQueryDataProvider(60000, async () => {
98+
try {
99+
const [market] = await getMarketsBySymbols([tokenSymbol]);
100+
101+
return market.current_price;
102+
} catch (e) {
103+
if (!(e instanceof AxiosError)) {
104+
logger.error(`Request for ${tokenSymbol} exchange rate failed with unknown error`);
105+
} else if (isDefined(e.response) && isDefined(e.response.data)) {
106+
logger.error(
107+
`Request for ${tokenSymbol} exchange rate failed with status ${e.response.status} and message ${e.response.data}`
108+
);
109+
} else if (isDefined(e.response) && isDefined(e.response.status)) {
110+
logger.error(`Request for ${tokenSymbol} exchange rate failed with status ${e.response.status}`);
111+
} else {
112+
logger.error(`Request for ${tokenSymbol} exchange rate failed without response`);
113+
}
114+
115+
throw e;
116+
}
117+
});
118+
119+
export const tezExchangeRateProvider = createCoingeckoExchangeRateProvider('xtz');
120+
export const btcExchangeRateProvider = createCoingeckoExchangeRateProvider('btc');

src/utils/tezos.ts

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
import { compose, MichelCodecPacker, Signer, TezosToolkit } from '@taquito/taquito';
22
import { tzip12 } from '@taquito/tzip12';
33
import { tzip16 } from '@taquito/tzip16';
4-
import { AxiosError } from 'axios';
54
import memoizee from 'memoizee';
65

7-
import { getMarketsBySymbols } from './coingecko';
8-
import { isDefined } from './helpers';
9-
import logger from './logger';
10-
import SingleQueryDataProvider from './SingleQueryDataProvider';
116
import { BcdTokenData } from './tzkt';
127

138
const RPC_URL = process.env.RPC_URL ?? 'https://mainnet-node.madfish.solutions';
@@ -54,30 +49,6 @@ export const getStorage = memoizee(
5449
{ promise: true, maxAge: 30000 }
5550
);
5651

57-
const getTezExchangeRate = async () => {
58-
try {
59-
const [xtzMarket] = await getMarketsBySymbols(['xtz']);
60-
61-
return xtzMarket.current_price;
62-
} catch (e) {
63-
if (!(e instanceof AxiosError)) {
64-
logger.error('Request for TEZ exchange rate failed with unknown error');
65-
} else if (isDefined(e.response) && isDefined(e.response.data)) {
66-
logger.error(
67-
`Request for TEZ exchange rate failed with status ${e.response.status} and message ${e.response.data}`
68-
);
69-
} else if (isDefined(e.response) && isDefined(e.response.status)) {
70-
logger.error(`Request for TEZ exchange rate failed with status ${e.response.status}`);
71-
} else {
72-
logger.error('Request for TEZ exchange rate failed without response');
73-
}
74-
75-
throw e;
76-
}
77-
};
78-
79-
export const tezExchangeRateProvider = new SingleQueryDataProvider(60000, getTezExchangeRate);
80-
8152
export class MetadataParseError extends Error {}
8253

8354
export const getTokenMetadata = memoizee(

src/utils/tokens.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { BigNumber } from 'bignumber.js';
22

33
import { redisClient } from '../redis';
4+
import { tezExchangeRateProvider } from './coingecko';
45
import { isDefined } from './helpers';
56
import logger from './logger';
67
import SingleQueryDataProvider, { SingleQueryDataProviderState } from './SingleQueryDataProvider';
7-
import { tezExchangeRateProvider } from './tezos';
88
import {
99
getThreeRouteExchangeRates,
1010
getThreeRouteTokens,

0 commit comments

Comments
 (0)