Browse Source

coingecko nft support

pull/4073/head
Devin A. Conley 9 months ago
parent
commit
118ef2cd8b
  1. 94
      apps/api/src/services/data-provider/coingecko/coingecko.service.ts
  2. 1
      prisma/schema.prisma

94
apps/api/src/services/data-provider/coingecko/coingecko.service.ts

@ -75,7 +75,13 @@ export class CoinGeckoService implements DataProviderInterface {
abortController.abort(); abortController.abort();
}, this.configurationService.get('REQUEST_TIMEOUT')); }, this.configurationService.get('REQUEST_TIMEOUT'));
const { name } = await got(`${this.apiUrl}/coins/${symbol}`, { let url = `${this.apiUrl}/coins/${symbol}`;
if (symbol.startsWith('nft:')) {
response.assetSubClass = AssetSubClass.NFT;
url = `${this.apiUrl}/nfts/${symbol.replace('nft:', '')}`;
}
const { name } = await got(url, {
headers: this.headers, headers: this.headers,
// @ts-ignore // @ts-ignore
signal: abortController.signal signal: abortController.signal
@ -124,18 +130,26 @@ export class CoinGeckoService implements DataProviderInterface {
abortController.abort(); abortController.abort();
}, requestTimeout); }, requestTimeout);
const { prices } = await got( let url = `${this.apiUrl}/coins/${symbol}/market_chart/range
`${ ?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}
&from=${getUnixTime(from)}&to=${getUnixTime(to)}`;
let field = 'prices';
if (symbol.startsWith('nft:')) {
// note: pro only
url = `${
this.apiUrl this.apiUrl
}/coins/${symbol}/market_chart/range?vs_currency=${DEFAULT_CURRENCY.toLowerCase()}&from=${getUnixTime( }/nfts/${symbol.replace('nft:', '')}/market_chart?days=max`;
from field = 'floor_prices_usd';
)}&to=${getUnixTime(to)}`, }
{ console.log(url);
headers: this.headers,
// @ts-ignore const res = await got(url, {
signal: abortController.signal headers: this.headers,
} // @ts-ignore
).json<any>(); signal: abortController.signal
}).json<any>();
const prices = res[field];
const result: { const result: {
[symbol: string]: { [date: string]: IDataProviderHistoricalResponse }; [symbol: string]: { [date: string]: IDataProviderHistoricalResponse };
@ -185,10 +199,12 @@ export class CoinGeckoService implements DataProviderInterface {
abortController.abort(); abortController.abort();
}, requestTimeout); }, requestTimeout);
// note: simple price endpoint currently does not support list of nfts
// (submitted a ticket with this request)
const quotes = await got( const quotes = await got(
`${this.apiUrl}/simple/price?ids=${symbols.join( `${this.apiUrl}/simple/price?ids=${symbols
',' .filter((s) => !s.startsWith('nft:'))
)}&vs_currencies=${DEFAULT_CURRENCY.toLowerCase()}`, .join(',')}&vs_currencies=${DEFAULT_CURRENCY.toLowerCase()}`,
{ {
headers: this.headers, headers: this.headers,
// @ts-ignore // @ts-ignore
@ -205,6 +221,24 @@ export class CoinGeckoService implements DataProviderInterface {
marketState: 'open' marketState: 'open'
}; };
} }
// nfts
for (const symbol of symbols.filter((s) => s.startsWith('nft:'))) {
const s = symbol.replace('nft:', '');
const { floor_price } = await got(`${this.apiUrl}/nfts/${s}`, {
headers: this.headers,
// @ts-ignore
signal: abortController.signal
}).json<any>();
console.log(floor_price);
response[symbol] = {
currency: DEFAULT_CURRENCY,
dataProviderInfo: this.getDataProviderInfo(),
dataSource: DataSource.COINGECKO,
marketPrice: floor_price[DEFAULT_CURRENCY.toLowerCase()],
marketState: 'open'
};
}
} catch (error) { } catch (error) {
let message = error; let message = error;
@ -216,7 +250,7 @@ export class CoinGeckoService implements DataProviderInterface {
Logger.error(message, 'CoinGeckoService'); Logger.error(message, 'CoinGeckoService');
} }
console.log(response);
return response; return response;
} }
@ -234,13 +268,17 @@ export class CoinGeckoService implements DataProviderInterface {
abortController.abort(); abortController.abort();
}, this.configurationService.get('REQUEST_TIMEOUT')); }, this.configurationService.get('REQUEST_TIMEOUT'));
const { coins } = await got(`${this.apiUrl}/search?query=${query}`, { // note: this search does return nfts in a separate array
headers: this.headers, const { coins, nfts } = await got(
// @ts-ignore `${this.apiUrl}/search?query=${query}`,
signal: abortController.signal {
}).json<any>(); headers: this.headers,
// @ts-ignore
signal: abortController.signal
}
).json<any>();
items = coins.map(({ id: symbol, name }) => { let itemsCoins = coins.map(({ id: symbol, name }) => {
return { return {
name, name,
symbol, symbol,
@ -251,6 +289,18 @@ export class CoinGeckoService implements DataProviderInterface {
dataSource: this.getName() dataSource: this.getName()
}; };
}); });
let itemsNfts = nfts.map(({ id: symbol, name }) => {
return {
name,
symbol: `nft:${symbol}`,
assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.NFT,
currency: DEFAULT_CURRENCY,
dataProviderInfo: this.getDataProviderInfo(),
dataSource: this.getName()
};
});
items = itemsCoins.concat(itemsNfts);
} catch (error) { } catch (error) {
let message = error; let message = error;

1
prisma/schema.prisma

@ -269,6 +269,7 @@ enum AssetSubClass {
CASH CASH
COMMODITY COMMODITY
CRYPTOCURRENCY CRYPTOCURRENCY
NFT
ETF ETF
MUTUALFUND MUTUALFUND
PRECIOUS_METAL PRECIOUS_METAL

Loading…
Cancel
Save