@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 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
+ [![中文文档](https://img.shields.io/badge/docs-%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3-blue)](./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
@@ -0,0 +1,267 @@
1
+ # Awaken Agent Kit
2
+
3
+ [![English](https://img.shields.io/badge/docs-English-blue)](./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();