/meteora2

dlmm

Primary LanguageTypeScript

๐Ÿ—๏ธ DLMM ๆตๅŠจๆ€ง็ฎก็†็ณป็ปŸ

ไผไธš็บง Solana DLMM ๆตๅŠจๆ€ง่‡ชๅŠจๅŒ–็ฎก็†ๅนณๅฐ

๐Ÿ“‹ ้กน็›ฎๆฆ‚่ฟฐ

DLMMๆตๅŠจๆ€ง็ฎก็†็ณป็ปŸๆ˜ฏไธ€ไธชๅŸบไบŽ Solana ๅŒบๅ—้“พ็š„ไผไธš็บงๅŠจๆ€ๆตๅŠจๆ€งๅšๅธ‚ๅ•†๏ผˆDynamic Liquidity Market Maker๏ผ‰่‡ชๅŠจๅŒ–็ฎก็†ๅนณๅฐใ€‚็ณป็ปŸ้‡‡็”จ็ŽฐไปฃๅŒ–็š„ๅพฎๆœๅŠกๆžถๆž„่ฎพ่ฎก๏ผŒๆไพ›ๅฎŒๆ•ด็š„ๆตๅŠจๆ€ง็ญ–็•ฅ็ฎก็†ใ€้ฃŽ้™ฉๆŽงๅˆถใ€ๆ”ถ็›Šๅˆ†ๆžๅ’Œๅฎžๆ—ถ็›‘ๆŽงๅŠŸ่ƒฝใ€‚

๐ŸŽฏ ๆ ธๅฟƒ็‰นๆ€ง

  • ๐Ÿ—๏ธ ไผไธš็บงๆžถๆž„: ๅŸบไบŽ TypeScript + ไพ่ต–ๆณจๅ…ฅ็š„ๆจกๅ—ๅŒ–่ฎพ่ฎก๏ผŒๆ”ฏๆŒ้ซ˜ๅนถๅ‘ๅ’Œๆ•…้šœๅฎน้”™
  • ๐Ÿค– ๆ™บ่ƒฝ็ญ–็•ฅๅผ•ๆ“Ž: ๅ†…็ฝฎๅคš็งๆตๅŠจๆ€ง็ญ–็•ฅ๏ผŒๆ”ฏๆŒ่‡ชๅฎšไน‰็ญ–็•ฅๅผ€ๅ‘ๅ’Œ็ƒญๆ›ดๆ–ฐ
  • โšก ๅฎžๆ—ถ็›‘ๆŽง็ณป็ปŸ: WebSocket ้ฉฑๅŠจ็š„ๅฎžๆ—ถๆ•ฐๆฎ็›‘ๆŽงๅ’Œๅ‘Š่ญฆ็ณป็ปŸ
  • ๐Ÿ”’ ไผไธš็บงๅฎ‰ๅ…จ: ้’ฑๅŒ…ๅŠ ๅฏ†ๅญ˜ๅ‚จใ€ๆƒ้™็ฎก็†ใ€ๅฎก่ฎกๆ—ฅๅฟ—
  • ๐Ÿ“Š ๆ•ฐๆฎๅˆ†ๆžๅนณๅฐ: ๅฎŒๆ•ด็š„ๆ”ถ็›Šๅˆ†ๆžใ€้ฃŽ้™ฉ่ฏ„ไผฐๅ’ŒๆŠฅ่กจ็ณป็ปŸ
  • ๐ŸŒ ็ŽฐไปฃๅŒ– Web ็•Œ้ข: ๅ“ๅบ”ๅผไปช่กจ็›˜๏ผŒ็›ด่ง‚็š„ๆ“ไฝœไฝ“้ชŒ
  • ๐Ÿ”„ ่‡ชๅŠจๅŒ–่ฟ็ปด: ๅฎนๅ™จๅŒ–้ƒจ็ฝฒใ€ๅฅๅบทๆฃ€ๆŸฅใ€ๆ•…้šœ่‡ชๆ„ˆ

๐Ÿ›๏ธ ๆŠ€ๆœฏๆžถๆž„

๐Ÿ“ฆ ็ณป็ปŸๆžถๆž„ๅ›พ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Web ๅ‰็ซฏ็•Œ้ข (7001)                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚   ้’ฑๅŒ…็ฎก็†   โ”‚   ็ญ–็•ฅ็ฎก็†   โ”‚   ไบคๆ˜“ไธญๅฟƒ   โ”‚   ็›‘ๆŽงไธญๅฟƒ   โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                      โ”‚ WebSocket (7002/7003)
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ๅŽ็ซฏ API ๆœๅŠก (7000)                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚                  API ็ฝ‘ๅ…ณๅฑ‚                              โ”‚ โ”‚
โ”‚  โ”‚    ่ทฏ็”ฑ็ฎก็† โ”‚ ่ฎค่ฏๆŽˆๆƒ โ”‚ ้™ๆต็†”ๆ–ญ โ”‚ ๆ—ฅๅฟ—่ฎฐๅฝ•             โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚                  ไธšๅŠกๆœๅŠกๅฑ‚                              โ”‚ โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚  โ”‚  โ”‚  ็ญ–็•ฅ็ฎก็†ๅ™จ  โ”‚  ๅคดๅฏธ็ฎก็†ๅ™จ  โ”‚  ้’ฑๅŒ…ๆœๅŠก   โ”‚ ๅˆ†ๆžๆœๅŠก  โ”‚ โ”‚ โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚                  ๅ่ฎฎ้€‚้…ๅฑ‚                              โ”‚ โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚  โ”‚  โ”‚ Meteora     โ”‚  Jupiter    โ”‚   ๅคšRPC     โ”‚ ๆฑ ็ˆฌ่™ซ   โ”‚ โ”‚ โ”‚
โ”‚  โ”‚  โ”‚   ้€‚้…ๅ™จ     โ”‚   ้€‚้…ๅ™จ     โ”‚   ็ฎก็†ๅ™จ     โ”‚  ๆœๅŠก   โ”‚ โ”‚ โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚                  ๅŸบ็ก€่ฎพๆ–ฝๅฑ‚                              โ”‚ โ”‚
โ”‚  โ”‚    ไบ‹ไปถๆ€ป็บฟ โ”‚ ๆ—ฅๅฟ—ๆœๅŠก โ”‚ ็ผ“ๅญ˜ๆœๅŠก โ”‚ ้…็ฝฎ็ฎก็† โ”‚ ็Šถๆ€็ฎก็†  โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿงฑ ๆจกๅ—ๅˆ†ๅฑ‚่ฎพ่ฎก

