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.
Files changed (60) hide show
  1. package/README.md +25 -24
  2. package/dist/bin/jv.js +6 -2
  3. package/dist/bin/jv.js.map +1 -1
  4. package/dist/src/client.js +28 -1
  5. package/dist/src/client.js.map +1 -1
  6. package/dist/src/commands/deposit.js +129 -125
  7. package/dist/src/commands/deposit.js.map +1 -1
  8. package/dist/src/commands/install.d.ts +2 -0
  9. package/dist/src/commands/install.js +184 -0
  10. package/dist/src/commands/install.js.map +1 -0
  11. package/dist/src/commands/limit-order.js +7 -0
  12. package/dist/src/commands/limit-order.js.map +1 -1
  13. package/dist/src/commands/mcp.d.ts +2 -0
  14. package/dist/src/commands/mcp.js +10 -0
  15. package/dist/src/commands/mcp.js.map +1 -0
  16. package/dist/src/commands/sl.js +12 -2
  17. package/dist/src/commands/sl.js.map +1 -1
  18. package/dist/src/commands/tp.js +12 -2
  19. package/dist/src/commands/tp.js.map +1 -1
  20. package/dist/src/commands/vault.js +111 -87
  21. package/dist/src/commands/vault.js.map +1 -1
  22. package/dist/src/commands/withdraw.d.ts +2 -0
  23. package/dist/src/commands/withdraw.js +114 -0
  24. package/dist/src/commands/withdraw.js.map +1 -0
  25. package/dist/src/mcp/executor.d.ts +23 -0
  26. package/dist/src/mcp/executor.js +75 -0
  27. package/dist/src/mcp/executor.js.map +1 -0
  28. package/dist/src/mcp/index.d.ts +1 -0
  29. package/dist/src/mcp/index.js +58 -0
  30. package/dist/src/mcp/index.js.map +1 -0
  31. package/dist/src/mcp/installer.d.ts +9 -0
  32. package/dist/src/mcp/installer.js +66 -0
  33. package/dist/src/mcp/installer.js.map +1 -0
  34. package/dist/src/mcp/tools.d.ts +15 -0
  35. package/dist/src/mcp/tools.js +250 -0
  36. package/dist/src/mcp/tools.js.map +1 -0
  37. package/dist/src/services/order-signer.js +1 -1
  38. package/dist/src/services/order-signer.js.map +1 -1
  39. package/dist/src/services/session-poller.d.ts +12 -0
  40. package/dist/src/services/session-poller.js +57 -0
  41. package/dist/src/services/session-poller.js.map +1 -0
  42. package/dist/src/templates/skill-body.d.ts +3 -1
  43. package/dist/src/templates/skill-body.js +30 -497
  44. package/dist/src/templates/skill-body.js.map +1 -1
  45. package/dist/src/templates/skill-content/SKILL.core.md +51 -0
  46. package/dist/src/templates/skill-content/frontmatter/claude.md +4 -0
  47. package/dist/src/templates/skill-content/frontmatter/cursor.md +0 -0
  48. package/dist/src/templates/skill-content/frontmatter/openclaw.md +11 -0
  49. package/dist/src/templates/skill-content/references/onboarding.md +124 -0
  50. package/dist/src/templates/skill-content/references/queries.md +294 -0
  51. package/dist/src/templates/skill-content/references/trading.md +274 -0
  52. package/dist/src/templates/skill-content/scripts/check-init.sh +4 -0
  53. package/dist/src/types.d.ts +13 -6
  54. package/dist/src/utils/config.d.ts +1 -1
  55. package/dist/src/utils/config.js +1 -1
  56. package/dist/src/utils/config.js.map +1 -1
  57. package/dist/src/utils/endpoints.d.ts +3 -0
  58. package/dist/src/utils/endpoints.js +5 -0
  59. package/dist/src/utils/endpoints.js.map +1 -1
  60. 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;AAG/C,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEtC,UAAU;SACP,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kEAAkE,CAAC;SAC/E,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,yFAAyF,CAAC;SACtH,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,IAA2D,EAAE,EAAE;QAC5E,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,gBAAgB,EAAE;YAC5E,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mEAAmE,CAAC;SAChF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAA0B,EAAE,EAAE;QACvD,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,gBAAgB,EAAE;YAC5E,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;SAC5C,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAA0B,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YAC1D,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC"}
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;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEtC,UAAU;SACP,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kEAAkE,CAAC;SAC/E,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,yFAAyF,CAAC;SACtH,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,IAA2D,EAAE,EAAE;QAC5E,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,gBAAgB,EAAE;YAC5E,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mEAAmE,CAAC;SAChF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,oBAAoB,EAAE,wCAAwC,CAAC;SACtE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAA2C,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,gBAAgB,EAAE,EAAE,GAAG,CAAC;QACtD,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,gBAAgB,EAAE;YAC5E,MAAM;YACN,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,UAAU;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC;SAC5C,MAAM,CAAC,oBAAoB,EAAE,wCAAwC,CAAC;SACtE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAA2C,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,gBAAgB,EAAE,EAAE,GAAG,CAAC;QACtD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE;YAC1D,MAAM;YACN,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerMcpCommand(program: Command): void;
@@ -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"}
@@ -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, '0');
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"}
@@ -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, '0');
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 { initWcAndConnect, startHeartbeat } from './connect.js';
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 WalletConnectscan QR, sign on phone, done (no PRIVATE_KEY)')
149
- .option('--network <name>', 'Network name', 'jaspervault')
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>', 'WalletConnect timeout in seconds', '120')
147
+ .option('--timeout <seconds>', 'Polling timeout in seconds', '900')
152
148
  .option('--pretty', 'Pretty-print JSON output')
153
149
  .action(async (opts) => {
154
- const timeoutS = parseInt(opts.timeout, 10) || 120;
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 nonceContract = new ethers.Contract(net.contracts.perpsOptionModuleHandle, PERPS_OPTION_MODULE_ABI, provider);
180
- const currentNonce = Number(await nonceContract.getUserDelegationWhiteListNonce(walletAddress));
181
- const vaultTypes = opts.vaultTypes.split(',').map((s) => parseInt(s.trim(), 10));
182
- const { createVaultSignData, signatureList } = await generateVaultSignatures(walletAddress, delegationWallet, vaultTypes, net.contracts.vaultFactory, provider);
183
- const signData = buildDelegationSignData(walletAddress, delegationAddress, currentNonce, net.chainId, net.contracts.diamond);
184
- const typedData = {
185
- domain: signData.domain,
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
- EIP712Domain: [
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
- primaryType: 'SignerWhiteListData',
196
- message: signData.message,
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
- let delegationSignature;
199
- const signHeartbeat = startHeartbeat('wallet_sign', 'Waiting for signature approval on wallet...');
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
- delegationSignature = (await client.request({
202
- topic: session.topic,
203
- chainId: 'eip155:8453',
204
- request: {
205
- method: 'eth_signTypedData_v4',
206
- params: [walletAddress, JSON.stringify(typedData)],
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
- catch (err) {
211
- signHeartbeat.stop();
212
- printJson({ success: false, message: `Signature rejected or failed: ${err.message}` }, opts.pretty);
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
- signHeartbeat.stop();
216
- const config = loadConfig();
217
- const apiClient = new ApiClient(config);
218
- const body = {
219
- chainId: String(net.chainId),
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