jaspervault_cli 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.
Files changed (72) hide show
  1. package/README.md +138 -0
  2. package/config/chains.json +104 -0
  3. package/dist/bin/jv.d.ts +2 -0
  4. package/dist/bin/jv.js +29 -0
  5. package/dist/bin/jv.js.map +1 -0
  6. package/dist/src/client.d.ts +18 -0
  7. package/dist/src/client.js +128 -0
  8. package/dist/src/client.js.map +1 -0
  9. package/dist/src/commands/connect.d.ts +22 -0
  10. package/dist/src/commands/connect.js +128 -0
  11. package/dist/src/commands/connect.js.map +1 -0
  12. package/dist/src/commands/deposit.d.ts +59 -0
  13. package/dist/src/commands/deposit.js +261 -0
  14. package/dist/src/commands/deposit.js.map +1 -0
  15. package/dist/src/commands/init.d.ts +4 -0
  16. package/dist/src/commands/init.js +97 -0
  17. package/dist/src/commands/init.js.map +1 -0
  18. package/dist/src/commands/job.d.ts +2 -0
  19. package/dist/src/commands/job.js +20 -0
  20. package/dist/src/commands/job.js.map +1 -0
  21. package/dist/src/commands/limit-order.d.ts +2 -0
  22. package/dist/src/commands/limit-order.js +51 -0
  23. package/dist/src/commands/limit-order.js.map +1 -0
  24. package/dist/src/commands/order.d.ts +2 -0
  25. package/dist/src/commands/order.js +110 -0
  26. package/dist/src/commands/order.js.map +1 -0
  27. package/dist/src/commands/orders.d.ts +2 -0
  28. package/dist/src/commands/orders.js +72 -0
  29. package/dist/src/commands/orders.js.map +1 -0
  30. package/dist/src/commands/sl.d.ts +2 -0
  31. package/dist/src/commands/sl.js +67 -0
  32. package/dist/src/commands/sl.js.map +1 -0
  33. package/dist/src/commands/tp.d.ts +2 -0
  34. package/dist/src/commands/tp.js +67 -0
  35. package/dist/src/commands/tp.js.map +1 -0
  36. package/dist/src/commands/vault.d.ts +24 -0
  37. package/dist/src/commands/vault.js +249 -0
  38. package/dist/src/commands/vault.js.map +1 -0
  39. package/dist/src/services/chain-config.d.ts +57 -0
  40. package/dist/src/services/chain-config.js +96 -0
  41. package/dist/src/services/chain-config.js.map +1 -0
  42. package/dist/src/services/key-manager.d.ts +23 -0
  43. package/dist/src/services/key-manager.js +79 -0
  44. package/dist/src/services/key-manager.js.map +1 -0
  45. package/dist/src/services/order-signer.d.ts +24 -0
  46. package/dist/src/services/order-signer.js +162 -0
  47. package/dist/src/services/order-signer.js.map +1 -0
  48. package/dist/src/services/price-service.d.ts +14 -0
  49. package/dist/src/services/price-service.js +47 -0
  50. package/dist/src/services/price-service.js.map +1 -0
  51. package/dist/src/services/subgraph-client.d.ts +53 -0
  52. package/dist/src/services/subgraph-client.js +120 -0
  53. package/dist/src/services/subgraph-client.js.map +1 -0
  54. package/dist/src/services/vault-profile.d.ts +15 -0
  55. package/dist/src/services/vault-profile.js +56 -0
  56. package/dist/src/services/vault-profile.js.map +1 -0
  57. package/dist/src/templates/skill-body.d.ts +11 -0
  58. package/dist/src/templates/skill-body.js +233 -0
  59. package/dist/src/templates/skill-body.js.map +1 -0
  60. package/dist/src/types.d.ts +212 -0
  61. package/dist/src/types.js +3 -0
  62. package/dist/src/types.js.map +1 -0
  63. package/dist/src/utils/config.d.ts +7 -0
  64. package/dist/src/utils/config.js +14 -0
  65. package/dist/src/utils/config.js.map +1 -0
  66. package/dist/src/utils/endpoints.d.ts +8 -0
  67. package/dist/src/utils/endpoints.js +13 -0
  68. package/dist/src/utils/endpoints.js.map +1 -0
  69. package/dist/src/utils/output.d.ts +14 -0
  70. package/dist/src/utils/output.js +50 -0
  71. package/dist/src/utils/output.js.map +1 -0
  72. package/package.json +50 -0