โ”Œโ”€โ”€โ”€ ่กจ็คบๅฑ‚ (Presentation Layer)
โ”‚    โ”œโ”€โ”€ Web ๅ‰็ซฏ็•Œ้ข (React-like Components)
โ”‚    โ”œโ”€โ”€ RESTful API ๆŽฅๅฃ
โ”‚    โ””โ”€โ”€ WebSocket ๅฎžๆ—ถ้€šไฟก
โ”‚
โ”œโ”€โ”€โ”€ ไธšๅŠก้€ป่พ‘ๅฑ‚ (Business Layer)
โ”‚    โ”œโ”€โ”€ ็ญ–็•ฅ็ฎก็†ๅ™จ (StrategyManager)
โ”‚    โ”œโ”€โ”€ ๅคดๅฏธ็ฎก็†ๅ™จ (PositionManager)
โ”‚    โ”œโ”€โ”€ ้’ฑๅŒ…็ฎก็†ๅ™จ (WalletService)
โ”‚    โ”œโ”€โ”€ ๅˆ†ๆžๆœๅŠก (AnalyticsService)
โ”‚    โ””โ”€โ”€ ้ฃŽ้™ฉๆŽงๅˆถๅ™จ (RiskController)
โ”‚
โ”œโ”€โ”€โ”€ ๆœๅŠกๅฑ‚ (Service Layer)
โ”‚    โ”œโ”€โ”€ ๅŒบๅ—้“พๆœๅŠก (BlockchainService)
โ”‚    โ”œโ”€โ”€ ๅค–้ƒจ้›†ๆˆๆœๅŠก (ExternalService)
โ”‚    โ””โ”€โ”€ ๅ†…้ƒจๆœๅŠก (InternalService)
โ”‚
โ”œโ”€โ”€โ”€ ๆ•ฐๆฎ่ฎฟ้—ฎๅฑ‚ (Data Access Layer)
โ”‚    โ”œโ”€โ”€ ็ผ“ๅญ˜็ฎก็† (CacheService)
โ”‚    โ”œโ”€โ”€ ็Šถๆ€ๅญ˜ๅ‚จ (StateService)
โ”‚    โ””โ”€โ”€ ้…็ฝฎ็ฎก็† (ConfigService)
โ”‚
โ””โ”€โ”€โ”€ ๅŸบ็ก€่ฎพๆ–ฝๅฑ‚ (Infrastructure Layer)
     โ”œโ”€โ”€ ไบ‹ไปถๆ€ป็บฟ (EventBus)
     โ”œโ”€โ”€ ๆ—ฅๅฟ—็ณป็ปŸ (LoggerService)
     โ”œโ”€โ”€ ็›‘ๆŽง็ณป็ปŸ (MonitorService)
     โ””โ”€โ”€ ไพ่ต–ๆณจๅ…ฅ (DIContainer)

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

๐Ÿ’ป ็Žฏๅขƒ่ฆๆฑ‚

็ป„ไปถ ็‰ˆๆœฌ่ฆๆฑ‚ ่ฏดๆ˜Ž
Node.js >= 18.0.0 JavaScript ่ฟ่กŒๆ—ถ
NPM >= 9.0.0 ๅŒ…็ฎก็†ๅ™จ
ๅ†…ๅญ˜ >= 4GB ๆŽจ่ 8GB
ๅญ˜ๅ‚จ >= 20GB SSD ๆŽจ่
็ฝ‘็ปœ ็จณๅฎš็š„ไบ’่”็ฝ‘่ฟžๆŽฅ ้œ€่ฆ่ฎฟ้—ฎ Solana RPC

โšก ไธ€้”ฎๅฏๅŠจ

# 1. ๅ…‹้š†้กน็›ฎ
git clone <repository-url>
cd dlmm-liquidity-manager

# 2. ๅฎ‰่ฃ…ไพ่ต–
npm install

# 3. ้…็ฝฎ็Žฏๅขƒๅ˜้‡
cp env.example .env
# ็ผ–่พ‘ .env ๆ–‡ไปถ๏ผŒ้…็ฝฎๅฟ…่ฆๅ‚ๆ•ฐ

# 4. ไธ€้”ฎๅฏๅŠจ็ณป็ปŸ
./scripts/quick-start.sh

# 5. ้ชŒ่ฏ้ƒจ็ฝฒ
curl http://localhost:7000/api/health
curl http://localhost:7001/health

๐Ÿ”ง ่ฏฆ็ป†้…็ฝฎ

็Žฏๅขƒๅ˜้‡้…็ฝฎ

# .env ้…็ฝฎๆ–‡ไปถ
NODE_ENV=production                    # ่ฟ่กŒ็Žฏๅขƒ
SERVER_PORT=7000                      # API ๆœๅŠกๅ™จ็ซฏๅฃ
WS_PORT=7002                          # WebSocket ็ซฏๅฃ
MONITOR_PORT=7003                     # ็›‘ๆŽง็ซฏๅฃ

# Solana ๅŒบๅ—้“พ้…็ฝฎ
SOLANA_NETWORK=mainnet-beta           # Solana ็ฝ‘็ปœ
SOLANA_PRIVATE_KEY=your-private-key   # ้’ฑๅŒ…็ง้’ฅ (Base58)
RPC_PRIMARY=https://api.mainnet-beta.solana.com
RPC_BACKUP=https://solana-api.projectserum.com

