import { createSuccessResponse, createErrorResponse } from '../utils/helpers.js';
import { z } from 'zod';
import { SetLeverageSchema, GetLeverageSchema } from '../schemas/index.js';
export function createFuturesTools(exchange, mode) {
return {
set_leverage: {
description: 'Set leverage for perpetual futures trading (e.g., BTC/USDT:USDT with 10x leverage). Supports isolated/cross margin.',
inputSchema: SetLeverageSchema.extend({
marginType: z.enum(['isolated', 'cross']).optional().default('isolated'),
positionSide: z.enum(['long', 'short', 'both']).optional().default('both')
}),
handler: async (input) => {
if (!input.symbol.includes(':')) {
return createErrorResponse(
'INVALID_SYMBOL',
'Leverage can only be set for perpetual symbols (e.g., BTC/USDT:USDT)'
);
}
const openType = input.marginType === 'isolated' ? 1 : 2;
if (input.positionSide === 'both') {
await exchange.setLeverage(input.symbol, input.leverage, { openType, positionType: 1 });
await exchange.setLeverage(input.symbol, input.leverage, { openType, positionType: 2 });
return createSuccessResponse({
symbol: input.symbol,
leverage: input.leverage,
marginType: input.marginType,
positionSide: 'both (long + short)',
timestamp: new Date().toISOString()
}, mode);
}
const positionType = input.positionSide === 'long' ? 1 : 2;
const result = await exchange.setLeverage(input.symbol, input.leverage, { openType, positionType });
return createSuccessResponse(result, mode);
}
},
get_leverage: {
description: 'Get current leverage for a perpetual futures symbol',
inputSchema: GetLeverageSchema.extend({
positionSide: z.enum(['long', 'short']).optional().default('short')
}),
handler: async (input) => {
if (!input.symbol.includes(':')) {
return createErrorResponse(
'INVALID_SYMBOL',
'Leverage can only be checked for perpetual symbols (e.g., BTC/USDT:USDT)'
);
}
const positionType = input.positionSide === 'long' ? 1 : 2;
const result = await exchange.getLeverage(input.symbol, { positionType });
return createSuccessResponse(result, mode);
}
}
};
}