@@ -0,0 +1,261 @@
1
+ import { ethers } from 'ethers';
2
+ import { printJson, exitWithError, EXIT_CODES } from '../utils/output.js';
3
+ import { getWarpConfig, getBaseRpcUrl, getJaspervaultRpcUrl, getNetworkConfig, } from '../services/chain-config.js';
4
+ const ERC20_ABI = [
5
+ 'function balanceOf(address account) external view returns (uint256)',
6
+ 'function allowance(address owner, address spender) external view returns (uint256)',
7
+ 'function approve(address spender, uint256 amount) external returns (bool)',
8
+ 'function decimals() external view returns (uint8)',
9
+ ];
10
+ const HYP_ERC20_ABI = [
11
+ 'function transferRemote(uint32 _destination, bytes32 _recipient, uint256 _amount) external payable',
12
+ 'function balanceOf(address account) external view returns (uint256)',
13
+ 'function decimals() external view returns (uint8)',
14
+ ];
15
+ const VAULT_FACTORY_ABI = [
16
+ 'function getAddress(address wallet, uint256 salt) view returns (address)',
17
+ ];
18
+ const BASE_CHAIN_ID = 8453;
19
+ const POLL_TIMEOUT_MS = 60_000;
20
+ const POLL_INTERVAL_MS = 1000;
21
+ /**
22
+ * Compute vault address from vault factory (read-only).
23
+ */
24
+ export async function computeVaultAddress(provider, vaultFactoryAddress, ownerAddress, vaultIndex) {
25
+ const iface = new ethers.Interface(VAULT_FACTORY_ABI);
26
+ const data = iface.encodeFunctionData('getAddress', [ownerAddress, BigInt(vaultIndex)]);
27
+ const result = await provider.call({ to: vaultFactoryAddress, data });
28
+ const decoded = iface.decodeFunctionResult('getAddress', result);
29
+ return decoded[0];
30
+ }
31
+ /**
32
+ * Build approve tx calldata for ERC20.
33
+ */
34
+ export function buildApproveCalldata(spender, amountWei) {
35
+ const iface = new ethers.Interface(ERC20_ABI);
36
+ return iface.encodeFunctionData('approve', [spender, amountWei]);
37
+ }
38
+ /**
39
+ * Build transferRemote tx calldata for Hyperlane Warp.
40
+ */
41
+ export function buildTransferRemoteCalldata(destinationDomain, recipient, amountWei) {
42
+ const iface = new ethers.Interface(HYP_ERC20_ABI);
43
+ const recipientBytes32 = ethers.zeroPadValue(recipient, 32);
44
+ return iface.encodeFunctionData('transferRemote', [
45
+ destinationDomain,
46
+ recipientBytes32,
47
+ amountWei,
48
+ ]);
49
+ }
50
+ /**
51
+ * Build unsigned transaction objects for deposit (approve + transferRemote).
52
+ */
53
+ export function buildDepositTransactions(warpConfig, recipient, amountWei, needsApprove) {
54
+ const chainIdHex = '0x' + BASE_CHAIN_ID.toString(16);
55
+ const txs = [];
56
+ if (needsApprove) {
57
+ txs.push({
58
+ step: 1,
59
+ description: `Approve ${warpConfig.symbol} for Warp Router`,
60
+ required: true,
61
+ tx: {
62
+ to: warpConfig.base.underlyingToken,
63
+ data: buildApproveCalldata(warpConfig.base.warpRouter, ethers.MaxUint256),
64
+ value: '0x0',
65
+ chainId: chainIdHex,
66
+ },
67
+ });
68
+ }
69
+ txs.push({
70
+ step: txs.length + 1,
71
+ description: 'Transfer via Hyperlane to JasperVault',
72
+ required: true,
73
+ tx: {
74
+ to: warpConfig.base.warpRouter,
75
+ data: buildTransferRemoteCalldata(warpConfig.jaspervault.domain, recipient, amountWei),
76
+ value: '0x0',
77
+ chainId: chainIdHex,
78
+ },
79
+ });
80
+ return txs;
81
+ }
82
+ /**
83
+ * Check balances and allowance for deposit (read-only).
84
+ */
85
+ export async function checkDepositBalances(baseProvider, walletAddress, warpConfig, amountWei) {
86
+ const underlyingToken = new ethers.Contract(warpConfig.base.underlyingToken, ERC20_ABI, baseProvider);
87
+ const warpRouter = new ethers.Contract(warpConfig.base.warpRouter, HYP_ERC20_ABI, baseProvider);
88
+ const [underlyingBalance, warpBalance, allowance] = await Promise.all([
89
+ underlyingToken.balanceOf(walletAddress),
90
+ warpRouter.balanceOf(walletAddress),
91
+ underlyingToken.allowance(walletAddress, warpConfig.base.warpRouter),
92
+ ]);
93
+ const hasEnough = underlyingBalance >= amountWei || warpBalance >= amountWei;
94
+ const needsApprove = underlyingBalance >= amountWei && allowance < amountWei;
95
+ return { underlyingBalance, warpBalance, allowance, hasEnough, needsApprove };
96
+ }
97
+ /**
98
+ * Poll for token arrival on JasperVault chain.
99
+ */
100
+ export async function pollForDepositArrival(jaspervaultProvider, destWarpRouterAddress, recipient, initialBalance, timeoutMs = POLL_TIMEOUT_MS) {
101
+ const destWarpRouter = new ethers.Contract(destWarpRouterAddress, ERC20_ABI, jaspervaultProvider);
102
+ const pollStart = Date.now();
103
+ while (Date.now() - pollStart < timeoutMs) {
104
+ try {
105
+ const currentBalance = await destWarpRouter.balanceOf(recipient);
106
+ if (currentBalance > initialBalance) {
107
+ return { arrived: true, arrivalTimeMs: Date.now() - pollStart };
108
+ }
109
+ }
110
+ catch {
111
+ // ignore poll errors
112
+ }
113
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
114
+ }
115
+ return { arrived: false };
116
+ }
117
+ export function registerDepositCommand(program) {
118
+ const deposit = program
119
+ .command('deposit')
120
+ .description('Deposit tokens via Hyperlane Warp Route (Base -> JasperVault)');
121
+ deposit
122
+ .command('info')
123
+ .description('Output unsigned tx data for WalletConnect (approve + transferRemote)')
124
+ .requiredOption('--wallet <address>', 'User EOA wallet address (from WalletConnect)')
125
+ .requiredOption('--token <symbol>', 'Token: jbtc | jusdc | cbbtc | usdc')
126
+ .requiredOption('--amount <value>', 'Amount in human-readable units, e.g. "100" for USDC')
127
+ .option('--network <name>', 'Network for vault address computation', 'jaspervault')
128
+ .option('--vault-index <n>', 'Vault index for computing recipient', '1')
129
+ .option('--pretty', 'Pretty-print JSON output')
130
+ .action(async (opts) => {
131
+ const walletAddress = ethers.getAddress(opts.wallet);
132
+ const warpConfig = getWarpConfig(opts.token);
133
+ const baseRpc = getBaseRpcUrl();
134
+ const jaspervaultRpc = getJaspervaultRpcUrl();
135
+ const net = getNetworkConfig(opts.network);
136
+ const baseProvider = new ethers.JsonRpcProvider(baseRpc);
137
+ const jaspervaultProvider = new ethers.JsonRpcProvider(jaspervaultRpc);
138
+ const vaultIndex = parseInt(opts.vaultIndex, 10);
139
+ const recipient = await computeVaultAddress(jaspervaultProvider, net.contracts.vaultFactory, walletAddress, vaultIndex);
140
+ const amountWei = ethers.parseUnits(opts.amount, warpConfig.decimals);
141
+ const { hasEnough, needsApprove } = await checkDepositBalances(baseProvider, walletAddress, warpConfig, amountWei);
142
+ if (!hasEnough) {
143
+ exitWithError(`Insufficient balance. Required: ${opts.amount} ${warpConfig.symbol}`, EXIT_CODES.BUSINESS_ERROR);
144
+ }
145
+ const transactions = buildDepositTransactions(warpConfig, recipient, amountWei, needsApprove);
146
+ const result = {
147
+ success: true,
148
+ recipient,
149
+ token: warpConfig.symbol,
150
+ amount: opts.amount,
151
+ amountWei: amountWei.toString(),
152
+ transactions,
153
+ polling: {
154
+ description: 'After tx confirms, check arrival on JasperVault',
155
+ command: `jv deposit poll --recipient ${recipient} --token ${opts.token} --network ${opts.network}`,
156
+ },
157
+ };
158
+ printJson(result, opts.pretty);
159
+ });
160
+ deposit
161
+ .command('poll')
162
+ .description('Poll for token arrival on JasperVault chain')
163
+ .requiredOption('--recipient <address>', 'Vault address (recipient)')
164
+ .requiredOption('--token <symbol>', 'Token: jbtc | jusdc | cbbtc | usdc')
165
+ .option('--timeout <seconds>', 'Poll timeout in seconds', '60')
166
+ .option('--network <name>', 'Network (for dest warp router)', 'jaspervault')
167
+ .option('--pretty', 'Pretty-print JSON output')
168
+ .action(async (opts) => {
169
+ const warpConfig = getWarpConfig(opts.token);
170
+ const jaspervaultRpc = getJaspervaultRpcUrl();
171
+ const jaspervaultProvider = new ethers.JsonRpcProvider(jaspervaultRpc);
172
+ const destWarpRouter = new ethers.Contract(warpConfig.jaspervault.warpRouter, ERC20_ABI, jaspervaultProvider);
173
+ let initialBalance = 0n;
174
+ try {
175
+ initialBalance = await destWarpRouter.balanceOf(opts.recipient);
176
+ }
177
+ catch {
178
+ // ignore
179
+ }
180
+ const timeoutMs = parseInt(opts.timeout, 10) * 1000;
181
+ const { arrived, arrivalTimeMs } = await pollForDepositArrival(jaspervaultProvider, warpConfig.jaspervault.warpRouter, opts.recipient, initialBalance, timeoutMs);
182
+ const result = {
183
+ success: true,
184
+ arrived,
185
+ arrivalTimeMs: arrived ? arrivalTimeMs : undefined,
186
+ message: arrived
187
+ ? `Tokens arrived on JasperVault in ${arrivalTimeMs}ms`
188
+ : 'Timeout; tokens may still be in transit to JasperVault',
189
+ };
190
+ printJson(result, opts.pretty);
191
+ });
192
+ deposit
193
+ .command('run', { isDefault: true })
194
+ .description('Execute deposit (requires PRIVATE_KEY)')
195
+ .requiredOption('--token <symbol>', 'Token: jbtc | jusdc | cbbtc | usdc')
196
+ .requiredOption('--amount <value>', 'Amount in human-readable units, e.g. "100" for USDC')
197
+ .option('--network <name>', 'Network for vault address computation', 'jaspervault')
198
+ .option('--vault-index <n>', 'Vault index for computing recipient', '1')
199
+ .option('--no-wait', 'Skip polling for arrival on JasperVault')
200
+ .option('--pretty', 'Pretty-print JSON output')
201
+ .action(async (opts) => {
202
+ const privateKey = process.env.PRIVATE_KEY;
203
+ if (!privateKey) {
204
+ exitWithError('PRIVATE_KEY environment variable is not set. Set it to your EOA wallet private key.', EXIT_CODES.CONFIG_ERROR);
205
+ }
206
+ const wallet = new ethers.Wallet(privateKey);
207
+ const warpConfig = getWarpConfig(opts.token);
208
+ const baseRpc = getBaseRpcUrl();
209
+ const jaspervaultRpc = getJaspervaultRpcUrl();
210
+ const net = getNetworkConfig(opts.network);
211
+ const baseProvider = new ethers.JsonRpcProvider(baseRpc);
212
+ const jaspervaultProvider = new ethers.JsonRpcProvider(jaspervaultRpc);
213
+ const vaultIndex = parseInt(opts.vaultIndex, 10);
214
+ const recipient = await computeVaultAddress(jaspervaultProvider, net.contracts.vaultFactory, wallet.address, vaultIndex);
215
+ const amountWei = ethers.parseUnits(opts.amount, warpConfig.decimals);
216
+ const { hasEnough, needsApprove } = await checkDepositBalances(baseProvider, wallet.address, warpConfig, amountWei);
217
+ if (!hasEnough) {
218
+ exitWithError(`Insufficient balance. Required: ${opts.amount} ${warpConfig.symbol}`, EXIT_CODES.BUSINESS_ERROR);
219
+ }
220
+ const underlyingToken = new ethers.Contract(warpConfig.base.underlyingToken, ERC20_ABI, wallet.connect(baseProvider));
221
+ const warpRouter = new ethers.Contract(warpConfig.base.warpRouter, HYP_ERC20_ABI, wallet.connect(baseProvider));
222
+ if (needsApprove) {
223
+ const approveTx = await underlyingToken.approve(warpConfig.base.warpRouter, ethers.MaxUint256);
224
+ await approveTx.wait(1);
225
+ }
226
+ const transferStartTime = Date.now();
227
+ const recipientBytes32 = ethers.zeroPadValue(recipient, 32);
228
+ const tx = await warpRouter.transferRemote(warpConfig.jaspervault.domain, recipientBytes32, amountWei, { value: 0n });
229
+ const receipt = await tx.wait(1);
230
+ const baseChainConfirmTimeMs = Date.now() - transferStartTime;
231
+ const result = {
232
+ success: true,
233
+ message: 'Deposit transaction confirmed on Base',
234
+ transactionHash: receipt.hash,
235
+ recipient,
236
+ token: warpConfig.symbol,
237
+ amount: opts.amount,
238
+ baseChainConfirmTimeMs,
239
+ };
240
+ if (!opts.wait) {
241
+ printJson(result, opts.pretty);
242
+ return;
243
+ }
244
+ let initialBalance = 0n;
245
+ try {
246
+ const destWarpRouter = new ethers.Contract(warpConfig.jaspervault.warpRouter, ERC20_ABI, jaspervaultProvider);
247
+ initialBalance = await destWarpRouter.balanceOf(recipient);
248
+ }
249
+ catch {
250
+ // ignore
251
+ }
252
+ const { arrived, arrivalTimeMs } = await pollForDepositArrival(jaspervaultProvider, warpConfig.jaspervault.warpRouter, recipient, initialBalance, POLL_TIMEOUT_MS);
253
+ result.arrived = arrived;
254
+ result.arrivalTimeMs = arrivalTimeMs;
255
+ if (!arrived) {
256
+ result.message = 'Deposit confirmed on Base; tokens may still be in transit to JasperVault';
257
+ }
258
+ printJson(result, opts.pretty);
259
+ });
260
+ }
261
+ //# sourceMappingURL=deposit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deposit.js","sourceRoot":"","sources":["../../../src/commands/deposit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare const PLATFORMS: readonly ["openclaw", "cursor", "claude", "all"];
3
+ export type Platform = (typeof PLATFORMS)[number];
4
+ export declare function registerInitCommand(program: Command): void;
@@ -0,0 +1,97 @@
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
+ export const PLATFORMS = ['openclaw', 'cursor', 'claude', 'all'];
6
+ const SKILL_DIR = 'jasper-vault-cli';
7
+ const SKILL_FILE = 'SKILL.md';
8
+ function getTargetPath(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
+ case 'all':
23
+ return [
24
+ path.join(home, '.openclaw', 'skills', SKILL_DIR),
25
+ path.join(cwd, '.cursor', 'skills', SKILL_DIR),
26
+ path.join(cwd, '.claude', 'skills', SKILL_DIR),
27
+ ];
28
+ default:
29
+ throw new Error(`Unknown platform: ${platform}`);
30
+ }
31
+ }
32
+ function getPlatformFromPath(pathStr) {
33
+ if (pathStr.includes('.openclaw'))
34
+ return 'openclaw';
35
+ if (pathStr.includes('.cursor'))
36
+ return 'cursor';
37
+ if (pathStr.includes('.claude'))
38
+ return 'claude';
39
+ throw new Error(`Cannot determine platform from path: ${pathStr}`);
40
+ }
41
+ function getPlatformDisplayName(p) {
42
+ return p === 'openclaw' ? 'OpenClaw' : p === 'cursor' ? 'Cursor' : 'Claude Code';
43
+ }
44
+ export function registerInitCommand(program) {
45
+ program
46
+ .command('init')
47
+ .description('Install JasperVault skill to AI platform (OpenClaw, Cursor, Claude Code)')
48
+ .requiredOption('--ai <platform>', `Target platform: ${PLATFORMS.join(', ')}`)
49
+ .option('--global', 'Install to user home directory (cursor/claude only)')
50
+ .option('--force', 'Overwrite existing skill file without prompting')
51
+ .action(async (opts) => {
52
+ const platform = opts.ai;
53
+ if (!PLATFORMS.includes(platform)) {
54
+ process.stderr.write(`Error: Invalid platform "${platform}". Use one of: ${PLATFORMS.join(', ')}\n`);
55
+ process.exit(1);
56
+ }
57
+ const globalFlag = opts.global ?? false;
58
+ const force = opts.force ?? false;
59
+ const targetPaths = getTargetPath(platform, globalFlag);
60
+ process.stdout.write(BANNER + '\n\n');
61
+ const results = [];
62
+ for (const targetDir of targetPaths) {
63
+ const filePath = path.join(targetDir, SKILL_FILE);
64
+ const skillPlatform = platform === 'all' ? getPlatformFromPath(targetDir) : platform;
65
+ const platDisplay = getPlatformDisplayName(skillPlatform);
66
+ try {
67
+ const exists = await fs
68
+ .access(filePath)
69
+ .then(() => true)
70
+ .catch(() => false);
71
+ if (exists && !force) {
72
+ process.stderr.write(`Error: Skill already exists at ${filePath}\n` +
73
+ 'Use --force to overwrite.\n');
74
+ process.exit(1);
75
+ }
76
+ await fs.mkdir(targetDir, { recursive: true });
77
+ const content = buildSkillContent(skillPlatform);
78
+ await fs.writeFile(filePath, content, 'utf8');
79
+ results.push({ path: filePath, platform: platDisplay });
80
+ }
81
+ catch (err) {
82
+ process.stderr.write(`Error installing to ${platDisplay}: ${err.message}\n`);
83
+ process.exit(1);
84
+ }
85
+ }
86
+ process.stdout.write('\n ✓ Skill installed successfully!\n\n' +
87
+ results
88
+ .map((r) => ` Platform: ${r.platform}\n Location: ${r.path}`)
89
+ .join('\n\n') +
90
+ '\n\n Next steps:\n' +
91
+ ' 1. First-time setup: export PRIVATE_KEY=0x... && jv vault init --network jaspervault\n' +
92
+ ' 2. (Optional) Override API URL for local debugging: export JV_API_URL=http://localhost:3000\n' +
93
+ ' 3. (Optional) Set API key: export JV_API_KEY=your-key\n' +
94
+ ' 4. Start using jv commands or let your AI agent call them\n');
95
+ });
96
+ }
97
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerJobCommand(program: Command): void;
@@ -0,0 +1,20 @@
1
+ import { loadConfig } from '../utils/config.js';
2
+ import { ApiClient } from '../client.js';
3
+ import { printJson } from '../utils/output.js';
4
+ export function registerJobCommand(program) {
5
+ const job = program
6
+ .command('job')
7
+ .description('Query job execution status');
8
+ job
9
+ .command('status')
10
+ .description('Get job result by jobId (POST /order/perpsSSE)')
11
+ .argument('<jobId>', 'Job ID to query')
12
+ .option('--pretty', 'Pretty-print JSON output')
13
+ .action(async (jobId, opts) => {
14
+ const config = loadConfig();
15
+ const client = new ApiClient(config);
16
+ const result = await client.watchJobStream(jobId, 60);
17
+ printJson(result, opts.pretty);
18
+ });
19
+ }
20
+ //# sourceMappingURL=job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/commands/job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;SACtC,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAC9C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAA0B,EAAE,EAAE;QAC1D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerLimitOrderCommand(program: Command): void;
@@ -0,0 +1,51 @@
1
+ import { loadConfig } from '../utils/config.js';
2
+ import { ENDPOINTS } from '../utils/endpoints.js';
3
+ import { ApiClient } from '../client.js';
4
+ import { printJson } from '../utils/output.js';
5
+ export function registerLimitOrderCommand(program) {
6
+ const limitOrder = program
7
+ .command('limit-order')
8
+ .description('Manage limit orders');
9
+ limitOrder
10
+ .command('list')
11
+ .description('List limit orders by wallet (POST /order/getPerpsLimitOrderList)')
12
+ .requiredOption('--wallet <address>', 'Wallet address')
13
+ .option('--status <status>', 'Filter by status (PENDING, TRIGGERED, EXECUTING, COMPLETED, FAILED, EXPIRED, CANCELLED)')
14
+ .option('--pretty', 'Pretty-print JSON output')
15
+ .action(async (opts) => {
16
+ const config = loadConfig();
17
+ const client = new ApiClient(config);
18
+ const res = await client.post(ENDPOINTS.LIMIT_ORDER_LIST, {
19
+ wallet: opts.wallet,
20
+ status: opts.status,
21
+ });
22
+ printJson(res.data, opts.pretty);
23
+ });
24
+ limitOrder
25
+ .command('status')
26
+ .description('Get limit order status by ID (POST /order/getPerpsLimitOrderList)')
27
+ .argument('<id>', 'Limit order ID')
28
+ .option('--pretty', 'Pretty-print JSON output')
29
+ .action(async (id, opts) => {
30
+ const config = loadConfig();
31
+ const client = new ApiClient(config);
32
+ const res = await client.post(ENDPOINTS.LIMIT_ORDER_LIST, {
33
+ limitOrderId: id,
34
+ });
35
+ printJson(res.data, opts.pretty);
36
+ });
37
+ limitOrder
38
+ .command('cancel')
39
+ .description('Cancel a limit order (POST /order/canclePerpsLimitOrder)')
40
+ .argument('<id>', 'Limit order ID to cancel')
41
+ .option('--pretty', 'Pretty-print JSON output')
42
+ .action(async (id, opts) => {
43
+ const config = loadConfig();
44
+ const client = new ApiClient(config);
45
+ const res = await client.post(ENDPOINTS.LIMIT_ORDER_CANCEL, {
46
+ limitOrderId: id,
47
+ });
48
+ printJson(res.data, opts.pretty);
49
+ });
50
+ }
51
+ //# sourceMappingURL=limit-order.js.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOrderCommand(program: Command): void;
@@ -0,0 +1,110 @@
1
+ import { ethers, Wallet, JsonRpcProvider } from 'ethers';
2
+ import { loadConfig } from '../utils/config.js';
3
+ import { ENDPOINTS } from '../utils/endpoints.js';
4
+ import { ApiClient } from '../client.js';
5
+ import { printJson, exitWithError, EXIT_CODES, resolvePayload } from '../utils/output.js';
6
+ import { getNetworkConfig } from '../services/chain-config.js';
7
+ import { loadDelegationKey } from '../services/key-manager.js';
8
+ import { loadVaultProfile, getPositionAccountFromProfile } from '../services/vault-profile.js';
9
+ import { buildSignData, signSignData, fetchWriterIndices, buildManagedOrder, } from '../services/order-signer.js';
10
+ import { fetchCurrentPrice, calculateQuantity } from '../services/price-service.js';
11
+ export function registerOrderCommand(program) {
12
+ const order = program
13
+ .command('order')
14
+ .description('Create orders (market, limit, or option)');
15
+ order
16
+ .command('create')
17
+ .description('Create order with delegation wallet signing (POST /order/perps)')
18
+ .requiredOption('--side <long|short>', 'Position side')
19
+ .requiredOption('--symbol <symbol>', 'Asset symbol (e.g. JBTC, CBBTC)')
20
+ .option('--leverage <n>', 'Leverage (default: from chain config, typically 50)')
21
+ .requiredOption('--margin-amount <usdc>', 'Total USDC/JUSDC to deploy (notional value of position)')
22
+ .option('--margin-account <addr>', 'Margin vault address (default: from profile)')
23
+ .option('--position-account <addr>', 'Position vault address (default: from profile)')
24
+ .option('--limit-price <price>', 'Limit price in USDC (omit for market order)')
25
+ .option('--network <name>', 'Network name', 'jaspervault')
26
+ .option('--ttl <seconds>', 'Order TTL in seconds', '3600')
27
+ .option('--pretty', 'Pretty-print JSON output')
28
+ .action(async (opts) => {
29
+ const delegation = loadDelegationKey();
30
+ if (!delegation) {
31
+ exitWithError('Delegation key not found. Run "jv vault init" first or set JV_DELEGATION_KEY.', EXIT_CODES.CONFIG_ERROR);
32
+ }
33
+ const profile = loadVaultProfile(opts.network);
34
+ if (!profile) {
35
+ exitWithError(`No vault profile for network ${opts.network}. Run "jv vault init --network ${opts.network}" first.`, EXIT_CODES.CONFIG_ERROR);
36
+ }
37
+ const side = opts.side.toLowerCase();
38
+ if (side !== 'long' && side !== 'short') {
39
+ exitWithError('--side must be long or short', EXIT_CODES.CONFIG_ERROR);
40
+ }
41
+ const net = getNetworkConfig(opts.network);
42
+ const leverage = opts.leverage
43
+ ? parseInt(opts.leverage, 10)
44
+ : (net.defaultLeverage ?? 50);
45
+ const notionalAmount = parseFloat(opts.marginAmount);
46
+ const actualMargin = (notionalAmount / leverage).toFixed(6);
47
+ const positionAccount = opts.positionAccount ?? getPositionAccountFromProfile(profile, side) ?? undefined;
48
+ const intent = {
49
+ side,
50
+ symbol: opts.symbol,
51
+ leverage,
52
+ marginAmount: actualMargin,
53
+ marginAccount: opts.marginAccount ?? profile.marginAccount,
54
+ positionAccount,
55
+ limitPrice: opts.limitPrice,
56
+ network: opts.network,
57
+ ttlSeconds: parseInt(opts.ttl, 10),
58
+ };
59
+ const provider = new JsonRpcProvider(net.rpcUrl);
60
+ const optionModuleV2 = net.contracts.optionModuleV2 ?? net.contracts.diamond;
61
+ if (!positionAccount) {
62
+ exitWithError(`positionAccount required for ${side}. Run vault init or pass --position-account.`, EXIT_CODES.CONFIG_ERROR);
63
+ }
64
+ const signData = await buildSignData(intent, profile, opts.network);
65
+ const writerIndices = await fetchWriterIndices(signData.writer, signData.orderType, signData.underlyingAsset, provider, optionModuleV2);
66
+ const marginDecimals = net.marginAsset?.decimals ?? 6;
67
+ const currentPrice = await fetchCurrentPrice(opts.symbol, opts.network);
68
+ const quantity = calculateQuantity(signData.marginAmount, currentPrice, marginDecimals);
69
+ const priceUsd = Number(ethers.formatUnits(currentPrice, 18));
70
+ const estimatedSize = notionalAmount / priceUsd;
71
+ console.error(`Estimated: ~${estimatedSize.toFixed(6)} ${opts.symbol} @ $${priceUsd.toLocaleString()} (~$${notionalAmount.toLocaleString()} JUSDC total, ${leverage}x)`);
72
+ const delegationWallet = new Wallet(delegation.delegationPrivateKey);
73
+ const signature = await signSignData(signData, delegationWallet);
74
+ const managedOrder = buildManagedOrder(signData, writerIndices, positionAccount, quantity);
75
+ const body = {
76
+ signData,
77
+ signature,
78
+ managedOrder,
79
+ ppoSettings: { optionExpireTime: '0' },
80
+ };
81
+ const config = loadConfig();
82
+ const client = new ApiClient(config);
83
+ const res = await client.post(ENDPOINTS.ORDER_CREATE, body);
84
+ printJson(res.data, opts.pretty);
85
+ const payload = res.data;
86
+ if (payload.orderType === 'market' && 'jobId' in payload && payload.jobId) {
87
+ const sseResult = await client.watchJobStream(payload.jobId, 60);
88
+ printJson(sseResult, opts.pretty);
89
+ if (sseResult.status !== 'completed') {
90
+ exitWithError(sseResult.error ?? `Job ${sseResult.status}`, EXIT_CODES.BUSINESS_ERROR);
91
+ }
92
+ }
93
+ });
94
+ order
95
+ .command('create-option')
96
+ .description('Create a hedging option for an existing position (POST /order/perpsOptionCreate)')
97
+ .requiredOption('--order-id <id>', 'Associated perps order ID')
98
+ .option('--data <json>', 'Inline JSON payload')
99
+ .option('--payload <file>', 'Path to JSON payload file')
100
+ .option('--pretty', 'Pretty-print JSON output')
101
+ .action(async (opts) => {
102
+ const config = loadConfig();
103
+ const client = new ApiClient(config);
104
+ const body = await resolvePayload(opts);
105
+ body.orderId = opts.orderId;
106
+ const res = await client.post(ENDPOINTS.ORDER_CREATE_OPTION, body);
107
+ printJson(res.data, opts.pretty);
108
+ });
109
+ }
110
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../src/commands/order.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOrdersCommand(program: Command): void;