UNPKG

crypto-janitor

Version:

The Crypto Janitor provides a simple interface for fetching and cleaning crypto account data.

185 lines 7.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const target_types_1 = require("../target.types"); const celsius_sdk_1 = require("celsius-sdk"); const _ = require("lodash"); /** * A Celsius Implementation of BaseConnection */ class CelsiusConnection extends target_types_1.BaseConnection { /** * Create Celsius instance * @param {any} credentials - Celsius API credentials */ constructor(credentials) { super("celsius", "api", { requireSymbols: false }); this.transactionTypes = { deposit: "receive", withdrawal: "send", outbound_transfer: "send", interest: "interest-in-account", referrer_award: "reward", bonus_token: "reward", }; this.credentials = credentials; this.transactions = []; } /** * HELPER: Format orders * * @param {any} entry - Unformatted coinbase transaction * @param {string} type - Type of transaction * @return {Transaction} Formatted transaction */ _formatTransaction(entry) { const nativeTotal = Math.abs(parseFloat(entry.amount)); const total = Math.abs(parseFloat(entry.amount_usd)); const formatted = { id: entry.id, timestamp: new Date(entry.time), type: this.transactionTypes[entry.nature], baseCurrency: entry.coin, baseQuantity: nativeTotal, baseUsdPrice: total / nativeTotal, feeCurrency: "USD", feeQuantity: 0, feeUsdPrice: 0, feeTotal: 0, subTotal: total, total: total, }; return formatted; } /** * Initialize coinbase and get active accounts * @override BaseExchange.initialize * @param {boolean} forceReload - (Optional) Additional paramaters * @return {Promise<void>} */ async initialize(forceReload = false) { this.connection = await celsius_sdk_1.Celsius({ authMethod: celsius_sdk_1.AUTH_METHODS.API_KEY, partnerKey: this.credentials.partnerKey, environment: celsius_sdk_1.ENVIRONMENT.PRODUCTION, // does not work in staging }); this.balances = await this.getBalances(); this.symbols = Object.keys(this.balances); } /** * Fetch Account Balances * @override BaseExchange.getBalances * @param {boolean} forceReload - (Optional) Additional paramaters * @return {Promise<any>} Account balance object */ async getBalances() { const balances = await this.connection.getBalanceSummary(this.credentials.apiKey); const totals = {}; Object.entries(balances.balance).forEach(([key, val]) => { key = key === "usdt erc20" ? "usdt" : key; totals[key] = parseFloat(val); }); const used = {}; Object.keys(totals).forEach((key) => { used[key] = 0; }); return { used: used, free: totals, total: totals, }; } /** * Fetch Account transactions by type, symbol, and/or since a certain time * @param {string} type (Optional) Transaction type * @param {string} symbol (Optional) Currency symbol * @param {number} since (Optional) Timestamp to get transactions since * @return {Promise<Array<any>>} Array of deposit objects */ async filterTransactions(type, symbol, since) { let transactions = []; if (this.transactions.length > 0) { transactions = this.transactions; } else { transactions = await this.getTransactions(); } let filteredTransactions = transactions; if (type) { filteredTransactions = filteredTransactions.filter((transaction) => transaction.type === type); } if (symbol) { filteredTransactions = filteredTransactions.filter((transaction) => transaction.baseCurrency === symbol); } if (since) { filteredTransactions = filteredTransactions.filter((transaction) => transaction.timestamp.getTime() > since); } return filteredTransactions; } /** * Fetch Account Withdrawals * @param {string} symbol Currency symbol * @param {number} since (Optional) Timestamp to get transactions since * @param {number} limit (Optional) Max number of entries per request * @return {Promise<Array<any>>} Array of withdrawal objects */ async getWithdrawals(symbol, since) { return await this.filterTransactions("send", symbol, since); } /** * Fetch Account Deposits * @param {string} symbol (Optional) Currency symbol * @param {number} since (Optional) Timestamp to get transactions since * @return {Promise<Array<any>>} Array of deposit objects */ async getDeposits(symbol, since) { return await this.filterTransactions("receive", symbol, since); } /** * Fetch account transactions (withdrawals, deposits, and orders) * @param {string} symbol Currency symbol * @param {number} since (Optional) Timestamp to get transactions since * @return {Array<any>} Array of withdrawal objects */ async getTransactions(symbol, since) { const initialPage = await this.connection.getTransactionSummary({ page: 1, perPage: 20 }, this.credentials.apiKey); const numPages = initialPage.pagination.pages; let currentPage = 2; const allPages = []; while (currentPage <= numPages) { try { const newPage = this.connection.getTransactionSummary({ page: currentPage, perPage: 20 }, this.credentials.apiKey); allPages.push(newPage); currentPage = currentPage + 1; } catch (e) { console.log(e.message); break; } } let results = await Promise.all(allPages); results = results.map((x) => x.record); results = _.flatten(initialPage.record.concat(results)); results = results.filter((x) => x.state == "confirmed"); results = results.map((x) => this._formatTransaction(x)); results = _.sortBy(results, "timestamp"); this.transactions = results; let filteredTransactions = results; if (symbol) { filteredTransactions = filteredTransactions.filter((transaction) => transaction.baseCurrency === symbol); } if (since) { filteredTransactions = filteredTransactions.filter((transaction) => transaction.timestamp.getTime() > since); } return filteredTransactions; } /** * Fetch alll celsius transactions (withdrawals, deposits, and interest) * @param {number} since (Optional) Timestamp to get transactions since * @return {Array<any>} Array of transaction objects */ async getAllTransactions(since) { return await this.filterTransactions(undefined, undefined, since); } } exports.default = CelsiusConnection; //# sourceMappingURL=celsius.js.map