@xunwukong-tools/withdraw
Version:
Binance withdraw tool
138 lines (135 loc) • 4.19 kB
JavaScript
// 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
};