# Jupiter ไบคๆ˜“้…็ฝฎ
JUPITER_API_URL=https://quote-api.jup.ag/v6
JUPITER_SLIPPAGE_BPS=50               # ้ป˜่ฎคๆป‘็‚น 0.5%

# ๅฎ‰ๅ…จ้…็ฝฎ
WALLET_ENCRYPTION_KEY=your-encryption-key  # ้’ฑๅŒ…ๅŠ ๅฏ†ๅฏ†้’ฅ

# ๆ—ฅๅฟ—้…็ฝฎ
LOG_LEVEL=info                        # ๆ—ฅๅฟ—็บงๅˆซ
LOG_MAX_FILE_SIZE=2097152            # ๅ•ไธชๆ—ฅๅฟ—ๆ–‡ไปถๆœ€ๅคงๅคงๅฐ (2MB)
LOG_MAX_FILES=5                      # ๆœ€ๅคงๆ—ฅๅฟ—ๆ–‡ไปถๆ•ฐ้‡

้ซ˜็บง้…็ฝฎ

// config/default.json
{
  "strategy": {
    "defaultTimeout": 1800000,        // ็ญ–็•ฅๆ‰ง่กŒ่ถ…ๆ—ถ (30ๅˆ†้’Ÿ)
    "monitorInterval": 30000,         // ็›‘ๆŽง้—ด้š” (30็ง’)
    "maxActiveStrategies": 10,        // ๆœ€ๅคงๅนถๅ‘็ญ–็•ฅๆ•ฐ
    "defaultParams": {
      "slippageBps": 100,             // ้ป˜่ฎคๆป‘็‚น 1%
      "binRange": 69,                 // ้ป˜่ฎค Bin ่Œƒๅ›ด
      "outOfRangeTimeoutMinutes": 30, // ่ถ…ๅ‡บ่Œƒๅ›ด่ถ…ๆ—ถ
      "stopLossBinOffset": 5          // ๆญขๆŸ Bin ๅ็งป
    }
  },
  "solana": {
    "priorityFee": 200000,            // ไผ˜ๅ…ˆ็บง่ดน็”จ
    "commitment": "confirmed",         // ็กฎ่ฎค็บงๅˆซ
    "timeout": 30000,                 // RPC ่ถ…ๆ—ถ
    "retries": {
      "maxRetries": 3,                // ๆœ€ๅคง้‡่ฏ•ๆฌกๆ•ฐ
      "retryDelayMs": 2000,           // ้‡่ฏ•ๅปถ่ฟŸ
      "backoffFactor": 2              // ้€€้ฟๅ› ๅญ
    }
  }
}

๐Ÿ› ๏ธ ๅŠŸ่ƒฝๆจกๅ—

๐Ÿ” ้’ฑๅŒ…็ฎก็†็ณป็ปŸ

ๆ ธๅฟƒๅŠŸ่ƒฝ

  • ๅฎ‰ๅ…จๅญ˜ๅ‚จ: AES-256-GCM ๅŠ ๅฏ†ๅญ˜ๅ‚จ็ง้’ฅ
  • ๅคš็ญพๆ”ฏๆŒ: ๆ”ฏๆŒๅคš้‡็ญพๅ้’ฑๅŒ…
  • ไฝ™้ข็ฎก็†: ๅฎžๆ—ถๆŸฅ่ฏข SOL ๅ’Œ SPL Token ไฝ™้ข
  • ไบคๆ˜“็ญพๅ: ๅฎ‰ๅ…จ็š„ไบคๆ˜“็ญพๅๆœบๅˆถ

API ๆŽฅๅฃ

# ๅˆ›ๅปบ้’ฑๅŒ…
POST /api/wallet/create
{
  "password": "your-secure-password"
}

# ่งฃ้”้’ฑๅŒ…
POST /api/wallet/unlock
{
  "password": "your-secure-password"
}

# ่Žทๅ–ไฝ™้ข
GET /api/wallet/balance
GET /api/wallet/balance/:tokenMint

# ้”ๅฎš้’ฑๅŒ…
POST /api/wallet/lock

๐Ÿ“Š ็ญ–็•ฅ็ฎก็†็ณป็ปŸ

็ญ–็•ฅ็ฑปๅž‹

  1. ็ฎ€ๅ• Y ๅคดๅฏธ็ญ–็•ฅ (Simple Y Strategy)

    • ็”จ้€”: ๅ•ไพงๆตๅŠจๆ€งๆไพ›
    • ็‰น็‚น: ไธ“ๆณจๅ•ไธ€ไปฃๅธๆตๅŠจๆ€ง๏ผŒ้ฃŽ้™ฉ็›ธๅฏน่พƒไฝŽ
    • ้€‚็”จๅœบๆ™ฏ: ็จณๅฎšๅธๅฏนใ€ไธปๆตไปฃๅธ
  2. ่ฟž้”ๅคดๅฏธ็ญ–็•ฅ (Chain Position Strategy)

    • ็”จ้€”: ๅคšๅฑ‚็บงๆตๅŠจๆ€ง็ฎก็†
    • ็‰น็‚น: ๅˆ›ๅปบ่ฟž็ปญ็š„ๆตๅŠจๆ€งๅŒบ้—ด๏ผŒ่‡ชๅŠจ่ฐƒๆ•ด
    • ้€‚็”จๅœบๆ™ฏ: ้ซ˜ๆณขๅŠจๆ€งไปฃๅธๅฏน

็ญ–็•ฅ้…็ฝฎ

{
  "type": "simple_y",
  "params": {
    "poolAddress": "pool_address_here",
    "yAmount": 1000000,              // Y ไปฃๅธๆ•ฐ้‡ (ๆœ€ๅฐๅ•ไฝ)
    "binRange": 69,                  // Bin ่Œƒๅ›ด
    "slippageBps": 100,             // ๆป‘็‚นๅฎนๅฟๅบฆ (1%)
    "autoRebalance": true,          // ่‡ชๅŠจ้‡ๅนณ่กก
    "stopLoss": {
      "enabled": true,
      "binOffset": 5,               // ๆญขๆŸ่งฆๅ‘ๅ็งป
      "percentage": 10              // ๆญขๆŸ็™พๅˆ†ๆฏ”
    },
    "monitoring": {
      "interval": 30000,            // ็›‘ๆŽง้—ด้š” (30็ง’)
      "outOfRangeTimeout": 1800000  // ่ถ…ๅ‡บ่Œƒๅ›ด่ถ…ๆ—ถ (30ๅˆ†้’Ÿ)
    }
  }
}

