@awaken-finance/agent-kit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +267 -0
- package/README.zh-CN.md +267 -0
- package/awaken_kline_skill.ts +54 -0
- package/awaken_query_skill.ts +126 -0
- package/awaken_trade_skill.ts +123 -0
- package/cli-helpers.ts +13 -0
- package/index.ts +56 -0
- package/lib/aelf-client.ts +175 -0
- package/lib/config.ts +118 -0
- package/lib/types.ts +287 -0
- package/mcp-config.example.json +18 -0
- package/openclaw.json +70 -0
- package/package.json +70 -0
- package/src/core/kline.ts +128 -0
- package/src/core/query.ts +279 -0
- package/src/core/trade.ts +278 -0
- package/src/mcp/server.ts +311 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Awaken Finance
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Awaken Agent Kit
|
|
2
|
+
|
|
3
|
+
[](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
> AI Agent toolkit for [Awaken DEX](https://awaken.finance) on the [aelf](https://aelf.com) blockchain — swap tokens, manage liquidity, and fetch K-line data.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
awaken-agent-kit/
|
|
13
|
+
├── index.ts # SDK entry — direct import for LangChain / LlamaIndex
|
|
14
|
+
├── src/
|
|
15
|
+
│ ├── core/ # Pure business logic (no I/O side effects)
|
|
16
|
+
│ │ ├── query.ts # getQuote, getPair, getTokenBalance, getTokenAllowance, getLiquidityPositions
|
|
17
|
+
│ │ ├── trade.ts # executeSwap, addLiquidity, removeLiquidity, approveTokenSpending
|
|
18
|
+
│ │ └── kline.ts # fetchKline, getKlineIntervals
|
|
19
|
+
│ └── mcp/
|
|
20
|
+
│ └── server.ts # MCP adapter — for Claude Desktop, Cursor, GPT, etc.
|
|
21
|
+
├── awaken_query_skill.ts # CLI adapter — OpenClaw / terminal query commands
|
|
22
|
+
├── awaken_trade_skill.ts # CLI adapter — OpenClaw / terminal trade commands
|
|
23
|
+
├── awaken_kline_skill.ts # CLI adapter — OpenClaw / terminal K-line commands
|
|
24
|
+
├── cli-helpers.ts # CLI output helpers (outputSuccess / outputError)
|
|
25
|
+
├── lib/
|
|
26
|
+
│ ├── config.ts # Network config, env overrides, defaults
|
|
27
|
+
│ ├── aelf-client.ts # aelf-sdk wrapper (wallet, contract calls, decimals)
|
|
28
|
+
│ └── types.ts # TypeScript interfaces & constants
|
|
29
|
+
├── openclaw.json # OpenClaw tool definitions
|
|
30
|
+
├── mcp-config.example.json # MCP client config example
|
|
31
|
+
├── .env.example # Environment variable template
|
|
32
|
+
└── __tests__/ # Unit / Integration / E2E tests
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Core + Adapters pattern:**
|
|
36
|
+
|
|
37
|
+
| Layer | Location | Role |
|
|
38
|
+
|-------|----------|------|
|
|
39
|
+
| **Core** | `src/core/` | Pure functions. No `process.exit`, no `console.log`. Throw on error. |
|
|
40
|
+
| **CLI Adapter** | `awaken_*_skill.ts` | Thin wrappers using `commander`. Parses args → calls core → outputs JSON. |
|
|
41
|
+
| **MCP Adapter** | `src/mcp/server.ts` | Registers core functions as MCP tools for Claude Desktop, Cursor, GPT, etc. |
|
|
42
|
+
| **SDK** | `index.ts` | Re-exports core functions + types. `import { executeSwap } from '@awaken-finance/agent-kit'`. |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Features
|
|
47
|
+
|
|
48
|
+
| # | Category | Capability | CLI Tool | MCP Tool | SDK Function |
|
|
49
|
+
|---|----------|-----------|----------|----------|-------------|
|
|
50
|
+
| 1 | Query | Swap quote & route | `awaken-query-quote` | `awaken_quote` | `getQuote` |
|
|
51
|
+
| 2 | Query | Trade pair info | `awaken-query-pair` | `awaken_pair` | `getPair` |
|
|
52
|
+
| 3 | Query | Token balance | `awaken-query-balance` | `awaken_balance` | `getTokenBalance` |
|
|
53
|
+
| 4 | Query | Token allowance | `awaken-query-allowance` | `awaken_allowance` | `getTokenAllowance` |
|
|
54
|
+
| 5 | Query | Liquidity positions (+ USD) | `awaken-query-liquidity` | `awaken_liquidity` | `getLiquidityPositions` |
|
|
55
|
+
| 6 | Trade | Swap tokens | `awaken-trade-swap` | `awaken_swap` | `executeSwap` |
|
|
56
|
+
| 7 | Trade | Add liquidity | `awaken-trade-add-liquidity` | `awaken_add_liquidity` | `addLiquidity` |
|
|
57
|
+
| 8 | Trade | Remove liquidity | `awaken-trade-remove-liquidity` | `awaken_remove_liquidity` | `removeLiquidity` |
|
|
58
|
+
| 9 | Trade | Approve token spending | `awaken-trade-approve` | `awaken_approve` | `approveTokenSpending` |
|
|
59
|
+
| 10 | K-Line | Fetch candlestick data | `awaken-kline-fetch` | `awaken_kline_fetch` | `fetchKline` |
|
|
60
|
+
| 11 | K-Line | List intervals | `awaken-kline-intervals` | `awaken_kline_intervals` | `getKlineIntervals` |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Prerequisites
|
|
65
|
+
|
|
66
|
+
- [Bun](https://bun.sh) ≥ 1.0
|
|
67
|
+
- An aelf wallet private key (for trade operations only)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Quick Start
|
|
72
|
+
|
|
73
|
+
### 1. Install
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# As a dependency
|
|
77
|
+
bun add @awaken-finance/agent-kit
|
|
78
|
+
|
|
79
|
+
# Or clone and install locally
|
|
80
|
+
git clone https://github.com/AwakenFinance/awaken-agent-skills.git
|
|
81
|
+
cd awaken-agent-skills
|
|
82
|
+
bun install
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2. Configure
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cp .env.example .env
|
|
89
|
+
# Edit .env — add your AELF_PRIVATE_KEY
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Config priority (high → low):**
|
|
93
|
+
|
|
94
|
+
1. Function params (SDK callers)
|
|
95
|
+
2. CLI args (`--network`, `--slippage`)
|
|
96
|
+
3. MCP env block (`mcp.json` → `env: {}`)
|
|
97
|
+
4. Environment variables (`AWAKEN_*`)
|
|
98
|
+
5. `.env` file
|
|
99
|
+
6. Code defaults
|
|
100
|
+
|
|
101
|
+
See [`.env.example`](./.env.example) for all available overrides (RPC URL, API URL, contract addresses, slippage, etc.).
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Usage
|
|
106
|
+
|
|
107
|
+
### CLI (OpenClaw / Terminal)
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Query swap quote
|
|
111
|
+
bun run awaken_query_skill.ts quote --symbol-in ELF --symbol-out USDT --amount-in 10
|
|
112
|
+
|
|
113
|
+
# Query trade pair
|
|
114
|
+
bun run awaken_query_skill.ts pair --token0 ELF --token1 USDT --fee-rate 0.3
|
|
115
|
+
|
|
116
|
+
# Query balance
|
|
117
|
+
bun run awaken_query_skill.ts balance --address YOUR_ADDRESS --symbol ELF
|
|
118
|
+
|
|
119
|
+
# Query liquidity positions
|
|
120
|
+
bun run awaken_query_skill.ts liquidity --address YOUR_ADDRESS
|
|
121
|
+
|
|
122
|
+
# Swap tokens (requires AELF_PRIVATE_KEY)
|
|
123
|
+
bun run awaken_trade_skill.ts swap --symbol-in ELF --symbol-out USDT --amount-in 1
|
|
124
|
+
|
|
125
|
+
# Add liquidity (requires AELF_PRIVATE_KEY)
|
|
126
|
+
bun run awaken_trade_skill.ts add-liquidity --token-a ELF --token-b USDT --amount-a 10 --amount-b 5
|
|
127
|
+
|
|
128
|
+
# Remove liquidity (requires AELF_PRIVATE_KEY)
|
|
129
|
+
bun run awaken_trade_skill.ts remove-liquidity --token-a ELF --token-b USDT --lp-amount 0.5
|
|
130
|
+
|
|
131
|
+
# Fetch K-line data
|
|
132
|
+
bun run awaken_kline_skill.ts fetch --pair-id PAIR_UUID --interval 1D
|
|
133
|
+
|
|
134
|
+
# List K-line intervals
|
|
135
|
+
bun run awaken_kline_skill.ts intervals
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
All commands output standardized JSON on success. Errors go to stderr with `[ERROR]` prefix.
|
|
139
|
+
|
|
140
|
+
### MCP (Claude Desktop / Cursor / GPT)
|
|
141
|
+
|
|
142
|
+
1. Copy the config from [`mcp-config.example.json`](./mcp-config.example.json) into your AI tool's MCP settings:
|
|
143
|
+
|
|
144
|
+
- **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
145
|
+
- **Cursor (project)**: `.cursor/mcp.json`
|
|
146
|
+
- **Cursor (global)**: `~/.cursor/mcp.json`
|
|
147
|
+
|
|
148
|
+
2. Update the path and environment variables:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"mcpServers": {
|
|
153
|
+
"awaken-agent-kit": {
|
|
154
|
+
"command": "bun",
|
|
155
|
+
"args": ["run", "/ABSOLUTE/PATH/TO/scripts/skills/src/mcp/server.ts"],
|
|
156
|
+
"env": {
|
|
157
|
+
"AELF_PRIVATE_KEY": "your_private_key_here",
|
|
158
|
+
"AWAKEN_NETWORK": "mainnet"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
3. Start the MCP server manually (for debugging):
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
bun run mcp
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### SDK (TypeScript / JavaScript)
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import {
|
|
175
|
+
getQuote,
|
|
176
|
+
executeSwap,
|
|
177
|
+
getNetworkConfig,
|
|
178
|
+
getLiquidityPositions,
|
|
179
|
+
} from '@awaken-finance/agent-kit';
|
|
180
|
+
|
|
181
|
+
// Query a swap quote
|
|
182
|
+
const config = getNetworkConfig('mainnet');
|
|
183
|
+
const quote = await getQuote(config, {
|
|
184
|
+
symbolIn: 'ELF',
|
|
185
|
+
symbolOut: 'USDT',
|
|
186
|
+
amountIn: '10',
|
|
187
|
+
});
|
|
188
|
+
console.log(quote);
|
|
189
|
+
|
|
190
|
+
// Execute a swap (requires privateKey)
|
|
191
|
+
const result = await executeSwap(config, wallet, {
|
|
192
|
+
symbolIn: 'ELF',
|
|
193
|
+
symbolOut: 'USDT',
|
|
194
|
+
amountIn: '10',
|
|
195
|
+
slippage: '0.005',
|
|
196
|
+
});
|
|
197
|
+
console.log(result.transactionId);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### OpenClaw
|
|
201
|
+
|
|
202
|
+
Import the [`openclaw.json`](./openclaw.json) file into your OpenClaw configuration. All 11 tools are pre-configured with descriptions optimized for AI comprehension.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Network
|
|
207
|
+
|
|
208
|
+
| Network | Chain ID | RPC | Explorer |
|
|
209
|
+
|---------|----------|-----|----------|
|
|
210
|
+
| **mainnet** (default) | tDVV | `https://tdvv-public-node.aelf.io` | `https://aelfscan.io/tDVV` |
|
|
211
|
+
| testnet | tDVW | `https://tdvw-test-node.aelf.io` | `https://testnet.aelfscan.io/tDVW` |
|
|
212
|
+
|
|
213
|
+
Switch via `--network testnet` (CLI), `AWAKEN_NETWORK=testnet` (env), or pass config directly (SDK).
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Testing
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# All tests
|
|
221
|
+
bun test
|
|
222
|
+
|
|
223
|
+
# Unit tests only
|
|
224
|
+
bun run test:unit
|
|
225
|
+
|
|
226
|
+
# Integration tests (requires network access)
|
|
227
|
+
bun run test:integration
|
|
228
|
+
|
|
229
|
+
# E2E tests (requires AELF_PRIVATE_KEY, sends real txns on mainnet)
|
|
230
|
+
bun run test:e2e
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
| Test Level | Scope |
|
|
234
|
+
|------------|-------|
|
|
235
|
+
| **Unit** | Config, types, decimal math, core exports, error paths, MCP server, CLI helpers |
|
|
236
|
+
| **Integration** | Awaken API, on-chain view calls, SignalR K-line, core query functions |
|
|
237
|
+
| **E2E** | Real swap & liquidity add/remove on mainnet |
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Environment Variables
|
|
242
|
+
|
|
243
|
+
| Variable | Required | Default | Description |
|
|
244
|
+
|----------|----------|---------|-------------|
|
|
245
|
+
| `AELF_PRIVATE_KEY` | For trades | — | aelf wallet private key |
|
|
246
|
+
| `AWAKEN_NETWORK` | No | `mainnet` | `mainnet` or `testnet` |
|
|
247
|
+
| `AWAKEN_RPC_URL` | No | Per network | Override RPC endpoint |
|
|
248
|
+
| `AWAKEN_API_BASE_URL` | No | Per network | Override API endpoint |
|
|
249
|
+
| `AWAKEN_SOCKET_URL` | No | Per network | Override SignalR endpoint |
|
|
250
|
+
| `AWAKEN_EXPLORER_URL` | No | Per network | Override explorer URL |
|
|
251
|
+
| `AWAKEN_TOKEN_CONTRACT` | No | Per network | Override token contract address |
|
|
252
|
+
| `AWAKEN_SWAP_HOOK_CONTRACT` | No | Per network | Override swap hook contract |
|
|
253
|
+
| `AWAKEN_DEFAULT_SLIPPAGE` | No | `0.005` | Default slippage tolerance |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Security
|
|
258
|
+
|
|
259
|
+
- **Never commit your `.env` file.** It is git-ignored by default.
|
|
260
|
+
- Private keys are only needed for trade operations (swap, add/remove liquidity, approve). Query and K-line operations are read-only.
|
|
261
|
+
- When using MCP, pass the private key via the `env` block in your MCP config — it is not transmitted over the network.
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## License
|
|
266
|
+
|
|
267
|
+
MIT
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# Awaken Agent Kit
|
|
2
|
+
|
|
3
|
+
[](./README.md)
|
|
4
|
+
|
|
5
|
+
> 面向 [Awaken DEX](https://awaken.finance)([aelf](https://aelf.com) 区块链)的 AI Agent 工具包 —— 代币兑换、流动性管理、K 线数据获取。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 架构
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
awaken-agent-kit/
|
|
13
|
+
├── index.ts # SDK 入口 — 可直接导入用于 LangChain / LlamaIndex
|
|
14
|
+
├── src/
|
|
15
|
+
│ ├── core/ # 纯业务逻辑(无 I/O 副作用)
|
|
16
|
+
│ │ ├── query.ts # getQuote, getPair, getTokenBalance, getTokenAllowance, getLiquidityPositions
|
|
17
|
+
│ │ ├── trade.ts # executeSwap, addLiquidity, removeLiquidity, approveTokenSpending
|
|
18
|
+
│ │ └── kline.ts # fetchKline, getKlineIntervals
|
|
19
|
+
│ └── mcp/
|
|
20
|
+
│ └── server.ts # MCP 适配器 — 用于 Claude Desktop、Cursor、GPT 等
|
|
21
|
+
├── awaken_query_skill.ts # CLI 适配器 — OpenClaw / 终端查询命令
|
|
22
|
+
├── awaken_trade_skill.ts # CLI 适配器 — OpenClaw / 终端交易命令
|
|
23
|
+
├── awaken_kline_skill.ts # CLI 适配器 — OpenClaw / 终端 K 线命令
|
|
24
|
+
├── cli-helpers.ts # CLI 输出工具(outputSuccess / outputError)
|
|
25
|
+
├── lib/
|
|
26
|
+
│ ├── config.ts # 网络配置、环境变量覆盖、默认值
|
|
27
|
+
│ ├── aelf-client.ts # aelf-sdk 封装(钱包、合约调用、精度转换)
|
|
28
|
+
│ └── types.ts # TypeScript 接口与常量
|
|
29
|
+
├── openclaw.json # OpenClaw 工具定义
|
|
30
|
+
├── mcp-config.example.json # MCP 客户端配置示例
|
|
31
|
+
├── .env.example # 环境变量模板
|
|
32
|
+
└── __tests__/ # 单元 / 集成 / E2E 测试
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Core + Adapters 分层模式:**
|
|
36
|
+
|
|
37
|
+
| 层 | 位置 | 职责 |
|
|
38
|
+
|---|------|------|
|
|
39
|
+
| **Core** | `src/core/` | 纯函数。无 `process.exit`,无 `console.log`。出错则 throw。 |
|
|
40
|
+
| **CLI 适配器** | `awaken_*_skill.ts` | 基于 `commander` 的薄包装层。解析参数 → 调用 core → 输出 JSON。 |
|
|
41
|
+
| **MCP 适配器** | `src/mcp/server.ts` | 将 core 函数注册为 MCP 工具,供 Claude Desktop、Cursor、GPT 等使用。 |
|
|
42
|
+
| **SDK** | `index.ts` | 重新导出 core 函数和类型。`import { executeSwap } from '@awaken-finance/agent-kit'`。 |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 功能列表
|
|
47
|
+
|
|
48
|
+
| # | 分类 | 能力 | CLI 工具 | MCP 工具 | SDK 函数 |
|
|
49
|
+
|---|------|------|----------|----------|----------|
|
|
50
|
+
| 1 | 查询 | Swap 报价与路由 | `awaken-query-quote` | `awaken_quote` | `getQuote` |
|
|
51
|
+
| 2 | 查询 | 交易对信息 | `awaken-query-pair` | `awaken_pair` | `getPair` |
|
|
52
|
+
| 3 | 查询 | 代币余额 | `awaken-query-balance` | `awaken_balance` | `getTokenBalance` |
|
|
53
|
+
| 4 | 查询 | 代币授权额度 | `awaken-query-allowance` | `awaken_allowance` | `getTokenAllowance` |
|
|
54
|
+
| 5 | 查询 | 流动性持仓(含 USD 价值) | `awaken-query-liquidity` | `awaken_liquidity` | `getLiquidityPositions` |
|
|
55
|
+
| 6 | 交易 | 代币兑换 | `awaken-trade-swap` | `awaken_swap` | `executeSwap` |
|
|
56
|
+
| 7 | 交易 | 添加流动性 | `awaken-trade-add-liquidity` | `awaken_add_liquidity` | `addLiquidity` |
|
|
57
|
+
| 8 | 交易 | 移除流动性 | `awaken-trade-remove-liquidity` | `awaken_remove_liquidity` | `removeLiquidity` |
|
|
58
|
+
| 9 | 交易 | 授权代币消费 | `awaken-trade-approve` | `awaken_approve` | `approveTokenSpending` |
|
|
59
|
+
| 10 | K线 | 获取 K 线数据 | `awaken-kline-fetch` | `awaken_kline_fetch` | `fetchKline` |
|
|
60
|
+
| 11 | K线 | 列出时间间隔 | `awaken-kline-intervals` | `awaken_kline_intervals` | `getKlineIntervals` |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 前置要求
|
|
65
|
+
|
|
66
|
+
- [Bun](https://bun.sh) ≥ 1.0
|
|
67
|
+
- 一个 aelf 钱包私钥(仅交易操作需要)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 快速开始
|
|
72
|
+
|
|
73
|
+
### 1. 安装
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 作为依赖安装
|
|
77
|
+
bun add @awaken-finance/agent-kit
|
|
78
|
+
|
|
79
|
+
# 或克隆后本地安装
|
|
80
|
+
git clone https://github.com/AwakenFinance/awaken-agent-skills.git
|
|
81
|
+
cd awaken-agent-skills
|
|
82
|
+
bun install
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2. 配置
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cp .env.example .env
|
|
89
|
+
# 编辑 .env — 填入你的 AELF_PRIVATE_KEY
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**配置优先级(高 → 低):**
|
|
93
|
+
|
|
94
|
+
1. 函数参数(SDK 调用者)
|
|
95
|
+
2. CLI 参数(`--network`, `--slippage`)
|
|
96
|
+
3. MCP env 块(`mcp.json` → `env: {}`)
|
|
97
|
+
4. 环境变量(`AWAKEN_*`)
|
|
98
|
+
5. `.env` 文件
|
|
99
|
+
6. 代码默认值
|
|
100
|
+
|
|
101
|
+
查看 [`.env.example`](./.env.example) 了解所有可覆盖配置(RPC 地址、API 地址、合约地址、滑点等)。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 使用方式
|
|
106
|
+
|
|
107
|
+
### CLI(OpenClaw / 终端)
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# 查询兑换报价
|
|
111
|
+
bun run awaken_query_skill.ts quote --symbol-in ELF --symbol-out USDT --amount-in 10
|
|
112
|
+
|
|
113
|
+
# 查询交易对
|
|
114
|
+
bun run awaken_query_skill.ts pair --token0 ELF --token1 USDT --fee-rate 0.3
|
|
115
|
+
|
|
116
|
+
# 查询余额
|
|
117
|
+
bun run awaken_query_skill.ts balance --address YOUR_ADDRESS --symbol ELF
|
|
118
|
+
|
|
119
|
+
# 查询流动性持仓
|
|
120
|
+
bun run awaken_query_skill.ts liquidity --address YOUR_ADDRESS
|
|
121
|
+
|
|
122
|
+
# 代币兑换(需要 AELF_PRIVATE_KEY)
|
|
123
|
+
bun run awaken_trade_skill.ts swap --symbol-in ELF --symbol-out USDT --amount-in 1
|
|
124
|
+
|
|
125
|
+
# 添加流动性(需要 AELF_PRIVATE_KEY)
|
|
126
|
+
bun run awaken_trade_skill.ts add-liquidity --token-a ELF --token-b USDT --amount-a 10 --amount-b 5
|
|
127
|
+
|
|
128
|
+
# 移除流动性(需要 AELF_PRIVATE_KEY)
|
|
129
|
+
bun run awaken_trade_skill.ts remove-liquidity --token-a ELF --token-b USDT --lp-amount 0.5
|
|
130
|
+
|
|
131
|
+
# 获取 K 线数据
|
|
132
|
+
bun run awaken_kline_skill.ts fetch --pair-id PAIR_UUID --interval 1D
|
|
133
|
+
|
|
134
|
+
# 列出 K 线时间间隔
|
|
135
|
+
bun run awaken_kline_skill.ts intervals
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
所有命令成功时输出标准化 JSON,错误输出到 stderr 并带 `[ERROR]` 前缀。
|
|
139
|
+
|
|
140
|
+
### MCP(Claude Desktop / Cursor / GPT)
|
|
141
|
+
|
|
142
|
+
1. 将 [`mcp-config.example.json`](./mcp-config.example.json) 中的配置复制到你的 AI 工具的 MCP 设置中:
|
|
143
|
+
|
|
144
|
+
- **Claude Desktop**:`~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
145
|
+
- **Cursor(项目级)**:`.cursor/mcp.json`
|
|
146
|
+
- **Cursor(全局)**:`~/.cursor/mcp.json`
|
|
147
|
+
|
|
148
|
+
2. 更新路径和环境变量:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"mcpServers": {
|
|
153
|
+
"awaken-agent-kit": {
|
|
154
|
+
"command": "bun",
|
|
155
|
+
"args": ["run", "/绝对路径/scripts/skills/src/mcp/server.ts"],
|
|
156
|
+
"env": {
|
|
157
|
+
"AELF_PRIVATE_KEY": "你的私钥",
|
|
158
|
+
"AWAKEN_NETWORK": "mainnet"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
3. 手动启动 MCP 服务器(用于调试):
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
bun run mcp
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### SDK(TypeScript / JavaScript)
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import {
|
|
175
|
+
getQuote,
|
|
176
|
+
executeSwap,
|
|
177
|
+
getNetworkConfig,
|
|
178
|
+
getLiquidityPositions,
|
|
179
|
+
} from '@awaken-finance/agent-kit';
|
|
180
|
+
|
|
181
|
+
// 查询兑换报价
|
|
182
|
+
const config = getNetworkConfig('mainnet');
|
|
183
|
+
const quote = await getQuote(config, {
|
|
184
|
+
symbolIn: 'ELF',
|
|
185
|
+
symbolOut: 'USDT',
|
|
186
|
+
amountIn: '10',
|
|
187
|
+
});
|
|
188
|
+
console.log(quote);
|
|
189
|
+
|
|
190
|
+
// 执行兑换(需要 privateKey)
|
|
191
|
+
const result = await executeSwap(config, wallet, {
|
|
192
|
+
symbolIn: 'ELF',
|
|
193
|
+
symbolOut: 'USDT',
|
|
194
|
+
amountIn: '10',
|
|
195
|
+
slippage: '0.005',
|
|
196
|
+
});
|
|
197
|
+
console.log(result.transactionId);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### OpenClaw
|
|
201
|
+
|
|
202
|
+
将 [`openclaw.json`](./openclaw.json) 导入你的 OpenClaw 配置。所有 11 个工具已预配置,描述针对 AI 理解进行了优化。
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 网络
|
|
207
|
+
|
|
208
|
+
| 网络 | Chain ID | RPC | 区块浏览器 |
|
|
209
|
+
|------|----------|-----|-----------|
|
|
210
|
+
| **mainnet**(默认) | tDVV | `https://tdvv-public-node.aelf.io` | `https://aelfscan.io/tDVV` |
|
|
211
|
+
| testnet | tDVW | `https://tdvw-test-node.aelf.io` | `https://testnet.aelfscan.io/tDVW` |
|
|
212
|
+
|
|
213
|
+
通过 `--network testnet`(CLI)、`AWAKEN_NETWORK=testnet`(环境变量)或直接传入 config(SDK)切换网络。
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 测试
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# 全部测试
|
|
221
|
+
bun test
|
|
222
|
+
|
|
223
|
+
# 仅单元测试
|
|
224
|
+
bun run test:unit
|
|
225
|
+
|
|
226
|
+
# 集成测试(需要网络)
|
|
227
|
+
bun run test:integration
|
|
228
|
+
|
|
229
|
+
# E2E 测试(需要 AELF_PRIVATE_KEY,在 mainnet 发送真实交易)
|
|
230
|
+
bun run test:e2e
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
| 测试级别 | 覆盖范围 |
|
|
234
|
+
|---------|---------|
|
|
235
|
+
| **Unit** | 配置、类型、精度运算、Core 导出、错误路径、MCP server、CLI helpers |
|
|
236
|
+
| **Integration** | Awaken API、链上 view 调用、SignalR K 线、Core query 函数 |
|
|
237
|
+
| **E2E** | mainnet 真实 Swap 与流动性增减 |
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 环境变量
|
|
242
|
+
|
|
243
|
+
| 变量 | 是否必填 | 默认值 | 说明 |
|
|
244
|
+
|------|---------|--------|------|
|
|
245
|
+
| `AELF_PRIVATE_KEY` | 交易时必填 | — | aelf 钱包私钥 |
|
|
246
|
+
| `AWAKEN_NETWORK` | 否 | `mainnet` | `mainnet` 或 `testnet` |
|
|
247
|
+
| `AWAKEN_RPC_URL` | 否 | 按网络 | 覆盖 RPC 地址 |
|
|
248
|
+
| `AWAKEN_API_BASE_URL` | 否 | 按网络 | 覆盖 API 地址 |
|
|
249
|
+
| `AWAKEN_SOCKET_URL` | 否 | 按网络 | 覆盖 SignalR 地址 |
|
|
250
|
+
| `AWAKEN_EXPLORER_URL` | 否 | 按网络 | 覆盖区块浏览器地址 |
|
|
251
|
+
| `AWAKEN_TOKEN_CONTRACT` | 否 | 按网络 | 覆盖 Token 合约地址 |
|
|
252
|
+
| `AWAKEN_SWAP_HOOK_CONTRACT` | 否 | 按网络 | 覆盖 Swap Hook 合约地址 |
|
|
253
|
+
| `AWAKEN_DEFAULT_SLIPPAGE` | 否 | `0.005` | 默认滑点容忍度 |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 安全
|
|
258
|
+
|
|
259
|
+
- **永远不要提交你的 `.env` 文件。** 它已默认被 git 忽略。
|
|
260
|
+
- 私钥仅用于交易操作(兑换、添加/移除流动性、授权)。查询和 K 线操作为只读。
|
|
261
|
+
- 使用 MCP 时,通过 MCP 配置的 `env` 块传入私钥 —— 不会通过网络传输。
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 许可证
|
|
266
|
+
|
|
267
|
+
MIT
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Awaken K-Line Skill - CLI Adapter (thin shell)
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Commands: fetch, intervals
|
|
6
|
+
// Core logic lives in src/core/kline.ts
|
|
7
|
+
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { getNetworkConfig } from './lib/config';
|
|
10
|
+
import { outputSuccess, outputError } from './cli-helpers';
|
|
11
|
+
import { fetchKline, getKlineIntervals } from './src/core/kline';
|
|
12
|
+
|
|
13
|
+
const program = new Command();
|
|
14
|
+
|
|
15
|
+
program
|
|
16
|
+
.name('awaken-kline')
|
|
17
|
+
.description('Awaken DEX K-line (candlestick) data tool')
|
|
18
|
+
.version('1.0.0')
|
|
19
|
+
.option('--network <network>', 'Network: mainnet or testnet', process.env.AWAKEN_NETWORK || 'mainnet');
|
|
20
|
+
|
|
21
|
+
// ---- fetch ----
|
|
22
|
+
program
|
|
23
|
+
.command('fetch')
|
|
24
|
+
.description('Fetch historical K-line data via SignalR')
|
|
25
|
+
.requiredOption('--pair-id <id>', 'Trade pair ID (UUID from pair query)')
|
|
26
|
+
.option('--interval <interval>', 'Time interval: 1m, 15m, 30m, 1h, 4h, 1D, 1W', '1D')
|
|
27
|
+
.option('--from <date>', 'Start date (ISO string or unix ms)', String(Date.now() - 7 * 24 * 60 * 60 * 1000))
|
|
28
|
+
.option('--to <date>', 'End date (ISO string or unix ms)', String(Date.now()))
|
|
29
|
+
.option('--timeout <ms>', 'Max wait time in ms', '15000')
|
|
30
|
+
.action(async (opts) => {
|
|
31
|
+
try {
|
|
32
|
+
const config = getNetworkConfig(program.opts().network);
|
|
33
|
+
const result = await fetchKline(config, {
|
|
34
|
+
tradePairId: opts.pairId,
|
|
35
|
+
interval: opts.interval,
|
|
36
|
+
from: opts.from,
|
|
37
|
+
to: opts.to,
|
|
38
|
+
timeout: parseInt(opts.timeout, 10),
|
|
39
|
+
});
|
|
40
|
+
outputSuccess(result);
|
|
41
|
+
} catch (err: any) {
|
|
42
|
+
outputError(err.message || 'K-line fetch failed');
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// ---- intervals ----
|
|
47
|
+
program
|
|
48
|
+
.command('intervals')
|
|
49
|
+
.description('List supported K-line intervals')
|
|
50
|
+
.action(() => {
|
|
51
|
+
outputSuccess(getKlineIntervals());
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
program.parse();
|