ไผไธ็บง 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 ไฝ้ข
- ไบคๆ็ญพๅ: ๅฎๅ จ็ไบคๆ็ญพๅๆบๅถ
# ๅๅปบ้ฑๅ
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-
็ฎๅ Y ๅคดๅฏธ็ญ็ฅ (Simple Y Strategy)
- ็จ้: ๅไพงๆตๅจๆงๆไพ
- ็น็น: ไธๆณจๅไธไปฃๅธๆตๅจๆง๏ผ้ฃ้ฉ็ธๅฏน่พไฝ
- ้็จๅบๆฏ: ็จณๅฎๅธๅฏนใไธปๆตไปฃๅธ
-
่ฟ้ๅคดๅฏธ็ญ็ฅ (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- ๆบ่ฝ่ทฏ็ฑ: ่ชๅจๅฏปๆพๆไผไบคๆ่ทฏๅพ
- ๆป็นไฟๆค: ่ช้ๅบๆป็น็ฎก็
- 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่ฎฟ้ฎ http://localhost:7001 ่ฟๅ
ฅ็ณป็ปไธป็้ข
-
้ฑๅ ็ฎก็้กต้ข
- ้ฑๅ ๅๅปบๅๅฏผๅ ฅ
- ไฝ้ขๆฅ่ฏขๅ็ฎก็
- ไบคๆๅๅฒ่ฎฐๅฝ
-
็ญ็ฅ็ฎก็้กต้ข
- ็ญ็ฅๅๅปบๅๅฏผ
- ๅฎๆถ็ญ็ฅ็ๆง
- ็ญ็ฅ้ ็ฝฎ็ฎก็
-
ๅคดๅฏธ็ฎก็้กต้ข
- ๅคดๅฏธๅๅปบๅๅ ณ้ญ
- ๅคดๅฏธๅฎๆถ็ๆง
- ๆถ็็ป่ฎกๅๆ
-
ไบคๆไธญๅฟ้กต้ข
- Jupiter ไปฃๅธไบคๆข
- ไบคๆๅๅฒ่ฎฐๅฝ
- ๅธๅบๆฐๆฎๆฅ็
-
ๆฑ ็ฌ่ซ้กต้ข
- ๆฑ ๅญๅ็ฐๅ็ญ้
- ่ฟๆปคๆกไปถ่ฎพ็ฝฎ
- ๅฎๆถ็ๆง้ขๆฟ
-
ๅๆไธญๅฟ้กต้ข
- ๆถ็ๅๆๆฅ่กจ
- ้ฃ้ฉ่ฏไผฐๆฅๅ
- ็ญ็ฅๆๆๅฏนๆฏ
-
ๅๅค้ฑๅ
้ฑๅ ็ฎก็ โ ๅๅปบ้ฑๅ โ ่พๅ ฅๅฏ็ โ ไฟๅญๅฉ่ฎฐ่ฏ -
้ๆฉๆฑ ๅญ
ๆฑ ็ฌ่ซ โ ่ฎพ็ฝฎ็ญ้ๆกไปถ โ ้ๆฉๅ้ๆฑ ๅญ โ ๅคๅถๆฑ ๅฐๅ -
ๅๅปบ็ญ็ฅ
็ญ็ฅ็ฎก็ โ ๅๅปบ็ญ็ฅ โ ้ๆฉ็ฑปๅ โ ้ ็ฝฎๅๆฐ โ ๅฏๅจ็ญ็ฅ -
็ๆง่ฟ่ก
็ญ็ฅ็ๆง โ ๆฅ็ๅฎๆถ็ถๆ โ ๅๆๆถ็่กจ็ฐ โ ่ฐๆดๅๆฐ
# 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# 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// 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);// 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);
});
});# ๆฅๆพๅ ็จ็ซฏๅฃ็่ฟ็จ
lsof -i :7000
lsof -i :7001
# ๅๆญข่ฟ็จ
kill -9 <PID>
# ๆไฝฟ็จๅฟซ้ๅๆญข่ๆฌ
./scripts/quick-stop.sh# ๆฃๆฅ้ฑๅ
ๆไปถๆ้
ls -la data/wallet.enc
# ้ช่ฏๅ ๅฏๅฏ้ฅ
echo $WALLET_ENCRYPTION_KEY
# ้ๆฐๅๅปบ้ฑๅ
rm data/wallet.enc
# ้ๆฐๅๅปบ้ฑๅ
# ๆต่ฏ 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"# ๆฅ็็ญ็ฅๆฅๅฟ
tail -f logs/strategy.log
# ๆฃๆฅ็ญ็ฅ็ถๆ
curl http://localhost:7000/api/strategy/list
# ้ๅฏ็ญ็ฅๆๅก
pm2 restart dlmm-api# ๆฃๆฅ 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 # ็ณป็ปๆฅๅฟ- ่ตๆบ้ ็ฝฎ: ๅปบ่ฎฎ 8GB+ ๅ ๅญ๏ผSSD ๅญๅจ
- ็ฝ็ปไผๅ: ไฝฟ็จ้ซ่ดจ้ RPC ่็น
- ็ผๅญ็ญ็ฅ: ๅ็่ฎพ็ฝฎ็ผๅญ TTL
- ๅนถๅๆงๅถ: ้ๅถๆๅคงๅนถๅ็ญ็ฅๆฐ้
- ๆฅๅฟ็ฎก็: ๅฎๆๆธ ็ๆงๆฅๅฟๆไปถ
- ๅๆฃๆ่ต๏ผไธ่ฆๅฐๆๆ่ต้ๆๅ ฅๅไธ็ญ็ฅ
- ่ฎพ็ฝฎๅ็็ๆญขๆ็น๏ผๆงๅถ้ฃ้ฉ
- ๅฎๆ่ฏไผฐ็ญ็ฅ่กจ็ฐ๏ผๅๆถ่ฐๆด
- ๆ นๆฎๅธๅบๆณขๅจๆง่ฐๆด Bin ่ๅด
- ็ๆงๆฑ ๅญ็ๆตๅจๆงๆทฑๅบฆ
- ่ฎพ็ฝฎๅ็็ๆป็นๅฎนๅฟๅบฆ
- ๅฎๆๆดๆฐ็ณป็ปๅไพ่ต
- ไฝฟ็จๅผบๅฏ็ ๅๅ ๅฏๅญๅจ
- ๅฎๆๅคไปฝ้่ฆๆฐๆฎ
- ็ๆงๅผๅธธไบคๆๅๆไฝ
MIT License - ่ฏฆ่ง LICENSE ๆไปถ
- GitHub Issues: ้กน็ฎ้ฎ้ข่ฟฝ่ธช
- ๆๆกฃ: ๅจ็บฟๆๆกฃ
- API ๆๆกฃ: API ๅ่
๐ ๆ่ฐขไฝฟ็จ DLMM ๆตๅจๆง็ฎก็็ณป็ป๏ผ
๐ก ๆ็คบ: ๆฌๆๆกฃไผ้็็ณป็ปๆดๆฐๆ็ปญๅฎๅ๏ผๅปบ่ฎฎๅฎๆๆฅ็ๆๆฐ็ๆฌใ