jaspervault_cli 1.0.26 → 1.0.28
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/README.md +25 -24
- package/dist/bin/jv.js +6 -2
- package/dist/bin/jv.js.map +1 -1
- package/dist/src/client.js +28 -1
- package/dist/src/client.js.map +1 -1
- package/dist/src/commands/deposit.js +129 -125
- package/dist/src/commands/deposit.js.map +1 -1
- package/dist/src/commands/install.d.ts +2 -0
- package/dist/src/commands/install.js +184 -0
- package/dist/src/commands/install.js.map +1 -0
- package/dist/src/commands/limit-order.js +7 -0
- package/dist/src/commands/limit-order.js.map +1 -1
- package/dist/src/commands/mcp.d.ts +2 -0
- package/dist/src/commands/mcp.js +10 -0
- package/dist/src/commands/mcp.js.map +1 -0
- package/dist/src/commands/sl.js +12 -2
- package/dist/src/commands/sl.js.map +1 -1
- package/dist/src/commands/tp.js +12 -2
- package/dist/src/commands/tp.js.map +1 -1
- package/dist/src/commands/vault.js +111 -87
- package/dist/src/commands/vault.js.map +1 -1
- package/dist/src/commands/withdraw.d.ts +2 -0
- package/dist/src/commands/withdraw.js +114 -0
- package/dist/src/commands/withdraw.js.map +1 -0
- package/dist/src/mcp/executor.d.ts +23 -0
- package/dist/src/mcp/executor.js +75 -0
- package/dist/src/mcp/executor.js.map +1 -0
- package/dist/src/mcp/index.d.ts +1 -0
- package/dist/src/mcp/index.js +58 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/installer.d.ts +9 -0
- package/dist/src/mcp/installer.js +66 -0
- package/dist/src/mcp/installer.js.map +1 -0
- package/dist/src/mcp/tools.d.ts +15 -0
- package/dist/src/mcp/tools.js +250 -0
- package/dist/src/mcp/tools.js.map +1 -0
- package/dist/src/services/order-signer.js +1 -1
- package/dist/src/services/order-signer.js.map +1 -1
- package/dist/src/services/session-poller.d.ts +12 -0
- package/dist/src/services/session-poller.js +57 -0
- package/dist/src/services/session-poller.js.map +1 -0
- package/dist/src/templates/skill-body.d.ts +3 -1
- package/dist/src/templates/skill-body.js +30 -497
- package/dist/src/templates/skill-body.js.map +1 -1
- package/dist/src/templates/skill-content/SKILL.core.md +51 -0
- package/dist/src/templates/skill-content/frontmatter/claude.md +4 -0
- package/dist/src/templates/skill-content/frontmatter/cursor.md +0 -0
- package/dist/src/templates/skill-content/frontmatter/openclaw.md +11 -0
- package/dist/src/templates/skill-content/references/onboarding.md +124 -0
- package/dist/src/templates/skill-content/references/queries.md +294 -0
- package/dist/src/templates/skill-content/references/trading.md +274 -0
- package/dist/src/templates/skill-content/scripts/check-init.sh +4 -0
- package/dist/src/types.d.ts +13 -6
- package/dist/src/utils/config.d.ts +1 -1
- package/dist/src/utils/config.js +1 -1
- package/dist/src/utils/config.js.map +1 -1
- package/dist/src/utils/endpoints.d.ts +3 -0
- package/dist/src/utils/endpoints.js +5 -0
- package/dist/src/utils/endpoints.js.map +1 -1
- package/package.json +4 -6
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { BANNER, buildSkillContent } from '../templates/skill-body.js';
|
|
5
|
+
import { installMcp, uninstallMcp } from '../mcp/installer.js';
|
|
6
|
+
const PLATFORMS = ['openclaw', 'cursor', 'claude'];
|
|
7
|
+
const SKILL_DIR = 'jasper-vault-cli';
|
|
8
|
+
function getSkillPath(platform, global) {
|
|
9
|
+
const home = homedir();
|
|
10
|
+
const cwd = process.cwd();
|
|
11
|
+
switch (platform) {
|
|
12
|
+
case 'openclaw':
|
|
13
|
+
return path.join(home, '.openclaw', 'skills', SKILL_DIR);
|
|
14
|
+
case 'cursor':
|
|
15
|
+
return global
|
|
16
|
+
? path.join(home, '.cursor', 'skills', SKILL_DIR)
|
|
17
|
+
: path.join(cwd, '.cursor', 'skills', SKILL_DIR);
|
|
18
|
+
case 'claude':
|
|
19
|
+
return global
|
|
20
|
+
? path.join(home, '.claude', 'skills', SKILL_DIR)
|
|
21
|
+
: path.join(cwd, '.claude', 'skills', SKILL_DIR);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function getPlatformDisplayName(p) {
|
|
25
|
+
return p === 'openclaw' ? 'OpenClaw' : p === 'cursor' ? 'Cursor' : 'Claude Code';
|
|
26
|
+
}
|
|
27
|
+
function getMcpPlatform(p) {
|
|
28
|
+
if (p === 'claude')
|
|
29
|
+
return 'claude-code';
|
|
30
|
+
if (p === 'cursor')
|
|
31
|
+
return 'cursor';
|
|
32
|
+
return null; // openclaw has no MCP support
|
|
33
|
+
}
|
|
34
|
+
async function installSkillFiles(targetDir, platform, force) {
|
|
35
|
+
const skillMdPath = path.join(targetDir, 'SKILL.md');
|
|
36
|
+
const exists = await fs
|
|
37
|
+
.access(skillMdPath)
|
|
38
|
+
.then(() => true)
|
|
39
|
+
.catch(() => false);
|
|
40
|
+
if (exists && !force) {
|
|
41
|
+
throw new Error(`Skill already exists at ${targetDir}. Use --force to overwrite.`);
|
|
42
|
+
}
|
|
43
|
+
const files = buildSkillContent(platform);
|
|
44
|
+
let fileCount = 0;
|
|
45
|
+
for (const [relPath, content] of Object.entries(files)) {
|
|
46
|
+
const filePath = path.join(targetDir, relPath);
|
|
47
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
48
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
49
|
+
fileCount++;
|
|
50
|
+
}
|
|
51
|
+
// Make scripts executable
|
|
52
|
+
const scriptsDir = path.join(targetDir, 'scripts');
|
|
53
|
+
const scriptsDirExists = await fs
|
|
54
|
+
.access(scriptsDir)
|
|
55
|
+
.then(() => true)
|
|
56
|
+
.catch(() => false);
|
|
57
|
+
if (scriptsDirExists) {
|
|
58
|
+
const scriptFiles = await fs.readdir(scriptsDir);
|
|
59
|
+
for (const sf of scriptFiles) {
|
|
60
|
+
if (sf.endsWith('.sh')) {
|
|
61
|
+
await fs.chmod(path.join(scriptsDir, sf), 0o755);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return fileCount;
|
|
66
|
+
}
|
|
67
|
+
async function removeSkillFiles(targetDir) {
|
|
68
|
+
const exists = await fs
|
|
69
|
+
.access(targetDir)
|
|
70
|
+
.then(() => true)
|
|
71
|
+
.catch(() => false);
|
|
72
|
+
if (exists) {
|
|
73
|
+
await fs.rm(targetDir, { recursive: true });
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
export function registerInstallCommand(program) {
|
|
79
|
+
program
|
|
80
|
+
.command('install')
|
|
81
|
+
.description('Install JasperVault skill + MCP integration for AI platforms')
|
|
82
|
+
.option('--ai <platform>', `Target platform: ${PLATFORMS.join(', ')} (omit for all platforms, global)`)
|
|
83
|
+
.option('--global', 'Install skill to user home directory (cursor/claude only)')
|
|
84
|
+
.option('--force', 'Overwrite existing skill files without prompting')
|
|
85
|
+
.action(async (opts) => {
|
|
86
|
+
const force = opts.force ?? false;
|
|
87
|
+
// No --ai flag → install all platforms, global
|
|
88
|
+
let platforms;
|
|
89
|
+
let globalFlag;
|
|
90
|
+
if (!opts.ai) {
|
|
91
|
+
platforms = [...PLATFORMS];
|
|
92
|
+
globalFlag = true;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const platform = opts.ai;
|
|
96
|
+
if (!PLATFORMS.includes(platform)) {
|
|
97
|
+
process.stderr.write(`Error: Invalid platform "${platform}". Use one of: ${PLATFORMS.join(', ')}\n`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
platforms = [platform];
|
|
101
|
+
globalFlag = opts.global ?? false;
|
|
102
|
+
}
|
|
103
|
+
process.stdout.write(BANNER + '\n\n');
|
|
104
|
+
const results = [];
|
|
105
|
+
for (const platform of platforms) {
|
|
106
|
+
const platDisplay = getPlatformDisplayName(platform);
|
|
107
|
+
const targetDir = getSkillPath(platform, globalFlag);
|
|
108
|
+
try {
|
|
109
|
+
// Install skill files
|
|
110
|
+
const fileCount = await installSkillFiles(targetDir, platform, force);
|
|
111
|
+
const entry = {
|
|
112
|
+
platform: platDisplay,
|
|
113
|
+
skillPath: targetDir,
|
|
114
|
+
skillFiles: fileCount,
|
|
115
|
+
};
|
|
116
|
+
// Install MCP for supported platforms
|
|
117
|
+
const mcpPlatform = getMcpPlatform(platform);
|
|
118
|
+
if (mcpPlatform) {
|
|
119
|
+
const mcpResults = await installMcp(mcpPlatform);
|
|
120
|
+
if (mcpResults.length > 0) {
|
|
121
|
+
entry.mcpPath = mcpResults[0].path;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
results.push(entry);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
process.stderr.write(`Error installing to ${platDisplay}: ${err.message}\n`);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
process.stdout.write(' ✓ Installation completed!\n\n');
|
|
132
|
+
for (const r of results) {
|
|
133
|
+
process.stdout.write(` Platform: ${r.platform}\n`);
|
|
134
|
+
process.stdout.write(` Skill: ${r.skillPath} (${r.skillFiles} files)\n`);
|
|
135
|
+
if (r.mcpPath) {
|
|
136
|
+
process.stdout.write(` MCP: ${r.mcpPath}\n`);
|
|
137
|
+
}
|
|
138
|
+
process.stdout.write('\n');
|
|
139
|
+
}
|
|
140
|
+
process.stdout.write(' Next steps:\n' +
|
|
141
|
+
' 1. First-time setup: jv vault setup\n' +
|
|
142
|
+
' 2. Restart your AI platform if it was running\n' +
|
|
143
|
+
' 3. Start trading with natural language or `jv` commands\n');
|
|
144
|
+
});
|
|
145
|
+
program
|
|
146
|
+
.command('uninstall')
|
|
147
|
+
.description('Remove JasperVault skill + MCP integration from AI platforms')
|
|
148
|
+
.requiredOption('--ai <platform>', `Target platform: ${PLATFORMS.join(', ')}, all`)
|
|
149
|
+
.option('--global', 'Remove from user home directory (cursor/claude only)')
|
|
150
|
+
.action(async (opts) => {
|
|
151
|
+
const globalFlag = opts.global ?? false;
|
|
152
|
+
let platforms;
|
|
153
|
+
if (opts.ai === 'all') {
|
|
154
|
+
platforms = [...PLATFORMS];
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const platform = opts.ai;
|
|
158
|
+
if (!PLATFORMS.includes(platform)) {
|
|
159
|
+
process.stderr.write(`Error: Invalid platform "${platform}". Use one of: ${PLATFORMS.join(', ')}, all\n`);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
platforms = [platform];
|
|
163
|
+
}
|
|
164
|
+
for (const platform of platforms) {
|
|
165
|
+
const platDisplay = getPlatformDisplayName(platform);
|
|
166
|
+
const targetDir = getSkillPath(platform, opts.ai === 'all' ? true : globalFlag);
|
|
167
|
+
// Remove skill files
|
|
168
|
+
const removed = await removeSkillFiles(targetDir);
|
|
169
|
+
if (removed) {
|
|
170
|
+
process.stdout.write(` ✓ Skill removed from ${platDisplay}: ${targetDir}\n`);
|
|
171
|
+
}
|
|
172
|
+
// Remove MCP for supported platforms
|
|
173
|
+
const mcpPlatform = getMcpPlatform(platform);
|
|
174
|
+
if (mcpPlatform) {
|
|
175
|
+
const mcpResults = await uninstallMcp(mcpPlatform);
|
|
176
|
+
for (const r of mcpResults) {
|
|
177
|
+
process.stdout.write(` ✓ MCP removed from ${r.platform}: ${r.path}\n`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
process.stdout.write('\n Done.\n');
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { loadConfig } from '../utils/config.js';
|
|
|
2
2
|
import { ENDPOINTS } from '../utils/endpoints.js';
|
|
3
3
|
import { ApiClient } from '../client.js';
|
|
4
4
|
import { printJson } from '../utils/output.js';
|
|
5
|
+
import { loadVaultProfile } from '../services/vault-profile.js';
|
|
5
6
|
export function registerLimitOrderCommand(program) {
|
|
6
7
|
const limitOrder = program
|
|
7
8
|
.command('limit-order')
|
|
@@ -25,11 +26,14 @@ export function registerLimitOrderCommand(program) {
|
|
|
25
26
|
.command('status')
|
|
26
27
|
.description('Get limit order status by ID (POST /order/getPerpsLimitOrderList)')
|
|
27
28
|
.argument('<id>', 'Limit order ID')
|
|
29
|
+
.option('--wallet <address>', 'Wallet address (default: from profile)')
|
|
28
30
|
.option('--pretty', 'Pretty-print JSON output')
|
|
29
31
|
.action(async (id, opts) => {
|
|
32
|
+
const wallet = opts.wallet ?? loadVaultProfile()?.eoa;
|
|
30
33
|
const config = loadConfig();
|
|
31
34
|
const client = new ApiClient(config);
|
|
32
35
|
const res = await client.post(ENDPOINTS.LIMIT_ORDER_LIST, {
|
|
36
|
+
wallet,
|
|
33
37
|
limitOrderId: id,
|
|
34
38
|
});
|
|
35
39
|
printJson(res.data, opts.pretty);
|
|
@@ -38,11 +42,14 @@ export function registerLimitOrderCommand(program) {
|
|
|
38
42
|
.command('cancel')
|
|
39
43
|
.description('Cancel a limit order (POST /order/canclePerpsLimitOrder)')
|
|
40
44
|
.argument('<id>', 'Limit order ID to cancel')
|
|
45
|
+
.option('--wallet <address>', 'Wallet address (default: from profile)')
|
|
41
46
|
.option('--pretty', 'Pretty-print JSON output')
|
|
42
47
|
.action(async (id, opts) => {
|
|
48
|
+
const wallet = opts.wallet ?? loadVaultProfile()?.eoa;
|
|
43
49
|
const config = loadConfig();
|
|
44
50
|
const client = new ApiClient(config);
|
|
45
51
|
const res = await client.post(ENDPOINTS.LIMIT_ORDER_CANCEL, {
|
|
52
|
+
wallet,
|
|
46
53
|
limitOrderId: id,
|
|
47
54
|
});
|
|
48
55
|
printJson(res.data, opts.pretty);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limit-order.js","sourceRoot":"","sources":["../../../src/commands/limit-order.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"limit-order.js","sourceRoot":"","sources":["../../../src/commands/limit-order.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function registerMcpCommand(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('mcp')
|
|
4
|
+
.description('Start MCP server in stdio mode (used by Claude Code / Cursor)')
|
|
5
|
+
.action(async () => {
|
|
6
|
+
const { startMcpServer } = await import('../mcp/index.js');
|
|
7
|
+
await startMcpServer();
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/mcp.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAC3D,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/src/commands/sl.js
CHANGED
|
@@ -6,6 +6,7 @@ import { printJson, exitWithError, EXIT_CODES } from '../utils/output.js';
|
|
|
6
6
|
import { getNetworkConfig } from '../services/chain-config.js';
|
|
7
7
|
import { loadDelegationKey } from '../services/key-manager.js';
|
|
8
8
|
import { loadVaultProfile, getPositionAccountFromProfile } from '../services/vault-profile.js';
|
|
9
|
+
import { SubgraphClient } from '../services/subgraph-client.js';
|
|
9
10
|
import { buildSignData, signSignData, fetchWriterIndices, buildManagedOrder, } from '../services/order-signer.js';
|
|
10
11
|
import { parsePpoOptions } from '../utils/ppo.js';
|
|
11
12
|
export function registerSlCommand(program) {
|
|
@@ -41,6 +42,14 @@ export function registerSlCommand(program) {
|
|
|
41
42
|
if (!holder) {
|
|
42
43
|
exitWithError(`No ${side} position vault in profile. Run "jv vault init" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
43
44
|
}
|
|
45
|
+
const net = getNetworkConfig(opts.network);
|
|
46
|
+
const subgraphClient = new SubgraphClient(net.subgraphUrl);
|
|
47
|
+
const existingOrder = await subgraphClient.queryOrderById(opts.orderId);
|
|
48
|
+
if (!existingOrder) {
|
|
49
|
+
exitWithError(`Order #${opts.orderId} not found in subgraph`, EXIT_CODES.BUSINESS_ERROR);
|
|
50
|
+
}
|
|
51
|
+
const orderMargin = existingOrder.marginDeposited || existingOrder.totalFreeAmount || '1000000';
|
|
52
|
+
const orderQuantity = existingOrder.quantity || existingOrder.initialQuantity || '0';
|
|
44
53
|
const intent = {
|
|
45
54
|
orderID: parseInt(opts.orderId, 10),
|
|
46
55
|
price: opts.price,
|
|
@@ -48,15 +57,16 @@ export function registerSlCommand(program) {
|
|
|
48
57
|
side,
|
|
49
58
|
network: opts.network,
|
|
50
59
|
ttlSeconds: parseInt(opts.ttl, 10),
|
|
60
|
+
marginAmount: orderMargin,
|
|
61
|
+
quantity: orderQuantity,
|
|
51
62
|
};
|
|
52
|
-
const net = getNetworkConfig(opts.network);
|
|
53
63
|
const provider = new JsonRpcProvider(net.rpcUrl);
|
|
54
64
|
const optionModuleV2 = net.contracts.optionModuleV2 ?? net.contracts.diamond;
|
|
55
65
|
const signData = await buildSignData(intent, profile, opts.network);
|
|
56
66
|
const writerIndices = await fetchWriterIndices(signData.writer, signData.orderType, signData.underlyingAsset, provider, optionModuleV2);
|
|
57
67
|
const delegationWallet = new Wallet(delegation.delegationPrivateKey);
|
|
58
68
|
const signature = await signSignData(signData, delegationWallet);
|
|
59
|
-
const managedOrder = buildManagedOrder(signData, writerIndices, holder,
|
|
69
|
+
const managedOrder = buildManagedOrder(signData, writerIndices, holder, orderQuantity);
|
|
60
70
|
const { ppoSettings } = parsePpoOptions(opts);
|
|
61
71
|
const body = {
|
|
62
72
|
signData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sl.js","sourceRoot":"","sources":["../../../src/commands/sl.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"sl.js","sourceRoot":"","sources":["../../../src/commands/sl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EACL,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE3E,EAAE;SACC,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oEAAoE,CAAC;SACjF,cAAc,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SAC1E,cAAc,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;SACxD,cAAc,CAAC,mBAAmB,EAAE,0BAA0B,CAAC;SAC/D,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,CAAC;SACnE,MAAM,CAAC,OAAO,EAAE,oCAAoC,CAAC;SACrD,MAAM,CAAC,yBAAyB,EAAE,iCAAiC,CAAC;SACpE,MAAM,CAAC,0BAA0B,EAAE,oCAAoC,CAAC;SACxE,MAAM,CAAC,kBAAkB,EAAE,gEAAgE,CAAC;SAC5F,MAAM,CAAC,kBAAkB,EAAE,cAAc,EAAE,aAAa,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,OAAO,CAAC;SAC1D,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CACL,KAAK,EAAE,IAYN,EAAE,EAAE;QACH,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,aAAa,CACX,+EAA+E,EAC/E,UAAU,CAAC,YAAY,CACxB,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,aAAa,CACX,gCAAgC,IAAI,CAAC,OAAO,kCAAkC,IAAI,CAAC,OAAO,UAAU,EACpG,UAAU,CAAC,YAAY,CACxB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAsB,CAAC;QACzD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACxC,aAAa,CAAC,8BAA8B,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,6BAA6B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,aAAa,CACX,MAAM,IAAI,wDAAwD,EAClE,UAAU,CAAC,YAAY,CACxB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,WAAY,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,CAAC,UAAU,IAAI,CAAC,OAAO,wBAAwB,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,WAAW,GAAG,aAAc,CAAC,eAAe,IAAI,aAAc,CAAC,eAAe,IAAI,SAAS,CAAC;QAClG,MAAM,aAAa,GAAG,aAAc,CAAC,QAAQ,IAAI,aAAc,CAAC,eAAe,IAAI,GAAG,CAAC;QAEvF,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACnC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAClC,YAAY,EAAE,WAAW;YACzB,QAAQ,EAAE,aAAa;SACxB,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,cAAc,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC;QAE7E,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAC5C,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,eAAe,EACxB,QAAQ,EACR,cAAc,CACf,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;QAEvF,MAAM,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAuB;YAC/B,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,WAAW;SACZ,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAqB,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAChF,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CACF,CAAC;AACN,CAAC"}
|
package/dist/src/commands/tp.js
CHANGED
|
@@ -6,6 +6,7 @@ import { printJson, exitWithError, EXIT_CODES } from '../utils/output.js';
|
|
|
6
6
|
import { getNetworkConfig } from '../services/chain-config.js';
|
|
7
7
|
import { loadDelegationKey } from '../services/key-manager.js';
|
|
8
8
|
import { loadVaultProfile, getPositionAccountFromProfile } from '../services/vault-profile.js';
|
|
9
|
+
import { SubgraphClient } from '../services/subgraph-client.js';
|
|
9
10
|
import { buildSignData, signSignData, fetchWriterIndices, buildManagedOrder, } from '../services/order-signer.js';
|
|
10
11
|
import { parsePpoOptions } from '../utils/ppo.js';
|
|
11
12
|
export function registerTpCommand(program) {
|
|
@@ -41,6 +42,14 @@ export function registerTpCommand(program) {
|
|
|
41
42
|
if (!holder) {
|
|
42
43
|
exitWithError(`No ${side} position vault in profile. Run "jv vault init" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
43
44
|
}
|
|
45
|
+
const net = getNetworkConfig(opts.network);
|
|
46
|
+
const subgraphClient = new SubgraphClient(net.subgraphUrl);
|
|
47
|
+
const existingOrder = await subgraphClient.queryOrderById(opts.orderId);
|
|
48
|
+
if (!existingOrder) {
|
|
49
|
+
exitWithError(`Order #${opts.orderId} not found in subgraph`, EXIT_CODES.BUSINESS_ERROR);
|
|
50
|
+
}
|
|
51
|
+
const orderMargin = existingOrder.marginDeposited || existingOrder.totalFreeAmount || '1000000';
|
|
52
|
+
const orderQuantity = existingOrder.quantity || existingOrder.initialQuantity || '0';
|
|
44
53
|
const intent = {
|
|
45
54
|
orderID: parseInt(opts.orderId, 10),
|
|
46
55
|
price: opts.price,
|
|
@@ -48,15 +57,16 @@ export function registerTpCommand(program) {
|
|
|
48
57
|
side,
|
|
49
58
|
network: opts.network,
|
|
50
59
|
ttlSeconds: parseInt(opts.ttl, 10),
|
|
60
|
+
marginAmount: orderMargin,
|
|
61
|
+
quantity: orderQuantity,
|
|
51
62
|
};
|
|
52
|
-
const net = getNetworkConfig(opts.network);
|
|
53
63
|
const provider = new JsonRpcProvider(net.rpcUrl);
|
|
54
64
|
const optionModuleV2 = net.contracts.optionModuleV2 ?? net.contracts.diamond;
|
|
55
65
|
const signData = await buildSignData(intent, profile, opts.network);
|
|
56
66
|
const writerIndices = await fetchWriterIndices(signData.writer, signData.orderType, signData.underlyingAsset, provider, optionModuleV2);
|
|
57
67
|
const delegationWallet = new Wallet(delegation.delegationPrivateKey);
|
|
58
68
|
const signature = await signSignData(signData, delegationWallet);
|
|
59
|
-
const managedOrder = buildManagedOrder(signData, writerIndices, holder,
|
|
69
|
+
const managedOrder = buildManagedOrder(signData, writerIndices, holder, orderQuantity);
|
|
60
70
|
const { ppoSettings } = parsePpoOptions(opts);
|
|
61
71
|
const body = {
|
|
62
72
|
signData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tp.js","sourceRoot":"","sources":["../../../src/commands/tp.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tp.js","sourceRoot":"","sources":["../../../src/commands/tp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
1
|
import { ethers } from 'ethers';
|
|
3
2
|
import { loadConfig } from '../utils/config.js';
|
|
4
3
|
import { ENDPOINTS } from '../utils/endpoints.js';
|
|
@@ -7,10 +6,7 @@ import { printJson, exitWithError, EXIT_CODES } from '../utils/output.js';
|
|
|
7
6
|
import { getNetworkConfig } from '../services/chain-config.js';
|
|
8
7
|
import { loadOrGenerateDelegationKey, saveDelegationKey } from '../services/key-manager.js';
|
|
9
8
|
import { saveVaultProfile } from '../services/vault-profile.js';
|
|
10
|
-
import {
|
|
11
|
-
function getJvDir() {
|
|
12
|
-
return join(process.env.HOME || process.env.USERPROFILE || '', '.jaspervault');
|
|
13
|
-
}
|
|
9
|
+
import { pollSession } from '../services/session-poller.js';
|
|
14
10
|
const PERPS_OPTION_MODULE_ABI = [
|
|
15
11
|
'function getUserDelegationWhiteListNonce(address wallet) view returns (uint256)',
|
|
16
12
|
];
|
|
@@ -145,108 +141,136 @@ export function registerVaultCommand(program) {
|
|
|
145
141
|
});
|
|
146
142
|
vault
|
|
147
143
|
.command('setup')
|
|
148
|
-
.description('Set up vault via
|
|
149
|
-
.option('--network <name>', 'Network name', '
|
|
144
|
+
.description('Set up vault via hosted web page — generates a URL for the user to sign in their browser (no PRIVATE_KEY needed)')
|
|
145
|
+
.option('--network <name>', 'Network name (signing happens on Base)', 'base_uat')
|
|
150
146
|
.option('--vault-types <types>', 'Comma-separated vault types', '33,37')
|
|
151
|
-
.option('--timeout <seconds>', '
|
|
147
|
+
.option('--timeout <seconds>', 'Polling timeout in seconds', '900')
|
|
152
148
|
.option('--pretty', 'Pretty-print JSON output')
|
|
153
149
|
.action(async (opts) => {
|
|
154
|
-
const
|
|
155
|
-
let wcResult;
|
|
156
|
-
try {
|
|
157
|
-
wcResult = await initWcAndConnect({
|
|
158
|
-
timeoutS,
|
|
159
|
-
onAwaiting: (uri, { qrCodeUrl }) => {
|
|
160
|
-
printJson({
|
|
161
|
-
status: 'awaiting_connection',
|
|
162
|
-
qrCodeUrl,
|
|
163
|
-
uri,
|
|
164
|
-
message: 'Scan QR code or paste URI in wallet to connect',
|
|
165
|
-
}, opts.pretty);
|
|
166
|
-
},
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
catch (err) {
|
|
170
|
-
printJson({ success: false, message: err.message }, opts.pretty);
|
|
171
|
-
process.exit(EXIT_CODES.BUSINESS_ERROR);
|
|
172
|
-
}
|
|
173
|
-
const { client, session, walletAddress } = wcResult;
|
|
174
|
-
loadConfig();
|
|
150
|
+
const config = loadConfig();
|
|
175
151
|
const net = getNetworkConfig(opts.network);
|
|
176
152
|
const { privateKey: delegationKey, address: delegationAddress, wasGenerated } = loadOrGenerateDelegationKey(opts.network);
|
|
177
153
|
const delegationWallet = new ethers.Wallet(delegationKey);
|
|
178
154
|
const provider = new ethers.JsonRpcProvider(net.rpcUrl);
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
155
|
+
const delegationSignDataTemplate = {
|
|
156
|
+
domain: {
|
|
157
|
+
name: 'jasperVault',
|
|
158
|
+
version: '1.0',
|
|
159
|
+
chainId: net.chainId,
|
|
160
|
+
verifyingContract: net.contracts.diamond,
|
|
161
|
+
},
|
|
186
162
|
types: {
|
|
187
|
-
|
|
163
|
+
SignerWhiteListData: [
|
|
164
|
+
{ name: 'wallet', type: 'address' },
|
|
165
|
+
{ name: 'signer', type: 'address' },
|
|
166
|
+
{ name: 'isWhiteList', type: 'bool' },
|
|
167
|
+
{ name: 'nonce', type: 'uint256' },
|
|
168
|
+
{ name: 'deadline', type: 'uint256' },
|
|
188
169
|
{ name: 'name', type: 'string' },
|
|
189
|
-
{ name: 'version', type: 'string' },
|
|
190
|
-
{ name: 'chainId', type: 'uint256' },
|
|
191
|
-
{ name: 'verifyingContract', type: 'address' },
|
|
192
170
|
],
|
|
193
|
-
...signData.types,
|
|
194
171
|
},
|
|
195
|
-
|
|
196
|
-
|
|
172
|
+
message: {
|
|
173
|
+
wallet: '',
|
|
174
|
+
signer: delegationAddress,
|
|
175
|
+
isWhiteList: true,
|
|
176
|
+
nonce: '',
|
|
177
|
+
deadline: '',
|
|
178
|
+
name: 'jasperVaultDelegateDemo',
|
|
179
|
+
},
|
|
180
|
+
vaultFactory: net.contracts.vaultFactory,
|
|
181
|
+
perpsOptionModuleHandle: net.contracts.perpsOptionModuleHandle,
|
|
182
|
+
rpcUrl: net.rpcUrl,
|
|
197
183
|
};
|
|
198
|
-
|
|
199
|
-
const
|
|
184
|
+
const vaultTypes = opts.vaultTypes.split(',').map((s) => parseInt(s.trim(), 10));
|
|
185
|
+
const apiClient = new ApiClient(config);
|
|
186
|
+
const sessionBody = {
|
|
187
|
+
type: 'vault_setup',
|
|
188
|
+
network: opts.network,
|
|
189
|
+
chainId: net.chainId,
|
|
190
|
+
delegationAddress,
|
|
191
|
+
delegationSignData: delegationSignDataTemplate,
|
|
192
|
+
};
|
|
193
|
+
let sessionRes;
|
|
200
194
|
try {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
195
|
+
sessionRes = await apiClient.post(ENDPOINTS.CLI_SESSION_CREATE, sessionBody);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
exitWithError(`Failed to create session: ${err.message}`, EXIT_CODES.HTTP_ERROR);
|
|
199
|
+
}
|
|
200
|
+
const { sessionId, url, expiresAt } = sessionRes.data;
|
|
201
|
+
printJson({
|
|
202
|
+
status: 'session_created',
|
|
203
|
+
sessionId,
|
|
204
|
+
url,
|
|
205
|
+
expiresAt,
|
|
206
|
+
message: 'Open this URL in your browser to connect wallet and complete setup',
|
|
207
|
+
}, opts.pretty);
|
|
208
|
+
const timeoutMs = parseInt(opts.timeout, 10) * 1000 || 900_000;
|
|
209
|
+
const result = await pollSession(apiClient, sessionId, { timeoutMs });
|
|
210
|
+
if (result.status === 'completed' && result.result) {
|
|
211
|
+
const walletAddress = result.result.walletAddress;
|
|
212
|
+
const delegationSig = result.result.delegationSignature;
|
|
213
|
+
const delegationMsg = result.result.delegationMessage;
|
|
214
|
+
const { createVaultSignData, signatureList } = await generateVaultSignatures(walletAddress, delegationWallet, vaultTypes, net.contracts.vaultFactory, provider);
|
|
215
|
+
const vaultInitBody = {
|
|
216
|
+
chainId: String(net.chainId),
|
|
217
|
+
delegationSignature: {
|
|
218
|
+
message: delegationMsg,
|
|
219
|
+
signature: delegationSig,
|
|
207
220
|
},
|
|
221
|
+
vaultSignatures: { createVaultSignData, signatureList },
|
|
222
|
+
};
|
|
223
|
+
const res = await apiClient.post(ENDPOINTS.VAULT_INIT, vaultInitBody);
|
|
224
|
+
if (!res.data.success) {
|
|
225
|
+
printJson({
|
|
226
|
+
success: false,
|
|
227
|
+
message: 'Vault creation failed',
|
|
228
|
+
error: res.data.errorMessage || res.data.message,
|
|
229
|
+
}, opts.pretty);
|
|
230
|
+
process.exit(EXIT_CODES.BUSINESS_ERROR);
|
|
231
|
+
}
|
|
232
|
+
if (wasGenerated) {
|
|
233
|
+
saveDelegationKey(delegationKey, delegationAddress, opts.network);
|
|
234
|
+
}
|
|
235
|
+
const vaultFactory = new ethers.Contract(net.contracts.vaultFactory, ['function getAddress(address wallet, uint256 salt) view returns (address)'], provider);
|
|
236
|
+
const getAddr = vaultFactory.getFunction('getAddress');
|
|
237
|
+
const marginAccount = (await getAddr(walletAddress, 1));
|
|
238
|
+
const vaultEntries = await Promise.all(vaultTypes.map(async (type) => {
|
|
239
|
+
const address = (await getAddr(walletAddress, type));
|
|
240
|
+
return { type, address };
|
|
208
241
|
}));
|
|
242
|
+
saveVaultProfile({
|
|
243
|
+
eoa: walletAddress,
|
|
244
|
+
delegationAddress,
|
|
245
|
+
network: opts.network,
|
|
246
|
+
vaults: vaultEntries,
|
|
247
|
+
marginAccount,
|
|
248
|
+
});
|
|
249
|
+
printJson({
|
|
250
|
+
success: true,
|
|
251
|
+
message: 'Vault setup completed',
|
|
252
|
+
walletAddress,
|
|
253
|
+
delegationAddress,
|
|
254
|
+
marginAccount,
|
|
255
|
+
vaults: vaultEntries,
|
|
256
|
+
transactionHash: res.data.transactionHash,
|
|
257
|
+
}, opts.pretty);
|
|
209
258
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
259
|
+
else if (result.status === 'failed') {
|
|
260
|
+
printJson({
|
|
261
|
+
success: false,
|
|
262
|
+
message: 'Vault setup failed',
|
|
263
|
+
error: result.result?.errorMessage || 'Unknown error',
|
|
264
|
+
}, opts.pretty);
|
|
213
265
|
process.exit(EXIT_CODES.BUSINESS_ERROR);
|
|
214
266
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
delegationSignature: {
|
|
221
|
-
message: signData.message,
|
|
222
|
-
signature: delegationSignature,
|
|
223
|
-
},
|
|
224
|
-
vaultSignatures: { createVaultSignData, signatureList },
|
|
225
|
-
};
|
|
226
|
-
const res = await apiClient.post(ENDPOINTS.VAULT_INIT, body);
|
|
227
|
-
if (!res.data.success) {
|
|
228
|
-
printJson(res.data, opts.pretty);
|
|
267
|
+
else {
|
|
268
|
+
printJson({
|
|
269
|
+
success: false,
|
|
270
|
+
message: `Session ${result.status}`,
|
|
271
|
+
}, opts.pretty);
|
|
229
272
|
process.exit(EXIT_CODES.BUSINESS_ERROR);
|
|
230
273
|
}
|
|
231
|
-
if (wasGenerated) {
|
|
232
|
-
saveDelegationKey(delegationKey, delegationAddress, opts.network);
|
|
233
|
-
}
|
|
234
|
-
const vaultFactory = new ethers.Contract(net.contracts.vaultFactory, VAULT_FACTORY_ABI, provider);
|
|
235
|
-
const getAddr = vaultFactory.getFunction('getAddress');
|
|
236
|
-
const marginAccount = (await getAddr(walletAddress, 1));
|
|
237
|
-
const vaultEntries = await Promise.all(vaultTypes.map(async (type) => {
|
|
238
|
-
const address = (await getAddr(walletAddress, type));
|
|
239
|
-
return { type, address };
|
|
240
|
-
}));
|
|
241
|
-
saveVaultProfile({
|
|
242
|
-
eoa: walletAddress,
|
|
243
|
-
delegationAddress,
|
|
244
|
-
network: opts.network,
|
|
245
|
-
vaults: vaultEntries,
|
|
246
|
-
marginAccount,
|
|
247
|
-
});
|
|
248
|
-
printJson(res.data, opts.pretty);
|
|
249
|
-
process.exit(EXIT_CODES.SUCCESS);
|
|
250
274
|
});
|
|
251
275
|
}
|
|
252
276
|
//# sourceMappingURL=vault.js.map
|