UNPKG

cryptomarket

Version:

The CryptoMarket for Node.js

212 lines (201 loc) 8.74 kB
import { AuthClient } from "./authClient"; import { Balance, Transaction } from "../models"; import { NOTIFICATION_TYPE, ORDER_BY, SORT, SORT_BY, TRANSACTION_STATUS, TRANSACTION_SUBTYPE, TRANSACTION_TYPE, } from "../constants"; import { fromSnakeCaseToCamelCase } from "../paramStyleConverter"; /** * WalletClient connects via websocket to cryptomarket to get wallet information of the user. uses SHA256 as auth method and authenticates on connection. * @param requestTimeoutMs Timeout time for requests to the server. No timeout by default */ export class WalletClient extends AuthClient { constructor(apiKey: string, apiSecret: string, window?: number, requestTimeoutMs?: number) { const transactionKey = "transaction"; const balanceKey = "balance"; super( "wss://api.exchange.cryptomkt.com/api/3/ws/wallet", apiKey, apiSecret, window, requestTimeoutMs, { // transaction subscribe_transactions: { key: transactionKey, type: NOTIFICATION_TYPE.COMMAND }, unsubscribe_transactions: { key: transactionKey, type: NOTIFICATION_TYPE.COMMAND }, transaction_update: { key: transactionKey, type: NOTIFICATION_TYPE.UPDATE }, // balance subscribe_wallet_balances: { key: balanceKey, type: NOTIFICATION_TYPE.COMMAND }, unsubscribe_wallet_balances: { key: balanceKey, type: NOTIFICATION_TYPE.COMMAND }, wallet_balances: { key: balanceKey, type: NOTIFICATION_TYPE.SNAPSHOT }, wallet_balance_update: { key: balanceKey, type: NOTIFICATION_TYPE.UPDATE }, } ); } /** * Get the user's wallet balance for all currencies with balance * * Requires the "Payment information" API key Access Right * * https://api.exchange.cryptomkt.com/#request-wallet-balance * * @return A promise that resolves with a list of wallet balances */ async getWalletBalances(): Promise<Balance[]> { return this.makeRequest<Balance[]>({ method: "wallet_balances" }); } /** * Get the user's wallet balance of a currency * * Requires the "Payment information" API key Access Right * * https://api.exchange.cryptomkt.com/#request-wallet-balance * * @param {string} currency The currency code to query the balance * @return A promise that resolves with the wallet balance of the currency */ async getWalletBalance(currency: string): Promise<Balance> { const response = await this.makeRequest<Balance>({ method: "wallet_balance", params: { currency } }); return { available: response.available, reserved: response.reserved, currency: currency }; } /** * alias of {@link getWalletBalance} */ getWalletBalanceOfCurrency = this.getWalletBalance; /** * alias of {@link getWalletBalance} */ getWalletBalanceByCurrency = this.getWalletBalance; /** * Get the transaction history of the account * * Important: * * - The list of supported transaction types may be expanded in future versions * * - Some transaction subtypes are reserved for future use and do not purport to provide any functionality on the platform * * - The list of supported transaction subtypes may be expanded in future versions * * Requires the "Payment information" API key Access Right * * https://api.exchange.cryptomkt.com/#get-transactions * * @param {string[]} [params.txIds] Optional. List of transaction identifiers to query * @param {TRANSACTION_TYPE[]} [params.transactionTypes] Optional. List of types to query. valid types are: 'DEPOSIT', 'WITHDRAW', 'TRANSFER' and 'SWAP' * @param {TRANSACTION_SUBTYPE[]} [params.transactionSubtyes] Optional. List of subtypes to query. valid subtypes are: 'UNCLASSIFIED', 'BLOCKCHAIN', 'AIRDROP', 'AFFILIATE', 'STAKING', 'BUY_CRYPTO', 'OFFCHAIN', 'FIAT', 'SUB_ACCOUNT', 'WALLET_TO_SPOT', 'SPOT_TO_WALLET', 'WALLET_TO_DERIVATIVES', 'DERIVATIVES_TO_WALLET', 'CHAIN_SWITCH_FROM', 'CHAIN_SWITCH_TO' and 'INSTANT_EXCHANGE' * @param {TRANSACTION_STATUS[]} [params.transactionStatuses] Optional. List of statuses to query. valid subtypes are: 'CREATED', 'PENDING', 'FAILED', 'SUCCESS' and 'ROLLED_BACK' * @param {string} [params.from] Optional. Interval initial value (inclusive). The value type depends on order_by. * @param {string} [params.till] Optional. Interval end value (inclusive). The value type depends on order_by. * @param {string} [params.idFrom] Optional. Interval initial value when ordering by id. Min is 0 * @param {string} [params.idTill] Optional. Interval end value when ordering by id. Min is 0 * @param {ORDER_BY} [params.orderBy] Optional. Defines the sorting type.'CREATED_AT', 'updatedAt', 'last or 'id'. Default is 'createdAt' * @param {SORT} [params.sort] Optional. Sort direction. 'ASC' or 'DESC'. Default is 'DESC' * @param {number} [params.limit] Optional. Transactions per query. Defaul is 100. Max is 1000 * @param {number} [params.offset] Optional. Default is 0. Max is 100000 * @param {Boolean} [params.groupTransactions] Flag indicating whether the returned transactions will be parts of a single operation. Default is false * @return A promise that resolves with a list of transactions */ async getTransactions(params: { txIds?: number[]; types?: TRANSACTION_TYPE[]; subtypes?: TRANSACTION_SUBTYPE[]; statuses?: TRANSACTION_STATUS[]; currencies?: string[]; from?: string; till?: string; idFrom?: number; idTill?: number; orderBy?: ORDER_BY; sort?: SORT; limit?: number; offset?: number; groupTransactions?: Boolean; }): Promise<Transaction[]> { const cleanParams: any = { ...params } cleanParams.currencies = params.currencies?.join(", ") const transactions = await this.makeRequest<Transaction[]>({ method: "get_transactions", params: cleanParams }); return fromSnakeCaseToCamelCase(transactions) } /////////////////// // subscriptions // /////////////////// /** * A transaction notification occurs each time a transaction has been changed, such as creating a transaction, updating the pending state (e.g., the hash assigned) or completing a transaction * * https://api.exchange.cryptomkt.com/#subscribe-to-transactions * * @param {function} callback a function that recieves notifications with a list of transactions, and the type of notification (only UPDATE) * @return {Promise<Boolean>} A Promise of the subscription result. True if subscribed */ async subscribeToTransactions( callback: (notification: Transaction, type: NOTIFICATION_TYPE) => any ): Promise<Boolean> { const subscriptionResult = await this.sendSubscription({ method: "subscribe_transactions", callback: (notification: any, type: NOTIFICATION_TYPE) => callback(fromSnakeCaseToCamelCase(notification) as Transaction, type), }); return (subscriptionResult as { result: boolean }).result; } /** * unsubscribe to the transaction feed. * * https://api.exchange.cryptomkt.com/#subscribe-to-transactions * * @return {Promise<Boolean>} A Promise of the unsubscription result. True if unsubscribed */ unsubscribeToTransactions(): Promise<Boolean> { return this.sendUnsubscription({ method: "unsubscribe_transactions", }); } /** * Subscribe to a feed of the balances of the account balances * * the first notification has a snapshot of the wallet. further notifications * are updates of the wallet * * https://api.exchange.cryptomkt.com/#subscribe-to-wallet-balances * * @param {function} callback A function that recieves notifications with a list of balances, and the type of notification (either SNAPSHOT or UPDATE) * @return {Promise<Boolean>} A Promise of the subscription result. True if subscribed */ async subscribeToBalance( callback: (notification: Balance[], type: NOTIFICATION_TYPE) => any ): Promise<Boolean> { return ( (await this.sendSubscription({ method: "subscribe_wallet_balances", callback: (notification: any, type) => { if (type === NOTIFICATION_TYPE.SNAPSHOT) { callback(notification as Balance[], type); } else { callback([notification as Balance], type); } }, })) as { result: boolean; } ).result; } /** * unsubscribe to the balance feed. * * https://api.exchange.cryptomkt.com/#subscribe-to-wallet-balances * * @return {Promise<Boolean>} A Promise of the unsubscription result. True if unsubscribed */ unsubscribeToBalance(): Promise<Boolean> { return this.sendUnsubscription({ method: "unsubscribe_wallet_balances", }); } }