@ln-markets/api
Version:
A set of wrappers to easily communicate with LN Markets API !
294 lines (293 loc) • 8.78 kB
JavaScript
import { getHostname } from './utils.js';
import { createHmac } from 'node:crypto';
import { URL, URLSearchParams } from 'node:url';
import { fetch } from 'undici';
class HttpError extends Error {
status;
statusText;
constructor(status, statusText, message) {
super(message);
this.name = 'HttpError';
this.status = status;
this.statusText = statusText;
}
}
export const createRestClient = (options = {}) => {
const { key = process.env.LNM_API_KEY, secret = process.env.LNM_API_SECRET, network = process.env.LNM_API_NETWORK ?? 'mainnet', passphrase = process.env.LNM_API_PASSPHRASE, headers = {}, } = options;
const hostname = process.env.LNM_API_HOSTNAME ?? getHostname(network);
const request = async (options) => {
const { method, path, data, requireAuth } = options;
if (requireAuth) {
if (!key) {
throw new Error('You need an API key to use an authenticated route');
}
else if (!secret) {
throw new Error('You need an API secret to use an authenticated route');
}
else if (!passphrase) {
throw new Error('You need an API passphrase to use an authenticated route');
}
const timestamp = Date.now();
const payload = /^(GET|DELETE)$/.test(method)
? new URLSearchParams(data).toString()
: JSON.stringify(data);
const signature = createHmac('sha256', secret)
.update(`${timestamp}${method}/v2${path}${payload}`)
.digest('base64');
Object.assign(headers, {
'LNM-ACCESS-KEY': key,
'LNM-ACCESS-PASSPHRASE': passphrase,
'LNM-ACCESS-TIMESTAMP': timestamp,
'LNM-ACCESS-SIGNATURE': signature,
});
}
const url = new URL(`https://${hostname}/v2${path}`);
if (data && /^(GET|DELETE)$/.test(method)) {
for (const [key, value] of Object.entries(data)) {
url.searchParams.append(key, value.toString());
}
}
if (data && /^(POST|PUT)$/.test(method)) {
Object.assign(headers, {
'Content-Type': 'application/json',
});
}
const body = /^(POST|PUT)$/.test(method) ? JSON.stringify(data) : undefined;
const response = await fetch(url, { method, body, mode: 'cors', headers });
if (response.ok) {
if (response.headers.get('content-type')?.includes('application/json')) {
return response.json();
}
return response.text();
}
const text = await response.text();
throw new HttpError(response.status, response.statusText, text);
};
const futuresGetTicker = () => {
return request({ method: 'GET', path: '/futures/ticker' });
};
const futuresNewTrade = (data) => {
return request({
method: 'POST',
path: '/futures',
requireAuth: true,
data,
});
};
const futuresUpdateTrade = (data) => {
return request({
method: 'PUT',
path: '/futures',
requireAuth: true,
data,
});
};
const futuresCloseTrade = (id) => {
return request({
method: 'DELETE',
path: '/futures',
data: { id },
requireAuth: true,
});
};
const futuresCloseAllTrades = () => {
return request({
method: 'DELETE',
path: '/futures/all/close',
requireAuth: true,
});
};
const futuresCancelTrade = (id) => {
return request({
method: 'POST',
path: '/futures/cancel',
data: { id },
requireAuth: true,
});
};
const futuresCancelAllTrades = () => {
return request({
method: 'DELETE',
path: '/futures/all/cancel',
requireAuth: true,
});
};
const futuresCashinTrade = (data) => {
return request({
method: 'POST',
path: '/futures/cash-in',
requireAuth: true,
data,
});
};
const futuresAddMarginTrade = (data) => {
return request({
method: 'POST',
path: '/futures/add-margin',
requireAuth: true,
data,
});
};
const futuresGetTrades = (data) => {
return request({
method: 'GET',
path: '/futures',
requireAuth: true,
data,
});
};
const futuresPriceHistory = (data) => {
return request({
method: 'GET',
path: '/futures/history/price',
data,
});
};
const futuresIndexHistory = (data) => {
return request({
method: 'GET',
path: '/futures/history/index',
data,
});
};
const futuresFixingHistory = (data) => {
return request({
method: 'GET',
path: '/futures/history/fixing',
data,
});
};
const futuresCarryFeesHistory = (data) => {
return request({
method: 'GET',
path: '/futures/carry-fees',
data,
});
};
const userGet = () => {
return request({ method: 'GET', path: '/user', requireAuth: true });
};
const userUpdate = (data) => {
return request({ method: 'PUT', path: '/user', requireAuth: true, data });
};
const userDeposit = (data) => {
return request({
method: 'POST',
path: '/user/deposit',
requireAuth: true,
data,
});
};
const userDepositHistory = (data) => {
return request({
method: 'GET',
path: '/user/deposit',
requireAuth: true,
data,
});
};
const userWithdraw = (data) => {
return request({
method: 'POST',
path: '/user/withdraw',
requireAuth: true,
data,
});
};
const userWithdrawUsd = (data) => {
return request({
method: 'POST',
path: '/user/withdraw/usd',
requireAuth: true,
data,
});
};
const userWithdrawHistory = (data) => {
return request({
method: 'GET',
path: '/user/withdraw',
requireAuth: true,
data,
});
};
const optionsInstruments = () => {
return request({ method: 'GET', path: '/options/instruments' });
};
const optionsInstrument = (data) => {
return request({ method: 'GET', path: '/options/instrument', data });
};
const optionsMarket = () => {
return request({ method: 'GET', path: '/options/market' });
};
const optionsNewTrade = (data) => {
return request({
method: 'POST',
path: '/options',
requireAuth: true,
data,
});
};
const optionsGetTrades = (data) => {
return request({
method: 'GET',
path: '/options',
requireAuth: true,
data,
});
};
const optionsCloseTrade = (id) => {
return request({
method: 'DELETE',
path: '/options',
data: { id },
requireAuth: true,
});
};
const optionsCloseAllTrades = () => {
return request({
method: 'DELETE',
path: '/options/all/close',
requireAuth: true,
});
};
const optionsUpdateSettlement = (data) => {
return request({
method: 'PUT',
path: '/options',
requireAuth: true,
data,
});
};
return {
request,
futuresGetTicker,
futuresNewTrade,
futuresUpdateTrade,
futuresCloseTrade,
futuresCloseAllTrades,
futuresCancelTrade,
futuresCancelAllTrades,
futuresCashinTrade,
futuresAddMarginTrade,
futuresGetTrades,
futuresPriceHistory,
futuresIndexHistory,
futuresFixingHistory,
futuresCarryFeesHistory,
userGet,
userUpdate,
userDeposit,
userDepositHistory,
userWithdraw,
userWithdrawUsd,
userWithdrawHistory,
optionsInstrument,
optionsInstruments,
optionsMarket,
optionsNewTrade,
optionsGetTrades,
optionsCloseTrade,
optionsCloseAllTrades,
optionsUpdateSettlement,
};
};