import Decimal from 'decimal.js';
import { createSuccessResponse, generateClientOrderId } from '../utils/helpers.js';
import {
PlaceOrderSchema,
CancelOrderSchema,
GetOpenOrdersSchema,
CancelAllOrdersSchema
} from '../schemas/index.js';
export function createOrderTools(exchange, mode) {
const isDemoMode = mode === 'demo';
return {
place_order: {
description: 'Place a buy or sell order. Amounts and prices must be strings (e.g., "0.001", "89600.25"). In demo mode, orders are simulated.',
inputSchema: PlaceOrderSchema,
handler: async (input) => {
const clientOrderId = input.clientOrderId || generateClientOrderId(mode);
if (isDemoMode) {
const amountDecimal = new Decimal(input.amount);
const priceDecimal = input.price ? new Decimal(input.price) : null;
return createSuccessResponse({
id: `demo_${Date.now()}`,
clientOrderId,
symbol: input.symbol,
side: input.side,
type: input.type,
amount: amountDecimal.toString(),
price: priceDecimal?.toString() || 'market',
status: 'simulated',
message: 'Order simulated in demo mode'
}, mode);
}
const order = await exchange.placeOrder({
...input,
clientOrderId
});
return createSuccessResponse(order, mode);
}
},
cancel_order: {
description: 'Cancel an open order by order ID',
inputSchema: CancelOrderSchema,
handler: async (input) => {
if (isDemoMode) {
return createSuccessResponse({
id: input.orderId,
status: 'cancelled',
message: 'Cancel simulated in demo mode'
}, mode);
}
const result = await exchange.cancelOrder(input.orderId, input.symbol);
return createSuccessResponse(result, mode);
}
},
get_open_orders: {
description: 'Get all open orders, optionally filtered by symbol',
inputSchema: GetOpenOrdersSchema,
handler: async (input) => {
const orders = await exchange.getOpenOrders(input.symbol);
return createSuccessResponse({
orders,
count: orders.length
}, mode);
}
},
cancel_all_orders: {
description: 'Cancel all open orders, optionally for a specific symbol',
inputSchema: CancelAllOrdersSchema,
handler: async (input) => {
if (isDemoMode) {
return createSuccessResponse({
cancelled: 0,
message: 'Cancel all simulated in demo mode'
}, mode);
}
const result = await exchange.cancelAllOrders(input.symbol);
return createSuccessResponse(result, mode);
}
}
};
}