133 lines
3.8 KiB
TypeScript
133 lines
3.8 KiB
TypeScript
import axios from "axios";
|
|
import { COIN_GECKO_EXCEPTIONS } from "./utils";
|
|
const CoinGecko = require("coingecko-api");
|
|
|
|
function sleep(milliseconds) {
|
|
const date = Date.now();
|
|
let currentDate = 0;
|
|
do {
|
|
currentDate = Date.now();
|
|
} while (currentDate - date < milliseconds);
|
|
}
|
|
|
|
//2. Initiate the CoinGecko API Client
|
|
const CoinGeckoClient = new CoinGecko(); //use justin's VIP coin gecko api key?
|
|
|
|
async function getCoinsList() {
|
|
let data = await CoinGeckoClient.coins.list();
|
|
//console.log(data)
|
|
return;
|
|
}
|
|
|
|
export async function getTokenPrice(tokenAddress) {
|
|
let tokenContractInfo = await CoinGeckoClient.coins.fetchCoinContractInfo(
|
|
tokenAddress
|
|
);
|
|
let data = tokenContractInfo["data"];
|
|
var price = 0;
|
|
|
|
try {
|
|
price = data["market_data"]["current_price"].usd;
|
|
} catch (e) {
|
|
console.log("could not find price for address=", tokenAddress);
|
|
}
|
|
return price;
|
|
}
|
|
|
|
export async function getTokenPrices(tokenAddresses) {
|
|
//only for ethereum chain
|
|
let tokenContractInfos;
|
|
try {
|
|
tokenContractInfos = await CoinGeckoClient.simple.fetchTokenPrice({
|
|
contract_addresses: tokenAddresses,
|
|
vs_currencies: "usd",
|
|
});
|
|
} catch (e) {
|
|
console.log(e);
|
|
console.log("could not find prices for addresses");
|
|
}
|
|
return tokenContractInfos["data"];
|
|
}
|
|
|
|
function getKeyByValue(object, value) {
|
|
return Object.keys(object).find((key) => object[key] === value);
|
|
}
|
|
|
|
export async function getCoinGeckoMap() {
|
|
// pull coin gecko mapping of token address to coingecko id
|
|
var coinMap;
|
|
const map_query = `https://api.coingecko.com/api/v3/coins/list?include_platform=true`;
|
|
try {
|
|
const req = await axios.get(map_query);
|
|
coinMap = req.data;
|
|
} catch (e) {
|
|
console.log(e);
|
|
console.log("could not find prices for addresses");
|
|
}
|
|
var coinMapTransformed: any[] = [];
|
|
for (let i = 0; i < coinMap.length; i++) {
|
|
const coin = coinMap[i];
|
|
|
|
const platforms = coin?.platforms;
|
|
Object.entries(platforms).forEach((entry) => {
|
|
const [platform, contractAddress] = entry;
|
|
if (contractAddress != "" && contractAddress != null) {
|
|
coinMapTransformed.push({
|
|
contractAddress: contractAddress,
|
|
coinGeckoId: coin.id,
|
|
});
|
|
}
|
|
});
|
|
}
|
|
return coinMapTransformed;
|
|
}
|
|
|
|
export async function getTokenPricesGET(
|
|
chainId: number,
|
|
platform: String,
|
|
tokenAddresses: String[]
|
|
) {
|
|
let data;
|
|
|
|
const addresses = tokenAddresses.join("%2C");
|
|
const price_query = `https://api.coingecko.com/api/v3/simple/token_price/${platform}?contract_addresses=${addresses}&vs_currencies=usd`;
|
|
//console.log(price_query)
|
|
try {
|
|
const tokenContractInfos = await axios.get(price_query);
|
|
data = tokenContractInfos.data;
|
|
} catch (e) {
|
|
console.log(e);
|
|
console.log("could not find prices for addresses");
|
|
}
|
|
|
|
// find prices included in exceptions using coin gecko id and add it back to the results
|
|
const filteredIds = COIN_GECKO_EXCEPTIONS.filter(
|
|
(x) => tokenAddresses.includes(x.tokenAddress) && x.chainId == chainId
|
|
);
|
|
const coinGeckoIds = filteredIds.map((x) => x.coinGeckoId);
|
|
|
|
const additional_data = await getTokenPricesCGID(coinGeckoIds);
|
|
let gecko_id_data = {};
|
|
for (let i = 0; i < filteredIds.length; i++) {
|
|
let cg_id = filteredIds[i];
|
|
gecko_id_data[cg_id.tokenAddress] = additional_data[cg_id.coinGeckoId];
|
|
}
|
|
|
|
return { ...data, ...gecko_id_data };
|
|
}
|
|
|
|
export async function getTokenPricesCGID(coinGeckoIds: String[]) {
|
|
let data;
|
|
const ids = coinGeckoIds.join("%2C");
|
|
const price_query = `https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`;
|
|
console.log(price_query);
|
|
try {
|
|
const tokenContractInfos = await axios.get(price_query);
|
|
data = tokenContractInfos.data;
|
|
} catch (e) {
|
|
// console.log(e);
|
|
console.log("could not find prices for ids", coinGeckoIds);
|
|
}
|
|
return data;
|
|
}
|