UNPKG

@bloom-trade/finance-connector

Version:

Is a package entended to be used with multiple web3 and web2 providers to interact with blockchains.

220 lines (219 loc) 9.31 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.stringToMilisecondsDate = exports.fDate = exports.getAssetDataByChain = exports.getTestnetByMainnet = exports.getAssetPriceInUSDC = exports.convertToken = exports.weiToEth = exports.getSupportedContracts = exports.manageBaseUrl = exports.getDescription = exports.setClient = void 0; const web3_1 = __importDefault(require("web3")); const cryptocurrencies_1 = require("../data/cryptocurrencies"); const contracts_1 = require("../data/contracts"); const axios_1 = __importDefault(require("axios")); const moment_1 = __importDefault(require("moment")); const sum = (a, b, positions) => { const factor = Math.pow(10, positions); return ((a.toFixed(positions) * factor + b.toFixed(positions) * factor) / factor); }; const setClient = (providerConnection) => { const providers = providerConnection; return { providers, getProvider(id) { //staff this function to return the provider object }, getBalance() { return __awaiter(this, void 0, void 0, function* () { const balance = []; for (const connection of providerConnection) { const { ProviderConnectorImpl, } = require(`../impl/${connection.provider.id}/index`); const service = new ProviderConnectorImpl(connection); const res = (yield service.getBalance()); res.forEach((e) => { const foundElement = balance.find((element) => element.asset === e.asset); if (!foundElement) { balance.push(e); } else { if (foundElement.asset === 'ETH' || foundElement.asset === 'MATIC' || foundElement.asset === 'AVAX') { const index = balance.indexOf(foundElement); balance[index].balance = sumEthsBalances(foundElement.balance, e.balance); balance[index].detail.push(...e.detail); } else { const index = balance.indexOf(foundElement); balance[index].balance = sum(parseFloat(e.balance), parseFloat(balance[index].balance), 3).toString(); balance[index].detail.push(...e.detail); } } }); } return balance; }); }, getTransactionHistory(params) { return __awaiter(this, void 0, void 0, function* () { let transactions = []; const StableAssets = ['usdt', 'usdc', 'dai']; for (const connection of providerConnection) { const { ProviderConnectorImpl, } = require(`../impl/${connection.provider.id}/index`); const service = new ProviderConnectorImpl(connection); const res = (yield service.getTransactionHistory(params)); res.forEach((e) => { transactions.push(e); }); } switch (params.order) { case 'asc': transactions.sort((a, b) => a.timestamp - b.timestamp); break; case 'desc': transactions.sort((a, b) => b.timestamp - a.timestamp); default: break; } if (params.filters && params.filters.onlyStables) { transactions = transactions.filter((tx) => { if (StableAssets.includes(tx.asset)) { return tx; } }); } return transactions; }); }, }; }; exports.setClient = setClient; const getDescription = (asset) => { const myKeys = Object.keys(cryptocurrencies_1.cryptocurrencies); const foundKey = myKeys.find((e) => e === asset); if (!foundKey) return ''; return cryptocurrencies_1.cryptocurrencies[foundKey]; }; exports.getDescription = getDescription; const getSupportedContracts = () => { return contracts_1.contracts.tokens; }; exports.getSupportedContracts = getSupportedContracts; const manageBaseUrl = (connection) => { let url = ''; if (!connection.provider.useTestnet) { url = setProdUrl(connection.provider.id); } else { url = setTestUrl(connection.provider.id); } return url; //staff this function to return the base url }; exports.manageBaseUrl = manageBaseUrl; const setProdUrl = (provider) => { switch (provider) { case 'binance': return 'https://api.binance.com'; case 'etherscan': return 'https://api.etherscan.io/api'; case 'polygonscan': return 'https://api.polygonscan.com/api'; case 'snowtrace': return 'https://snowtrace.io/api'; case 'circle': return 'https://api.circle.com/v1'; default: return 'https://api.etherscan.io/api'; } }; const setTestUrl = (provider) => { switch (provider) { case 'binance': return 'https://testnet.binance.vision'; case 'etherscan': return 'https://api-goerli.etherscan.io/api'; case 'polygonscan': return 'https://api-testnet.polygonscan.com/api'; case 'snowtrace': return 'https://api-testnet.snowtrace.io/api'; case 'circle': return 'https://api-sandbox.circle.com/v1'; default: return 'https://api-goerli.etherscan.io/api'; } }; const getTestnetByMainnet = (chain) => { switch (chain) { case 'eth': return 'goerli'; case 'avax': return 'fuji'; case 'polygon': return 'mumbai'; default: return 'goerli'; } }; exports.getTestnetByMainnet = getTestnetByMainnet; const sumEthsBalances = (referenceBalance, balanceToAdd) => { const web3 = new web3_1.default(web3_1.default.givenProvider || 'ws://localhost:8545'); const totalBalanceInWei = web3.utils.toWei(referenceBalance, 'ether'); const foundElementInWei = web3.utils.toWei(balanceToAdd, 'ether'); const newBalance = web3.utils .toBN(totalBalanceInWei) .add(web3.utils.toBN(foundElementInWei)) .toString(); const formattedBalance = web3.utils.fromWei(newBalance, 'ether'); return formattedBalance; }; const weiToEth = (value) => { const web3 = new web3_1.default(web3_1.default.givenProvider || 'ws://localhost:8545'); return web3.utils.fromWei(value, 'ether'); }; exports.weiToEth = weiToEth; const convertToken = (value, decimals) => { const web3 = new web3_1.default(web3_1.default.givenProvider || 'ws://localhost:8545'); return web3.utils .toBN(value) .div(web3.utils.toBN(Math.pow(10, decimals))) .toString(); }; exports.convertToken = convertToken; const getAssetPriceInUSDC = (asset, startDate, endDate) => __awaiter(void 0, void 0, void 0, function* () { //staff this function to return the price of the asset in USDC try { const { data } = yield axios_1.default.get(`https://poloniex.com/public?command=returnChartData&currencyPair=USDC_${asset.toUpperCase()}&start=${startDate}&end=${endDate}&period=14400`); return data[0]; } catch (error) { throw new Error(); } }); exports.getAssetPriceInUSDC = getAssetPriceInUSDC; const getAssetDataByChain = (contract, chain, provider) => { const filteredContract = contract.networks.find((e) => e.chain === (provider.useTestnet ? getTestnetByMainnet(chain) : chain === 'eth' ? 'erc20' : chain)); return filteredContract; }; exports.getAssetDataByChain = getAssetDataByChain; const stringToMilisecondsDate = (string) => { const date = new Date(string); return date.getTime(); }; exports.stringToMilisecondsDate = stringToMilisecondsDate; const fDate = (date) => { return (0, moment_1.default)(date).format(); }; exports.fDate = fDate;