Bot & Automation

Market AI

/root/hermes-projects/Market AI

packages/core/src/schemas.ts text
import { z } from "zod";

export const tradingModeSchema = z.enum(["scalp", "momentum", "snipe", "conservative"]);
export const tradeSideSchema = z.enum(["BUY", "SELL"]);
export const tradeExecutionModeSchema = z.enum(["paper", "live"]);

export const scannerCriteriaSchema = z.object({
  chainId: z.string().trim().min(2).max(32).default("solana"),
  limit: z.coerce.number().int().min(1).max(25).default(10),
  minLiquidityUsd: z.coerce.number().nonnegative().default(15000),
  minVolumeH24: z.coerce.number().nonnegative().default(25000),
  maxAgeHours: z.coerce.number().positive().max(3650).default(72),
  minScore: z.coerce.number().int().min(0).max(100).default(55),
});

export const memeSignalRequestSchema = z.object({
  query: z.string().trim().min(2).max(120),
  chainId: z.string().trim().min(2).max(32).optional(),
  mode: tradingModeSchema.default("momentum"),
});

export const tradeRequestSchema = z.object({
  userId: z.string().trim().min(1).optional(),
  chainId: z.string().trim().min(2).max(32).default("solana"),
  tokenAddress: z.string().trim().min(20).max(80),
  side: tradeSideSchema,
  amount: z.coerce.number().positive().max(1000000),
  slippageBps: z.coerce.number().int().min(10).max(5000).default(300),
  mode: tradeExecutionModeSchema.default("paper"),
});

export const alertRuleSchema = z.object({
  userId: z.string().trim().min(1),
  chainId: z.string().trim().min(2).max(32).default("solana"),
  tokenAddress: z.string().trim().min(20).max(80),
  condition: z.enum(["price_above", "price_below", "volume_spike", "score_above", "liquidity_below"]),
  target: z.number().positive().optional(),
});