jaspervault_cli 1.0.8 → 1.0.9

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.
@@ -10,17 +10,118 @@ function getSubgraphClient(network) {
10
10
  }
11
11
  return new SubgraphClient(subgraphUrl);
12
12
  }
13
+ /**
14
+ * Parse a time argument into a Unix timestamp string (seconds).
15
+ * Supported formats:
16
+ * - "7d" / "1w" / "2h" → relative: current time minus N days/weeks/hours
17
+ * - "2025-01-01" → ISO date string parsed via Date.parse
18
+ * - pure integer string → treated as Unix timestamp directly
19
+ */
20
+ function parseTimeArg(input) {
21
+ const relative = input.match(/^(\d+)(d|w|h)$/i);
22
+ if (relative) {
23
+ const n = parseInt(relative[1], 10);
24
+ const unit = relative[2].toLowerCase();
25
+ const secondsPerUnit = { h: 3600, d: 86400, w: 604800 };
26
+ const nowSec = Math.floor(Date.now() / 1000);
27
+ return String(nowSec - n * secondsPerUnit[unit]);
28
+ }
29
+ if (/^\d+$/.test(input)) {
30
+ return input;
31
+ }
32
+ const ms = Date.parse(input);
33
+ if (isNaN(ms)) {
34
+ throw new Error(`Invalid time format: "${input}". Use "7d", "1w", "2h", a Unix timestamp, or an ISO date like "2025-01-01".`);
35
+ }
36
+ return String(Math.floor(ms / 1000));
37
+ }
38
+ /**
39
+ * Convert a wei-style integer string to a decimal string with correct precision.
40
+ * Uses BigInt to avoid floating-point precision loss for large numbers.
41
+ */
42
+ function weiToDecimal(value, decimals) {
43
+ try {
44
+ const bigVal = BigInt(value);
45
+ const negative = bigVal < 0n;
46
+ const absVal = negative ? -bigVal : bigVal;
47
+ const divisor = 10n ** BigInt(decimals);
48
+ const intPart = absVal / divisor;
49
+ const fracPart = absVal % divisor;
50
+ const fracStr = fracPart.toString().padStart(decimals, '0');
51
+ const sign = negative ? '-' : '';
52
+ return `${sign}${intPart}.${fracStr}`;
53
+ }
54
+ catch {
55
+ return value;
56
+ }
57
+ }
58
+ /**
59
+ * Append human-readable formatted fields to a raw SubgraphOrder.
60
+ * Original raw fields are preserved; formatted fields are added alongside.
61
+ * Fields added: margin, size, entryPriceUsd, strikeAmountUsd, leverage, createdTime
62
+ */
63
+ function formatOrder(order, net) {
64
+ const marginDecimals = net.marginAsset?.decimals ?? 6;
65
+ let tokenDecimals = 8;
66
+ if (net.tokens) {
67
+ for (const tok of Object.values(net.tokens)) {
68
+ if (tok.address.toLowerCase() === order.underlyingAsset.toLowerCase()) {
69
+ tokenDecimals = tok.decimals;
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ const margin = order.marginDeposited
75
+ ? weiToDecimal(order.marginDeposited, marginDecimals)
76
+ : undefined;
77
+ const size = order.quantity
78
+ ? weiToDecimal(order.quantity, tokenDecimals)
79
+ : undefined;
80
+ const entryPriceUsd = order.entryPrice
81
+ ? weiToDecimal(order.entryPrice, 18)
82
+ : undefined;
83
+ const strikeAmountUsd = order.strikeAmount
84
+ ? weiToDecimal(order.strikeAmount, 18)
85
+ : undefined;
86
+ let leverage;
87
+ if (order.leverage) {
88
+ leverage = order.leverage;
89
+ }
90
+ else if (order.productType) {
91
+ try {
92
+ leverage = String(BigInt(order.productType) / 10n ** 12n);
93
+ }
94
+ catch {
95
+ leverage = undefined;
96
+ }
97
+ }
98
+ const createdTime = order.createdAt
99
+ ? new Date(Number(order.createdAt) * 1000).toISOString()
100
+ : undefined;
101
+ return {
102
+ ...order,
103
+ ...(margin !== undefined && { margin }),
104
+ ...(size !== undefined && { size }),
105
+ ...(entryPriceUsd !== undefined && { entryPriceUsd }),
106
+ ...(strikeAmountUsd !== undefined && { strikeAmountUsd }),
107
+ ...(leverage !== undefined && { leverage }),
108
+ ...(createdTime !== undefined && { createdTime }),
109
+ };
110
+ }
13
111
  export function registerOrdersCommand(program) {
14
112
  const orders = program
15
113
  .command('orders')
16
114
  .description('Query positions / orders');
17
115
  orders
18
116
  .command('list')
19
- .description('List orders for your position vault (Subgraph)')
117
+ .description('List orders for your position vault (Subgraph). Defaults to active positions only.')
20
118
  .option('--network <name>', 'Network name', 'jaspervault')
21
119
  .option('--page <number>', 'Page number (1-based)', '1')
22
120
  .option('--limit <number>', 'Items per page', '20')
23
121
  .option('--position-side <side>', 'Filter by position side (LONG / SHORT)')
122
+ .option('--all', 'Show all orders including closed (default: active only)')
123
+ .option('--since <time>', 'Filter orders created after this time (e.g. "7d", "1w", "2h", "2025-01-01", or Unix timestamp)')
124
+ .option('--until <time>', 'Filter orders created before this time (same formats as --since)')
24
125
  .option('--pretty', 'Pretty-print JSON output')
25
126
  .action(async (opts) => {
26
127
  const profile = loadVaultProfile(opts.network);
@@ -31,13 +132,39 @@ export function registerOrdersCommand(program) {
31
132
  const page = parseInt(opts.page ?? '1', 10);
32
133
  const skip = (page - 1) * limit;
33
134
  const recipient = profile.marginAccount ?? '';
135
+ const filter = { recipient };
136
+ if (!opts.all) {
137
+ filter.isActive = true;
138
+ }
139
+ if (opts.since) {
140
+ try {
141
+ filter.createdAtGte = parseTimeArg(opts.since);
142
+ }
143
+ catch (e) {
144
+ exitWithError(e.message, EXIT_CODES.CONFIG_ERROR);
145
+ }
146
+ }
147
+ if (opts.until) {
148
+ try {
149
+ filter.createdAtLte = parseTimeArg(opts.until);
150
+ }
151
+ catch (e) {
152
+ exitWithError(e.message, EXIT_CODES.CONFIG_ERROR);
153
+ }
154
+ }
155
+ const net = getNetworkConfig(opts.network);
34
156
  const client = getSubgraphClient(opts.network);
35
- let orders = await client.queryOrdersByRecipient(recipient, limit, skip);
157
+ const [rawOrders, total] = await Promise.all([
158
+ client.queryOrders(filter, limit, skip),
159
+ client.countOrders(filter),
160
+ ]);
161
+ let formattedOrders = rawOrders.map((o) => formatOrder(o, net));
36
162
  if (opts.positionSide) {
37
163
  const side = opts.positionSide.toUpperCase();
38
- orders = orders.filter((o) => o.positionSide === side);
164
+ formattedOrders = formattedOrders.filter((o) => o.positionSide === side);
39
165
  }
40
- printJson({ orders, total: orders.length, page, limit }, opts.pretty);
166
+ const totalPages = Math.ceil(total / limit);
167
+ printJson({ orders: formattedOrders, total, page, limit, totalPages }, opts.pretty);
41
168
  });
42
169
  orders
43
170
  .command('get')
@@ -46,12 +173,13 @@ export function registerOrdersCommand(program) {
46
173
  .option('--network <name>', 'Network name', 'jaspervault')
47
174
  .option('--pretty', 'Pretty-print JSON output')
48
175
  .action(async (orderId, opts) => {
176
+ const net = getNetworkConfig(opts.network);
49
177
  const client = getSubgraphClient(opts.network);
50
178
  const order = await client.queryOrderById(orderId);
51
179
  if (!order) {
52
180
  exitWithError(`Order ${orderId} not found in Subgraph.`, EXIT_CODES.BUSINESS_ERROR);
53
181
  }
54
- printJson(order, opts.pretty);
182
+ printJson(formatOrder(order, net), opts.pretty);
55
183
  });
56
184
  orders
57
185
  .command('stats')
@@ -1 +1 @@
1
- {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/commands/orders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/commands/orders.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,12 @@ export interface SubgraphOrder {
39
39
  optionType: number;
40
40
  }>;
41
41
  }
42
+ export interface OrderQueryFilter {
43
+ recipient: string;
44
+ isActive?: boolean;
45
+ createdAtGte?: string;
46
+ createdAtLte?: string;
47
+ }
42
48
  export interface OrderStats {
43
49
  total: number;
44
50
  active: number;
@@ -48,6 +54,7 @@ export declare class SubgraphClient {
48
54
  private client;
49
55
  constructor(endpoint: string);
50
56
  queryOrderById(orderId: string): Promise<SubgraphOrder | null>;
51
- queryOrdersByRecipient(recipient: string, first?: number, skip?: number): Promise<SubgraphOrder[]>;
57
+ queryOrders(filter: OrderQueryFilter, first?: number, skip?: number): Promise<SubgraphOrder[]>;
58
+ countOrders(filter: OrderQueryFilter): Promise<number>;
52
59
  queryOrderStats(recipient: string): Promise<OrderStats>;
53
60
  }
@@ -1,4 +1,41 @@
1
1
  import { GraphQLClient } from 'graphql-request';
2
+ const ORDER_FIELDS = `
3
+ id
4
+ holder
5
+ writer
6
+ recipient
7
+ transactionHash
8
+ lockAmount
9
+ quantity
10
+ initialQuantity
11
+ strikeAmount
12
+ entryPrice
13
+ underlyingAsset
14
+ lockAsset
15
+ strikeAsset
16
+ marginAsset
17
+ positionSide
18
+ productType
19
+ marginDeposited
20
+ totalFreeAmount
21
+ createdAt
22
+ lastModifiedAt
23
+ expirationDate
24
+ lockDate
25
+ leverage
26
+ operationCount
27
+ isActive
28
+ blockNumber
29
+ perpsOptions {
30
+ id
31
+ orderID
32
+ hedgeOrderID
33
+ status
34
+ quantity
35
+ expirationDate
36
+ optionType
37
+ }
38
+ `;
2
39
  const GET_ORDER_BY_ID = `
3
40
  query GetOrderById($orderID: BigInt!) {
4
41
  perpsOrder(id: $orderID) {
@@ -40,53 +77,6 @@ const GET_ORDER_BY_ID = `
40
77
  }
41
78
  }
42
79
  `;
43
- const GET_ORDERS_BY_RECIPIENT = `
44
- query GetOrdersByRecipient($recipient: String!, $first: Int!, $skip: Int!) {
45
- perpsOrders(
46
- where: { recipient: $recipient }
47
- first: $first
48
- skip: $skip
49
- orderBy: createdAt
50
- orderDirection: desc
51
- ) {
52
- id
53
- holder
54
- writer
55
- recipient
56
- transactionHash
57
- lockAmount
58
- quantity
59
- initialQuantity
60
- strikeAmount
61
- entryPrice
62
- underlyingAsset
63
- lockAsset
64
- strikeAsset
65
- marginAsset
66
- positionSide
67
- productType
68
- marginDeposited
69
- totalFreeAmount
70
- createdAt
71
- lastModifiedAt
72
- expirationDate
73
- lockDate
74
- leverage
75
- operationCount
76
- isActive
77
- blockNumber
78
- perpsOptions {
79
- id
80
- orderID
81
- hedgeOrderID
82
- status
83
- quantity
84
- expirationDate
85
- optionType
86
- }
87
- }
88
- }
89
- `;
90
80
  const GET_ORDER_STATS_BY_RECIPIENT = `
91
81
  query GetOrderStatsByRecipient($recipient: String!) {
92
82
  total: perpsOrders(where: { recipient: $recipient }) {
@@ -97,6 +87,19 @@ const GET_ORDER_STATS_BY_RECIPIENT = `
97
87
  }
98
88
  }
99
89
  `;
90
+ function buildWhereString(filter) {
91
+ const parts = [`recipient: "${filter.recipient}"`];
92
+ if (filter.isActive !== undefined) {
93
+ parts.push(`isActive: ${filter.isActive}`);
94
+ }
95
+ if (filter.createdAtGte !== undefined) {
96
+ parts.push(`createdAt_gte: "${filter.createdAtGte}"`);
97
+ }
98
+ if (filter.createdAtLte !== undefined) {
99
+ parts.push(`createdAt_lte: "${filter.createdAtLte}"`);
100
+ }
101
+ return `{ ${parts.join(', ')} }`;
102
+ }
100
103
  export class SubgraphClient {
101
104
  client;
102
105
  constructor(endpoint) {
@@ -106,10 +109,40 @@ export class SubgraphClient {
106
109
  const data = await this.client.request(GET_ORDER_BY_ID, { orderID: orderId });
107
110
  return data.perpsOrder;
108
111
  }
109
- async queryOrdersByRecipient(recipient, first = 20, skip = 0) {
110
- const data = await this.client.request(GET_ORDERS_BY_RECIPIENT, { recipient, first, skip });
112
+ async queryOrders(filter, first = 20, skip = 0) {
113
+ const where = buildWhereString(filter);
114
+ const query = `
115
+ query {
116
+ perpsOrders(
117
+ where: ${where}
118
+ first: ${first}
119
+ skip: ${skip}
120
+ orderBy: createdAt
121
+ orderDirection: desc
122
+ ) {
123
+ ${ORDER_FIELDS}
124
+ }
125
+ }
126
+ `;
127
+ const data = await this.client.request(query);
111
128
  return data.perpsOrders;
112
129
  }
130
+ async countOrders(filter) {
131
+ const where = buildWhereString(filter);
132
+ const query = `
133
+ query {
134
+ perpsOrders(
135
+ where: ${where}
136
+ first: 1000
137
+ skip: 0
138
+ ) {
139
+ id
140
+ }
141
+ }
142
+ `;
143
+ const data = await this.client.request(query);
144
+ return data.perpsOrders.length;
145
+ }
113
146
  async queryOrderStats(recipient) {
114
147
  const data = await this.client.request(GET_ORDER_STATS_BY_RECIPIENT, { recipient });
115
148
  const total = data.total.length;
@@ -1 +1 @@
1
- {"version":3,"file":"subgraph-client.js","sourceRoot":"","sources":["../../../src/services/subgraph-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AA4ChD,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCvB,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8C/B,CAAC;AAEF,MAAM,4BAA4B,GAAG;;;;;;;;;CASpC,CAAC;AAQF,MAAM,OAAO,cAAc;IACjB,MAAM,CAAgB;IAE9B,YAAY,QAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACpC,eAAe,EACf,EAAE,OAAO,EAAE,OAAO,EAAE,CACrB,CAAC;QACF,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,SAAiB,EACjB,QAAgB,EAAE,EAClB,OAAe,CAAC;QAEhB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACpC,uBAAuB,EACvB,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAC3B,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAGnC,4BAA4B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IACnD,CAAC;CACF"}
1
+ {"version":3,"file":"subgraph-client.js","sourceRoot":"","sources":["../../../src/services/subgraph-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAmDhD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCpB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCvB,CAAC;AAEF,MAAM,4BAA4B,GAAG;;;;;;;;;CASpC,CAAC;AAQF,SAAS,gBAAgB,CAAC,MAAwB;IAChD,MAAM,KAAK,GAAa,CAAC,eAAe,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,OAAO,cAAc;IACjB,MAAM,CAAgB;IAE9B,YAAY,QAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACpC,eAAe,EACf,EAAE,OAAO,EAAE,OAAO,EAAE,CACrB,CAAC;QACF,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAwB,EACxB,QAAgB,EAAE,EAClB,OAAe,CAAC;QAEhB,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG;;;mBAGC,KAAK;mBACL,KAAK;kBACN,IAAI;;;;YAIV,YAAY;;;KAGnB,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAmC,KAAK,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAwB;QACxC,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG;;;mBAGC,KAAK;;;;;;;KAOnB,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAyC,KAAK,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAGnC,4BAA4B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IACnD,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaspervault_cli",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "JasperVault CLI for interacting with the JasperVault Manager API",
5
5
  "type": "module",
6
6
  "bin": {