UNPKG

@xunwukong-tools/withdraw

Version:

Binance withdraw tool

138 lines (135 loc) 4.19 kB
// src/clients/binance/index.ts import axios from "axios"; // src/utils/signature.ts import crypto from "crypto"; import qs from "qs"; function generateSignature(queryString, secretKey) { return crypto.createHmac("sha256", secretKey).update(queryString).digest("hex"); } function buildQueryString(params) { const filtered = Object.fromEntries( Object.entries(params).filter( ([_, value]) => value !== void 0 && value !== null && value !== "" ) ); return qs.stringify(filtered, { sort: (a, b) => a.localeCompare(b), encode: true, skipNulls: true }); } // src/clients/binance/index.ts var DEFAULT_BASE_URL = "https://api.binance.com"; var BinanceClient = class { apiKey; secretKey; baseURL; recvWindow; constructor(config) { this.apiKey = config.apiKey; this.secretKey = config.secretKey; this.baseURL = config.baseURL || DEFAULT_BASE_URL; this.recvWindow = config.recvWindow || 5e3; } /** * Submit a withdraw request * @see https://developers.binance.com/docs/wallet/capital/withdraw */ async withdraw(params) { const timestamp = Date.now(); const requestParams = { coin: params.coin, address: params.address, amount: params.amount, timestamp, recvWindow: params.recvWindow || this.recvWindow }; if (params.withdrawOrderId) { requestParams.withdrawOrderId = params.withdrawOrderId; } if (params.network) { requestParams.network = params.network; } if (params.addressTag) { requestParams.addressTag = params.addressTag; } if (params.transactionFeeFlag !== void 0) { requestParams.transactionFeeFlag = params.transactionFeeFlag; } if (params.name) { requestParams.name = params.name; } if (params.walletType !== void 0) { requestParams.walletType = params.walletType; } const queryString = buildQueryString(requestParams); const signature = generateSignature(queryString, this.secretKey); try { const response = await axios.post( `${this.baseURL}/sapi/v1/capital/withdraw/apply?${queryString}&signature=${signature}`, null, { headers: { "X-MBX-APIKEY": this.apiKey, "Content-Type": "application/json" } } ); return response.data; } catch (err) { if (axios.isAxiosError(err) && err.response) { const errorData = err.response.data; const errorMessage = errorData?.msg || errorData?.message || err.message; const statusCode = err.response.status; throw new Error( `Binance API error: ${errorMessage}${statusCode ? ` (${statusCode})` : ""}` ); } if (axios.isAxiosError(err)) { throw new Error(`Binance API error: ${err.message}`); } throw err; } } /** * Get information of coins (available for deposit and withdraw) for user * @see https://developers.binance.com/docs/wallet/capital/all-coins-information-user */ async getAllCoins(params) { const timestamp = Date.now(); const requestParams = { timestamp, recvWindow: params?.recvWindow || this.recvWindow }; const queryString = buildQueryString(requestParams); const signature = generateSignature(queryString, this.secretKey); try { const response = await axios.get( `${this.baseURL}/sapi/v1/capital/config/getall?${queryString}&signature=${signature}`, { headers: { "X-MBX-APIKEY": this.apiKey, "Content-Type": "application/json" } } ); return response.data; } catch (err) { if (axios.isAxiosError(err) && err.response) { const errorData = err.response.data; const errorMessage = errorData?.msg || errorData?.message || err.message; const statusCode = err.response.status; throw new Error( `Binance API error: ${errorMessage}${statusCode ? ` (${statusCode})` : ""}` ); } if (axios.isAxiosError(err)) { throw new Error(`Binance API error: ${err.message}`); } throw err; } } }; export { BinanceClient };