็ญ–็•ฅ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†

# ๅˆ›ๅปบ็ญ–็•ฅ
POST /api/strategy/create
{
  "type": "simple_y",
  "name": "USDC-SOLๆตๅŠจๆ€ง็ญ–็•ฅ",
  "params": { ... }
}

# ๅฏๅŠจ็ญ–็•ฅ
POST /api/strategy/:instanceId/start

# ๆš‚ๅœ็ญ–็•ฅ
POST /api/strategy/:instanceId/pause

# ๆขๅค็ญ–็•ฅ
POST /api/strategy/:instanceId/resume

# ๅœๆญข็ญ–็•ฅ
POST /api/strategy/:instanceId/stop

# ่Žทๅ–็ญ–็•ฅ็Šถๆ€
GET /api/strategy/:instanceId

# ่Žทๅ–ๆ‰€ๆœ‰็ญ–็•ฅ
GET /api/strategy/list

๐ŸŽฏ ๅคดๅฏธ็ฎก็†็ณป็ปŸ

ๅคดๅฏธ็ฑปๅž‹

  • Y ๅคดๅฏธ: ๅ•ไธ€ไปฃๅธๆตๅŠจๆ€งๅคดๅฏธ
  • X ๅคดๅฏธ: ๅฏน็งฐๆตๅŠจๆ€งๅคดๅฏธ
  • ๅŒๅ‘ๅคดๅฏธ: ๅŒๆ—ถๆŒๆœ‰ X ๅ’Œ Y ๅคดๅฏธ

ๅคดๅฏธๆ“ไฝœ

# ๅˆ›ๅปบ Y ๅคดๅฏธ
POST /api/position/y/create
{
  "poolAddress": "pool_address",
  "amount": "1000000",
  "binRange": 69,
  "slippageBps": 100
}

# ๅˆ›ๅปบ X ๅคดๅฏธ
POST /api/position/x/create
{
  "poolAddress": "pool_address",
  "amount": "1000000",
  "binRange": 69,
  "slippageBps": 100
}

# ๅ…ณ้—ญๅคดๅฏธ
DELETE /api/position/:positionAddress

# ๆ”ถๅ–ๆ‰‹็ปญ่ดน
POST /api/position/:positionAddress/harvest

# ่Žทๅ–ๅคดๅฏธไฟกๆฏ
GET /api/position/:positionAddress

# ่Žทๅ–็”จๆˆทๆ‰€ๆœ‰ๅคดๅฏธ
GET /api/position/user/:userAddress

๐Ÿช Jupiter ไบคๆ˜“้›†ๆˆ

ไบคๆ˜“ๅŠŸ่ƒฝ

  • ๆ™บ่ƒฝ่ทฏ็”ฑ: ่‡ชๅŠจๅฏปๆ‰พๆœ€ไผ˜ไบคๆ˜“่ทฏๅพ„
  • ๆป‘็‚นไฟๆŠค: ่‡ช้€‚ๅบ”ๆป‘็‚น็ฎก็†
  • MEV ไฟๆŠค: ๅ MEV ไบคๆ˜“็ญ–็•ฅ
  • ๆ‰น้‡ไบคๆ˜“: ๆ”ฏๆŒๆ‰น้‡ไบคๆ˜“ๆ‰ง่กŒ

ไบคๆ˜“ๆŽฅๅฃ

# ่Žทๅ–ๆŠฅไปท
POST /api/jupiter/quote
{
  "inputMint": "So11111111111111111111111111111111111111112",
  "outputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "amount": "1000000",
  "slippageBps": 50
}

# ๆ‰ง่กŒไบคๆ˜“
POST /api/jupiter/swap
{
  "route": { ... },
  "userPublicKey": "user_public_key"
}

# ่Žทๅ–ไบคๆ˜“ๅކๅฒ
GET /api/jupiter/history/:userAddress

๐ŸŠ ๆฑ ็ˆฌ่™ซ็ณป็ปŸ

ๅŠŸ่ƒฝ็‰นๆ€ง

  • ่‡ชๅŠจๅ‘็Žฐ: ๅฎžๆ—ถๅ‘็Žฐๆ–ฐ็š„ DLMM ๆตๅŠจๆ€งๆฑ 
  • ๆ™บ่ƒฝ็ญ›้€‰: ๅŸบไบŽๅคš็ปดๅบฆๆŒ‡ๆ ‡็ญ›้€‰ไผ˜่ดจๆฑ ๅญ
  • ้ฃŽ้™ฉ่ฏ„ไผฐ: ่‡ชๅŠจ่ฏ„ไผฐๆฑ ๅญ้ฃŽ้™ฉ็ญ‰็บง
  • ๅฎžๆ—ถ็›‘ๆŽง: ็›‘ๆŽงๆฑ ๅญ็Šถๆ€ๅ˜ๅŒ–

็ญ›้€‰ๆกไปถ

{
  "filters": {
    "meteorScore": {
      "min": 70,
      "max": 100
    },
    "tvl": {
      "min": 10000,
      "max": 10000000
    },
    "age": {
      "minHours": 24,
      "maxHours": 720
    },
    "apr": {
      "min24h": 5,
      "max24h": 1000
    },
    "volume": {
      "min24h": 10000,
      "max24h": 100000000
    },
    "fdv": {
      "min": 1000000,
      "max": 1000000000
    }
  }
}

๐Ÿ“ˆ ๆ•ฐๆฎๅˆ†ๆž็ณป็ปŸ

