config.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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('https://love.hdlife.me/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. })
  29. export type AppConfig = z.infer<typeof ConfigSchema>;
  30. export function loadConfig(): AppConfig {
  31. const configPath = process.env.CONFIG_PATH ?? path.resolve(process.cwd(), 'config.json')
  32. if (!fs.existsSync(configPath)) {
  33. throw new Error(
  34. `找不到配置文件:${configPath}\n` +
  35. '请复制 config.example.json 为 config.json 并填写你的 rpc/ws 与 openPosition 配置'
  36. )
  37. }
  38. const raw = fs.readFileSync(configPath, 'utf-8')
  39. const parsed = JSON.parse(raw) as unknown
  40. return ConfigSchema.parse(parsed)
  41. }