@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
JavaScript
;
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¤cyPair=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;