ๅˆ†ๆž็ปดๅบฆ

  • ๆ”ถ็›Šๅˆ†ๆž: PnL ่ฎก็ฎ—ใ€APR/APY ๅˆ†ๆž
  • ้ฃŽ้™ฉๅˆ†ๆž: VaRใ€ๆœ€ๅคงๅ›žๆ’คใ€ๅคๆ™ฎๆฏ”็އ
  • ็ญ–็•ฅๅฏนๆฏ”: ไธๅŒ็ญ–็•ฅๆ•ˆๆžœๅฏนๆฏ”
  • ๅธ‚ๅœบๅˆ†ๆž: ๅธ‚ๅœบ่ถ‹ๅŠฟใ€็›ธๅ…ณๆ€งๅˆ†ๆž

ๅˆ†ๆžๆŽฅๅฃ

# ่Žทๅ–็ญ–็•ฅๆ”ถ็›ŠๆŠฅๅ‘Š
GET /api/analytics/strategy/:instanceId/pnl

# ่Žทๅ–ๅคดๅฏธๅˆ†ๆž
GET /api/analytics/position/:positionAddress

# ่Žทๅ–ๅธ‚ๅœบๆ•ฐๆฎ
GET /api/analytics/market/:poolAddress

# ๅฏผๅ‡บๆŠฅ่กจ
GET /api/analytics/export/:type

๐ŸŒ Web็•Œ้ขไฝฟ็”จๆŒ‡ๅ—

๐Ÿ“Š ไปช่กจ็›˜ๆฆ‚่งˆ

่ฎฟ้—ฎ http://localhost:7001 ่ฟ›ๅ…ฅ็ณป็ปŸไธป็•Œ้ข

ไธป่ฆๅŠŸ่ƒฝๆจกๅ—

  1. ้’ฑๅŒ…็ฎก็†้กต้ข

    • ้’ฑๅŒ…ๅˆ›ๅปบๅ’Œๅฏผๅ…ฅ
    • ไฝ™้ขๆŸฅ่ฏขๅ’Œ็ฎก็†
    • ไบคๆ˜“ๅކๅฒ่ฎฐๅฝ•
  2. ็ญ–็•ฅ็ฎก็†้กต้ข

    • ็ญ–็•ฅๅˆ›ๅปบๅ‘ๅฏผ
    • ๅฎžๆ—ถ็ญ–็•ฅ็›‘ๆŽง
    • ็ญ–็•ฅ้…็ฝฎ็ฎก็†
  3. ๅคดๅฏธ็ฎก็†้กต้ข

    • ๅคดๅฏธๅˆ›ๅปบๅ’Œๅ…ณ้—ญ
    • ๅคดๅฏธๅฎžๆ—ถ็›‘ๆŽง
    • ๆ”ถ็›Š็ปŸ่ฎกๅˆ†ๆž
  4. ไบคๆ˜“ไธญๅฟƒ้กต้ข

    • Jupiter ไปฃๅธไบคๆข
    • ไบคๆ˜“ๅކๅฒ่ฎฐๅฝ•
    • ๅธ‚ๅœบๆ•ฐๆฎๆŸฅ็œ‹
  5. ๆฑ ็ˆฌ่™ซ้กต้ข

    • ๆฑ ๅญๅ‘็Žฐๅ’Œ็ญ›้€‰
    • ่ฟ‡ๆปคๆกไปถ่ฎพ็ฝฎ
    • ๅฎžๆ—ถ็›‘ๆŽง้ขๆฟ
  6. ๅˆ†ๆžไธญๅฟƒ้กต้ข

    • ๆ”ถ็›Šๅˆ†ๆžๆŠฅ่กจ
    • ้ฃŽ้™ฉ่ฏ„ไผฐๆŠฅๅ‘Š
    • ็ญ–็•ฅๆ•ˆๆžœๅฏนๆฏ”

๐Ÿ–ฑ๏ธ ๆ“ไฝœๆต็จ‹

ๅˆ›ๅปบ็ฌฌไธ€ไธช็ญ–็•ฅ

  1. ๅ‡†ๅค‡้’ฑๅŒ…

    ้’ฑๅŒ…็ฎก็† โ†’ ๅˆ›ๅปบ้’ฑๅŒ… โ†’ ่พ“ๅ…ฅๅฏ†็  โ†’ ไฟๅญ˜ๅŠฉ่ฎฐ่ฏ
    
  2. ้€‰ๆ‹ฉๆฑ ๅญ

    ๆฑ ็ˆฌ่™ซ โ†’ ่ฎพ็ฝฎ็ญ›้€‰ๆกไปถ โ†’ ้€‰ๆ‹ฉๅˆ้€‚ๆฑ ๅญ โ†’ ๅคๅˆถๆฑ ๅœฐๅ€
    
  3. ๅˆ›ๅปบ็ญ–็•ฅ

    ็ญ–็•ฅ็ฎก็† โ†’ ๅˆ›ๅปบ็ญ–็•ฅ โ†’ ้€‰ๆ‹ฉ็ฑปๅž‹ โ†’ ้…็ฝฎๅ‚ๆ•ฐ โ†’ ๅฏๅŠจ็ญ–็•ฅ
    
  4. ็›‘ๆŽง่ฟ่กŒ

    ็ญ–็•ฅ็›‘ๆŽง โ†’ ๆŸฅ็œ‹ๅฎžๆ—ถ็Šถๆ€ โ†’ ๅˆ†ๆžๆ”ถ็›Š่กจ็Žฐ โ†’ ่ฐƒๆ•ดๅ‚ๆ•ฐ
    

๐Ÿณ ้ƒจ็ฝฒๅ’Œ่ฟ็ปด

๐Ÿ“ฆ Docker ้ƒจ็ฝฒ

ไฝฟ็”จ Docker Compose (ๆŽจ่)

# docker-compose.yml
version: '3.8'
services:
  dlmm-manager:
    build: .
    ports:
      - "7000:7000"    # API ๆœๅŠก
      - "7001:7001"    # Web ็•Œ้ข
      - "7002:7002"    # WebSocket
      - "7003:7003"    # ็›‘ๆŽง
    environment:
      - NODE_ENV=production
      - SERVER_PORT=7000
      - WS_PORT=7002
      - MONITOR_PORT=7003
    volumes:
      - ./data:/app/data
      - ./logs:/app/logs
      - ./config:/app/config
    env_file:
      - .env
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:7000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3

