config.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import fs from 'node:fs'
  2. import path from 'node:path'
  3. import { z } from 'zod'
  4. const ConfigSchema = z.object({
  5. rpcHttp: z.string().url(),
  6. rpcWs: z.string().url(),
  7. positionCopy: z.object({
  8. enabled: z.boolean().default(false),
  9. config: z.record(z.string().min(1), z.object({
  10. minimumDeposit: z.number().min(0),
  11. copyMount: z.record(z.string().min(1), z.number().min(0))
  12. })),
  13. url: z.string().url()
  14. }),
  15. openPosition: z.object({
  16. enabled: z.boolean().default(false),
  17. programId: z.string().min(32),
  18. logIncludes: z.array(z.string().min(1)).default([])
  19. }),
  20. closePosition: z.object({
  21. userAddress: z.string().min(32),
  22. discordWebhookUrl: z.string().url(),
  23. pageSize: z.number().min(1).max(100).default(50),
  24. lpCloseApiUrl: z.string().min(1).default('http://91.108.80.73/api/lp-index/lp-close'),
  25. lpCloseAuth: z.string().min(1).default('Basic YWRtaW46YzU4ODk5Njc=')
  26. }).optional(),
  27. blacklist: z.array(z.string().min(32)).default([]),
  28. discordWebhookUrl: z.string().url()
  29. })
  30. export type AppConfig = z.infer<typeof ConfigSchema>;
  31. export function loadConfig(): AppConfig {
  32. const configPath = process.env.CONFIG_PATH ?? path.resolve(process.cwd(), 'config.json')
  33. if (!fs.existsSync(configPath)) {
  34. throw new Error(
  35. `找不到配置文件:${configPath}\n` +
  36. '请复制 config.example.json 为 config.json 并填写你的 rpc/ws 与 openPosition 配置'
  37. )
  38. }
  39. const raw = fs.readFileSync(configPath, 'utf-8')
  40. const parsed = JSON.parse(raw) as unknown
  41. return ConfigSchema.parse(parsed)
  42. }