้ƒจ็ฝฒๅ‘ฝไปค

# ๆž„ๅปบๅ’ŒๅฏๅŠจ
docker-compose up -d

# ๆŸฅ็œ‹ๆ—ฅๅฟ—
docker-compose logs -f

# ๅœๆญขๆœๅŠก
docker-compose down

# ๆ›ดๆ–ฐๆœๅŠก
docker-compose pull && docker-compose up -d

๐Ÿ–ฅ๏ธ ไผ ็ปŸ้ƒจ็ฝฒ

Ubuntu ๆœๅŠกๅ™จ้ƒจ็ฝฒ

# 1. ๅฎ‰่ฃ… Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# 2. ๅ…‹้š†้กน็›ฎ
git clone <repository-url>
cd dlmm-liquidity-manager

# 3. ๅฎ‰่ฃ…ไพ่ต–
npm install --production

# 4. ้…็ฝฎ็Žฏๅขƒ
cp env.example .env
# ็ผ–่พ‘้…็ฝฎๆ–‡ไปถ

# 5. ๆž„ๅปบ้กน็›ฎ
npm run build

# 6. ไฝฟ็”จ PM2 ็ฎก็†่ฟ›็จ‹
npm install -g pm2
pm2 start ecosystem.config.js
pm2 save
pm2 startup

PM2 ้…็ฝฎๆ–‡ไปถ

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'dlmm-api',
    script: 'dist/app.js',
    instances: 2,
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 7000
    },
    error_file: './logs/api-error.log',
    out_file: './logs/api-out.log',
    log_file: './logs/api.log',
    time: true
  }, {
    name: 'dlmm-web',
    script: 'web/server.js',
    instances: 1,
    env: {
      NODE_ENV: 'production',
      PORT: 7001
    }
  }]
}

๐Ÿ“Š ็›‘ๆŽงๅ’Œ่ฟ็ปด

ๅฅๅบทๆฃ€ๆŸฅ

# API ๆœๅŠกๅฅๅบทๆฃ€ๆŸฅ
curl http://localhost:7000/api/health

# Web ๆœๅŠกๅฅๅบทๆฃ€ๆŸฅ
curl http://localhost:7001/health

# ็ณป็ปŸ็Šถๆ€ๆฃ€ๆŸฅ
curl http://localhost:7000/api/system/status

ๆ—ฅๅฟ—็ฎก็†

# ๆŸฅ็œ‹ๅฎžๆ—ถๆ—ฅๅฟ—
tail -f logs/operation.log
tail -f logs/strategy.log
tail -f logs/monitor.log

# ๆ—ฅๅฟ—่ฝฎ่ฝฌ
./scripts/rotate-logs.sh

# ๆธ…็†ๆ—งๆ—ฅๅฟ—
./scripts/clean-logs.sh

ๆ€ง่ƒฝ็›‘ๆŽง

  • ็ณป็ปŸๆŒ‡ๆ ‡: CPUใ€ๅ†…ๅญ˜ใ€็ฃ็›˜ไฝฟ็”จ็އ
  • ไธšๅŠกๆŒ‡ๆ ‡: ็ญ–็•ฅๆ•ฐ้‡ใ€ไบคๆ˜“ๆˆๅŠŸ็އใ€ๆ”ถ็›Š็އ
  • ๆŠ€ๆœฏๆŒ‡ๆ ‡: API ๅ“ๅบ”ๆ—ถ้—ดใ€้”™่ฏฏ็އใ€ๅžๅ้‡

๐Ÿ› ๏ธ ๅผ€ๅ‘ๆŒ‡ๅ—

๐Ÿ—๏ธ ้กน็›ฎ็ป“ๆž„

dlmm-liquidity-manager/
โ”œโ”€โ”€ src/                          # ๆบไปฃ็ ็›ฎๅฝ•
โ”‚   โ”œโ”€โ”€ app.ts                   # ๅบ”็”จ็จ‹ๅบๅ…ฅๅฃ
โ”‚   โ”œโ”€โ”€ di/                      # ไพ่ต–ๆณจๅ…ฅ
โ”‚   โ”‚   โ””โ”€โ”€ container.ts         # DI ๅฎนๅ™จ้…็ฝฎ
โ”‚   โ”œโ”€โ”€ server/                  # API ๆœๅŠกๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ api-server.ts        # Express ๆœๅŠกๅ™จ
โ”‚   โ”‚   โ”œโ”€โ”€ routes/              # API ่ทฏ็”ฑ
โ”‚   โ”‚   โ””โ”€โ”€ middleware/          # ไธญ้—ดไปถ
โ”‚   โ”œโ”€โ”€ services/                # ๆœๅŠกๅฑ‚
โ”‚   โ”‚   โ”œโ”€โ”€ blockchain/          # ๅŒบๅ—้“พๆœๅŠก
โ”‚   โ”‚   โ”œโ”€โ”€ business/            # ไธšๅŠกๆœๅŠก
โ”‚   โ”‚   โ”œโ”€โ”€ external/            # ๅค–้ƒจๆœๅŠก
โ”‚   โ”‚   โ”œโ”€โ”€ internal/            # ๅ†…้ƒจๆœๅŠก
โ”‚   โ”‚   โ””โ”€โ”€ strategy/            # ็ญ–็•ฅๆœๅŠก
โ”‚   โ”œโ”€โ”€ infrastructure/          # ๅŸบ็ก€่ฎพๆ–ฝ
โ”‚   โ”‚   โ”œโ”€โ”€ EventBus.ts          # ไบ‹ไปถๆ€ป็บฟ
โ”‚   โ”‚   โ”œโ”€โ”€ logging/             # ๆ—ฅๅฟ—็ณป็ปŸ
โ”‚   โ”‚   โ””โ”€โ”€ StateService.ts      # ็Šถๆ€็ฎก็†
โ”‚   โ”œโ”€โ”€ types/                   # ็ฑปๅž‹ๅฎšไน‰
โ”‚   โ””โ”€โ”€ utils/                   # ๅทฅๅ…ทๅ‡ฝๆ•ฐ
โ”œโ”€โ”€ web/                         # Web ๅ‰็ซฏ
โ”‚   โ”œโ”€โ”€ public/                  # ้™ๆ€่ต„ๆบ
โ”‚   โ”‚   โ”œโ”€โ”€ js/                  # JavaScript ๆ–‡ไปถ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ components/      # ็ป„ไปถ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ services/        # ๅ‰็ซฏๆœๅŠก
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ utils/           # ๅทฅๅ…ทๅ‡ฝๆ•ฐ
โ”‚   โ”‚   โ””โ”€โ”€ css/                 # ๆ ทๅผๆ–‡ไปถ
โ”‚   โ””โ”€โ”€ server.js                # Web ๆœๅŠกๅ™จ
โ”œโ”€โ”€ config/                      # ้…็ฝฎๆ–‡ไปถ
โ”œโ”€โ”€ scripts/                     # ่„šๆœฌๆ–‡ไปถ
โ”œโ”€โ”€ test/                        # ๆต‹่ฏ•ๆ–‡ไปถ
โ”œโ”€โ”€ logs/                        # ๆ—ฅๅฟ—็›ฎๅฝ•
โ””โ”€โ”€ data/                        # ๆ•ฐๆฎ็›ฎๅฝ•

๐Ÿ”ง ๆทปๅŠ ๆ–ฐๅŠŸ่ƒฝ

ๅˆ›ๅปบๆ–ฐๆœๅŠก

// src/services/business/NewService.ts
import { injectable, inject } from 'tsyringe';
import { TYPES, ILoggerService } from '../../types/interfaces';

@injectable()
export class NewService {
  constructor(
    @inject(TYPES.LoggerService) private logger: ILoggerService
  ) {}

  async initialize(): Promise<void> {
    await this.logger.logSystem('INFO', 'ๆ–ฐๆœๅŠกๅˆๅง‹ๅŒ–');
  }

  async doSomething(): Promise<void> {
    // ๅฎž็ŽฐไธšๅŠก้€ป่พ‘
  }
}

ๆณจๅ†ŒๆœๅŠก

// src/di/container.ts
import { NewService } from '../services/business/NewService';

// ๅœจ registerServiceLayer ๆ–นๆณ•ไธญๆทปๅŠ 
container.registerSingleton('NewService', NewService);

ๅˆ›ๅปบ API ่ทฏ็”ฑ

// src/server/routes/new-routes.ts
import { Router } from 'express';
import { NewService } from '../../services/business/NewService';

export function createNewRoutes(newService: NewService): Router {
  const router = Router();

  router.get('/api/new/status', async (req, res) => {
    try {
      const status = await newService.getStatus();
      res.json({ success: true, data: status });
    } catch (error) {
      res.status(500).json({ success: false, error: error.message });
    }
  });

  return router;
}

๐Ÿงช ๆต‹่ฏ•

่ฟ่กŒๆต‹่ฏ•

# ๅ•ๅ…ƒๆต‹่ฏ•
npm test

# ้›†ๆˆๆต‹่ฏ•
npm run test:integration

# ่ฆ†็›–็އๆต‹่ฏ•
npm run test:coverage

# ็‰นๅฎšๆต‹่ฏ•ๆ–‡ไปถ
npm test -- --testPathPattern=StrategyManager

ๆต‹่ฏ•็คบไพ‹

// test/services/StrategyManager.test.ts
import { StrategyManager } from '../../src/services/strategy/StrategyManager';

describe('StrategyManager', () => {
  let strategyManager: StrategyManager;

  beforeEach(() => {
    // ๅˆๅง‹ๅŒ–ๆต‹่ฏ•็Žฏๅขƒ
  });

  it('should create strategy successfully', async () => {
    const result = await strategyManager.createStrategy({
      type: 'simple_y',
      params: {}
    });
    
    expect(result).toBeDefined();
    expect(result.success).toBe(true);
  });
});

๐Ÿšจ ๆ•…้šœๆŽ’้™ค

ๅธธ่ง้—ฎ้ข˜ๅ’Œ่งฃๅ†ณๆ–นๆกˆ

1. ็ซฏๅฃๅ ็”จ้—ฎ้ข˜

# ๆŸฅๆ‰พๅ ็”จ็ซฏๅฃ็š„่ฟ›็จ‹
lsof -i :7000
lsof -i :7001

# ๅœๆญข่ฟ›็จ‹
kill -9 <PID>

# ๆˆ–ไฝฟ็”จๅฟซ้€Ÿๅœๆญข่„šๆœฌ
./scripts/quick-stop.sh

2. ้’ฑๅŒ…่งฃ้”ๅคฑ่ดฅ

# ๆฃ€ๆŸฅ้’ฑๅŒ…ๆ–‡ไปถๆƒ้™
ls -la data/wallet.enc

# ้ชŒ่ฏๅŠ ๅฏ†ๅฏ†้’ฅ
echo $WALLET_ENCRYPTION_KEY

# ้‡ๆ–ฐๅˆ›ๅปบ้’ฑๅŒ…
rm data/wallet.enc
# ้‡ๆ–ฐๅˆ›ๅปบ้’ฑๅŒ…

3. RPC ่ฟžๆŽฅ้—ฎ้ข˜

# ๆต‹่ฏ• RPC ่ฟžๆŽฅ
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}' \
  $RPC_PRIMARY

# ๅˆ‡ๆขๅˆฐๅค‡็”จ RPC
export RPC_PRIMARY="https://api.mainnet-beta.solana.com"

4. ็ญ–็•ฅๆ‰ง่กŒๅคฑ่ดฅ

# ๆŸฅ็œ‹็ญ–็•ฅๆ—ฅๅฟ—
tail -f logs/strategy.log

# ๆฃ€ๆŸฅ็ญ–็•ฅ็Šถๆ€
curl http://localhost:7000/api/strategy/list

# ้‡ๅฏ็ญ–็•ฅๆœๅŠก
pm2 restart dlmm-api

5. ๅ‰็ซฏ้กต้ขๆ— ๆณ•ๅŠ ่ฝฝ

# ๆฃ€ๆŸฅ Web ๆœๅŠก็Šถๆ€
curl http://localhost:7001/health

# ้‡ๅฏ Web ๆœๅŠก
pm2 restart dlmm-web

# ๆธ…้™คๆต่งˆๅ™จ็ผ“ๅญ˜
# Ctrl+Shift+R (ๅผบๅˆถๅˆทๆ–ฐ)

๐Ÿ“‹ ๆ—ฅๅฟ—ๅˆ†ๆž

ๆ—ฅๅฟ—็บงๅˆซ

  • ERROR: ็ณป็ปŸ้”™่ฏฏ๏ผŒ้œ€่ฆ็ซ‹ๅณๅค„็†
  • WARN: ่ญฆๅ‘Šไฟกๆฏ๏ผŒ้œ€่ฆๅ…ณๆณจ
  • INFO: ไธ€่ˆฌไฟกๆฏ๏ผŒๆญฃๅธธ่ฟ่กŒ็Šถๆ€
  • DEBUG: ่ฐƒ่ฏ•ไฟกๆฏ๏ผŒๅผ€ๅ‘้˜ถๆฎตไฝฟ็”จ

ๅ…ณ้”ฎๆ—ฅๅฟ—ไฝ็ฝฎ

logs/
โ”œโ”€โ”€ operation.log      # ๆ“ไฝœๆ—ฅๅฟ—
โ”œโ”€โ”€ strategy.log       # ็ญ–็•ฅๆ‰ง่กŒๆ—ฅๅฟ—
โ”œโ”€โ”€ monitor.log        # ็›‘ๆŽงๆ—ฅๅฟ—
โ”œโ”€โ”€ api-error.log      # API ้”™่ฏฏๆ—ฅๅฟ—
โ””โ”€โ”€ system.log         # ็ณป็ปŸๆ—ฅๅฟ—

๐Ÿ”ง ๆ€ง่ƒฝไผ˜ๅŒ–

็ณป็ปŸไผ˜ๅŒ–ๅปบ่ฎฎ

  1. ่ต„ๆบ้…็ฝฎ: ๅปบ่ฎฎ 8GB+ ๅ†…ๅญ˜๏ผŒSSD ๅญ˜ๅ‚จ
  2. ็ฝ‘็ปœไผ˜ๅŒ–: ไฝฟ็”จ้ซ˜่ดจ้‡ RPC ่Š‚็‚น
  3. ็ผ“ๅญ˜็ญ–็•ฅ: ๅˆ็†่ฎพ็ฝฎ็ผ“ๅญ˜ TTL
  4. ๅนถๅ‘ๆŽงๅˆถ: ้™ๅˆถๆœ€ๅคงๅนถๅ‘็ญ–็•ฅๆ•ฐ้‡
  5. ๆ—ฅๅฟ—็ฎก็†: ๅฎšๆœŸๆธ…็†ๆ—งๆ—ฅๅฟ—ๆ–‡ไปถ

๐Ÿ“š ๆœ€ไฝณๅฎž่ทต

๐Ÿ’ฐ ่ต„้‡‘็ฎก็†

  • ๅˆ†ๆ•ฃๆŠ•่ต„๏ผŒไธ่ฆๅฐ†ๆ‰€ๆœ‰่ต„้‡‘ๆŠ•ๅ…ฅๅ•ไธ€็ญ–็•ฅ
  • ่ฎพ็ฝฎๅˆ็†็š„ๆญขๆŸ็‚น๏ผŒๆŽงๅˆถ้ฃŽ้™ฉ
  • ๅฎšๆœŸ่ฏ„ไผฐ็ญ–็•ฅ่กจ็Žฐ๏ผŒๅŠๆ—ถ่ฐƒๆ•ด

โš™๏ธ ็ญ–็•ฅ้…็ฝฎ

  • ๆ นๆฎๅธ‚ๅœบๆณขๅŠจๆ€ง่ฐƒๆ•ด Bin ่Œƒๅ›ด
  • ็›‘ๆŽงๆฑ ๅญ็š„ๆตๅŠจๆ€งๆทฑๅบฆ
  • ่ฎพ็ฝฎๅˆ็†็š„ๆป‘็‚นๅฎนๅฟๅบฆ

๐Ÿ›ก๏ธ ๅฎ‰ๅ…จๅฎž่ทต

  • ๅฎšๆœŸๆ›ดๆ–ฐ็ณป็ปŸๅ’Œไพ่ต–
  • ไฝฟ็”จๅผบๅฏ†็ ๅ’ŒๅŠ ๅฏ†ๅญ˜ๅ‚จ
  • ๅฎšๆœŸๅค‡ไปฝ้‡่ฆๆ•ฐๆฎ
  • ็›‘ๆŽงๅผ‚ๅธธไบคๆ˜“ๅ’Œๆ“ไฝœ

๐Ÿ“„ ่ฎธๅฏ่ฏ

MIT License - ่ฏฆ่ง LICENSE ๆ–‡ไปถ

๐Ÿค ๆŠ€ๆœฏๆ”ฏๆŒ


๐ŸŽ‰ ๆ„Ÿ่ฐขไฝฟ็”จ DLMM ๆตๅŠจๆ€ง็ฎก็†็ณป็ปŸ๏ผ

๐Ÿ’ก ๆ็คบ: ๆœฌๆ–‡ๆกฃไผš้š็€็ณป็ปŸๆ›ดๆ–ฐๆŒ็ปญๅฎŒๅ–„๏ผŒๅปบ่ฎฎๅฎšๆœŸๆŸฅ็œ‹ๆœ€ๆ–ฐ็‰ˆๆœฌใ€‚