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.
- package/README.md +138 -0
- package/config/chains.json +104 -0
- package/dist/bin/jv.d.ts +2 -0
- package/dist/bin/jv.js +29 -0
- package/dist/bin/jv.js.map +1 -0
- package/dist/src/client.d.ts +18 -0
- package/dist/src/client.js +128 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/commands/connect.d.ts +22 -0
- package/dist/src/commands/connect.js +128 -0
- package/dist/src/commands/connect.js.map +1 -0
- package/dist/src/commands/deposit.d.ts +59 -0
- package/dist/src/commands/deposit.js +261 -0
- package/dist/src/commands/deposit.js.map +1 -0
- package/dist/src/commands/init.d.ts +4 -0
- package/dist/src/commands/init.js +97 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/job.d.ts +2 -0
- package/dist/src/commands/job.js +20 -0
- package/dist/src/commands/job.js.map +1 -0
- package/dist/src/commands/limit-order.d.ts +2 -0
- package/dist/src/commands/limit-order.js +51 -0
- package/dist/src/commands/limit-order.js.map +1 -0
- package/dist/src/commands/order.d.ts +2 -0
- package/dist/src/commands/order.js +110 -0
- package/dist/src/commands/order.js.map +1 -0
- package/dist/src/commands/orders.d.ts +2 -0
- package/dist/src/commands/orders.js +72 -0
- package/dist/src/commands/orders.js.map +1 -0
- package/dist/src/commands/sl.d.ts +2 -0
- package/dist/src/commands/sl.js +67 -0
- package/dist/src/commands/sl.js.map +1 -0
- package/dist/src/commands/tp.d.ts +2 -0
- package/dist/src/commands/tp.js +67 -0
- package/dist/src/commands/tp.js.map +1 -0
- package/dist/src/commands/vault.d.ts +24 -0
- package/dist/src/commands/vault.js +249 -0
- package/dist/src/commands/vault.js.map +1 -0
- package/dist/src/services/chain-config.d.ts +57 -0
- package/dist/src/services/chain-config.js +96 -0
- package/dist/src/services/chain-config.js.map +1 -0
- package/dist/src/services/key-manager.d.ts +23 -0
- package/dist/src/services/key-manager.js +79 -0
- package/dist/src/services/key-manager.js.map +1 -0
- package/dist/src/services/order-signer.d.ts +24 -0
- package/dist/src/services/order-signer.js +162 -0
- package/dist/src/services/order-signer.js.map +1 -0
- package/dist/src/services/price-service.d.ts +14 -0
- package/dist/src/services/price-service.js +47 -0
- package/dist/src/services/price-service.js.map +1 -0
- package/dist/src/services/subgraph-client.d.ts +53 -0
- package/dist/src/services/subgraph-client.js +120 -0
- package/dist/src/services/subgraph-client.js.map +1 -0
- package/dist/src/services/vault-profile.d.ts +15 -0
- package/dist/src/services/vault-profile.js +56 -0
- package/dist/src/services/vault-profile.js.map +1 -0
- package/dist/src/templates/skill-body.d.ts +11 -0
- package/dist/src/templates/skill-body.js +233 -0
- package/dist/src/templates/skill-body.js.map +1 -0
- package/dist/src/types.d.ts +212 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/config.d.ts +7 -0
- package/dist/src/utils/config.js +14 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/endpoints.d.ts +8 -0
- package/dist/src/utils/endpoints.js +13 -0
- package/dist/src/utils/endpoints.js.map +1 -0
- package/dist/src/utils/output.d.ts +14 -0
- package/dist/src/utils/output.js +50 -0
- package/dist/src/utils/output.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { printJson, exitWithError, EXIT_CODES } from '../utils/output.js';
|
|
2
|
+
import { getNetworkConfig } from '../services/chain-config.js';
|
|
3
|
+
import { loadVaultProfile } from '../services/vault-profile.js';
|
|
4
|
+
import { SubgraphClient } from '../services/subgraph-client.js';
|
|
5
|
+
function getSubgraphClient(network) {
|
|
6
|
+
const net = getNetworkConfig(network);
|
|
7
|
+
const subgraphUrl = process.env.JV_SUBGRAPH_URL ?? net.subgraphUrl;
|
|
8
|
+
if (!subgraphUrl) {
|
|
9
|
+
exitWithError(`No subgraphUrl configured for network ${network}. Set JV_SUBGRAPH_URL or add subgraphUrl to chains.json.`, EXIT_CODES.CONFIG_ERROR);
|
|
10
|
+
}
|
|
11
|
+
return new SubgraphClient(subgraphUrl);
|
|
12
|
+
}
|
|
13
|
+
export function registerOrdersCommand(program) {
|
|
14
|
+
const orders = program
|
|
15
|
+
.command('orders')
|
|
16
|
+
.description('Query positions / orders');
|
|
17
|
+
orders
|
|
18
|
+
.command('list')
|
|
19
|
+
.description('List orders for your position vault (Subgraph)')
|
|
20
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
21
|
+
.option('--page <number>', 'Page number (1-based)', '1')
|
|
22
|
+
.option('--limit <number>', 'Items per page', '20')
|
|
23
|
+
.option('--position-side <side>', 'Filter by position side (LONG / SHORT)')
|
|
24
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
const profile = loadVaultProfile(opts.network);
|
|
27
|
+
if (!profile) {
|
|
28
|
+
exitWithError(`No vault profile for network ${opts.network}. Run "jv vault init --network ${opts.network}" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
29
|
+
}
|
|
30
|
+
const limit = parseInt(opts.limit ?? '20', 10);
|
|
31
|
+
const page = parseInt(opts.page ?? '1', 10);
|
|
32
|
+
const skip = (page - 1) * limit;
|
|
33
|
+
const recipient = profile.vaults?.[0]?.address ?? profile.marginAccount ?? '';
|
|
34
|
+
const client = getSubgraphClient(opts.network);
|
|
35
|
+
let orders = await client.queryOrdersByRecipient(recipient, limit, skip);
|
|
36
|
+
if (opts.positionSide) {
|
|
37
|
+
const side = opts.positionSide.toUpperCase();
|
|
38
|
+
orders = orders.filter((o) => o.positionSide === side);
|
|
39
|
+
}
|
|
40
|
+
printJson({ orders, total: orders.length, page, limit }, opts.pretty);
|
|
41
|
+
});
|
|
42
|
+
orders
|
|
43
|
+
.command('get')
|
|
44
|
+
.description('Get a single order by ID (Subgraph)')
|
|
45
|
+
.argument('<orderId>', 'Order ID')
|
|
46
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
47
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
48
|
+
.action(async (orderId, opts) => {
|
|
49
|
+
const client = getSubgraphClient(opts.network);
|
|
50
|
+
const order = await client.queryOrderById(orderId);
|
|
51
|
+
if (!order) {
|
|
52
|
+
exitWithError(`Order ${orderId} not found in Subgraph.`, EXIT_CODES.BUSINESS_ERROR);
|
|
53
|
+
}
|
|
54
|
+
printJson(order, opts.pretty);
|
|
55
|
+
});
|
|
56
|
+
orders
|
|
57
|
+
.command('stats')
|
|
58
|
+
.description('Get order statistics for your position vault (Subgraph)')
|
|
59
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
60
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
61
|
+
.action(async (opts) => {
|
|
62
|
+
const profile = loadVaultProfile(opts.network);
|
|
63
|
+
if (!profile) {
|
|
64
|
+
exitWithError(`No vault profile for network ${opts.network}. Run "jv vault init --network ${opts.network}" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
65
|
+
}
|
|
66
|
+
const recipient = profile.vaults?.[0]?.address ?? profile.marginAccount ?? '';
|
|
67
|
+
const client = getSubgraphClient(opts.network);
|
|
68
|
+
const stats = await client.queryOrderStats(recipient);
|
|
69
|
+
printJson(stats, opts.pretty);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=orders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/commands/orders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { 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 } 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
|
+
export function registerSlCommand(program) {
|
|
11
|
+
const sl = program.command('sl').description('Stop-loss order management');
|
|
12
|
+
sl
|
|
13
|
+
.command('set')
|
|
14
|
+
.description('Set a stop-loss order for an existing position (POST /order/perps)')
|
|
15
|
+
.requiredOption('--order-id <id>', 'Existing order ID (position to close)')
|
|
16
|
+
.requiredOption('--price <usdc>', 'Target price in USDC')
|
|
17
|
+
.requiredOption('--symbol <symbol>', 'Asset symbol (e.g. JBTC)')
|
|
18
|
+
.option('--side <long|short>', 'Position side being closed', 'long')
|
|
19
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
20
|
+
.option('--ttl <seconds>', 'Order TTL in seconds', '86400')
|
|
21
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
const delegation = loadDelegationKey();
|
|
24
|
+
if (!delegation) {
|
|
25
|
+
exitWithError('Delegation key not found. Run "jv vault init" first or set JV_DELEGATION_KEY.', EXIT_CODES.CONFIG_ERROR);
|
|
26
|
+
}
|
|
27
|
+
const profile = loadVaultProfile(opts.network);
|
|
28
|
+
if (!profile) {
|
|
29
|
+
exitWithError(`No vault profile for network ${opts.network}. Run "jv vault init --network ${opts.network}" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
30
|
+
}
|
|
31
|
+
const side = opts.side.toLowerCase();
|
|
32
|
+
if (side !== 'long' && side !== 'short') {
|
|
33
|
+
exitWithError('--side must be long or short', EXIT_CODES.CONFIG_ERROR);
|
|
34
|
+
}
|
|
35
|
+
const holder = getPositionAccountFromProfile(profile, side);
|
|
36
|
+
if (!holder) {
|
|
37
|
+
exitWithError(`No ${side} position vault in profile. Run "jv vault init" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
38
|
+
}
|
|
39
|
+
const intent = {
|
|
40
|
+
orderID: parseInt(opts.orderId, 10),
|
|
41
|
+
price: opts.price,
|
|
42
|
+
symbol: opts.symbol,
|
|
43
|
+
side,
|
|
44
|
+
network: opts.network,
|
|
45
|
+
ttlSeconds: parseInt(opts.ttl, 10),
|
|
46
|
+
};
|
|
47
|
+
const net = getNetworkConfig(opts.network);
|
|
48
|
+
const provider = new JsonRpcProvider(net.rpcUrl);
|
|
49
|
+
const optionModuleV2 = net.contracts.optionModuleV2 ?? net.contracts.diamond;
|
|
50
|
+
const signData = await buildSignData(intent, profile, opts.network);
|
|
51
|
+
const writerIndices = await fetchWriterIndices(signData.writer, signData.orderType, signData.underlyingAsset, provider, optionModuleV2);
|
|
52
|
+
const delegationWallet = new Wallet(delegation.delegationPrivateKey);
|
|
53
|
+
const signature = await signSignData(signData, delegationWallet);
|
|
54
|
+
const managedOrder = buildManagedOrder(signData, writerIndices, holder, '0');
|
|
55
|
+
const body = {
|
|
56
|
+
signData,
|
|
57
|
+
signature,
|
|
58
|
+
managedOrder,
|
|
59
|
+
ppoSettings: { optionExpireTime: '0' },
|
|
60
|
+
};
|
|
61
|
+
const config = loadConfig();
|
|
62
|
+
const client = new ApiClient(config);
|
|
63
|
+
const res = await client.post(ENDPOINTS.ORDER_CREATE, body);
|
|
64
|
+
printJson(res.data, opts.pretty);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=sl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sl.js","sourceRoot":"","sources":["../../../src/commands/sl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { 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 } 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
|
+
export function registerTpCommand(program) {
|
|
11
|
+
const tp = program.command('tp').description('Take-profit order management');
|
|
12
|
+
tp
|
|
13
|
+
.command('set')
|
|
14
|
+
.description('Set a take-profit order for an existing position (POST /order/perps)')
|
|
15
|
+
.requiredOption('--order-id <id>', 'Existing order ID (position to close)')
|
|
16
|
+
.requiredOption('--price <usdc>', 'Target price in USDC')
|
|
17
|
+
.requiredOption('--symbol <symbol>', 'Asset symbol (e.g. JBTC)')
|
|
18
|
+
.option('--side <long|short>', 'Position side being closed', 'long')
|
|
19
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
20
|
+
.option('--ttl <seconds>', 'Order TTL in seconds', '86400')
|
|
21
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
const delegation = loadDelegationKey();
|
|
24
|
+
if (!delegation) {
|
|
25
|
+
exitWithError('Delegation key not found. Run "jv vault init" first or set JV_DELEGATION_KEY.', EXIT_CODES.CONFIG_ERROR);
|
|
26
|
+
}
|
|
27
|
+
const profile = loadVaultProfile(opts.network);
|
|
28
|
+
if (!profile) {
|
|
29
|
+
exitWithError(`No vault profile for network ${opts.network}. Run "jv vault init --network ${opts.network}" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
30
|
+
}
|
|
31
|
+
const side = opts.side.toLowerCase();
|
|
32
|
+
if (side !== 'long' && side !== 'short') {
|
|
33
|
+
exitWithError('--side must be long or short', EXIT_CODES.CONFIG_ERROR);
|
|
34
|
+
}
|
|
35
|
+
const holder = getPositionAccountFromProfile(profile, side);
|
|
36
|
+
if (!holder) {
|
|
37
|
+
exitWithError(`No ${side} position vault in profile. Run "jv vault init" first.`, EXIT_CODES.CONFIG_ERROR);
|
|
38
|
+
}
|
|
39
|
+
const intent = {
|
|
40
|
+
orderID: parseInt(opts.orderId, 10),
|
|
41
|
+
price: opts.price,
|
|
42
|
+
symbol: opts.symbol,
|
|
43
|
+
side,
|
|
44
|
+
network: opts.network,
|
|
45
|
+
ttlSeconds: parseInt(opts.ttl, 10),
|
|
46
|
+
};
|
|
47
|
+
const net = getNetworkConfig(opts.network);
|
|
48
|
+
const provider = new JsonRpcProvider(net.rpcUrl);
|
|
49
|
+
const optionModuleV2 = net.contracts.optionModuleV2 ?? net.contracts.diamond;
|
|
50
|
+
const signData = await buildSignData(intent, profile, opts.network);
|
|
51
|
+
const writerIndices = await fetchWriterIndices(signData.writer, signData.orderType, signData.underlyingAsset, provider, optionModuleV2);
|
|
52
|
+
const delegationWallet = new Wallet(delegation.delegationPrivateKey);
|
|
53
|
+
const signature = await signSignData(signData, delegationWallet);
|
|
54
|
+
const managedOrder = buildManagedOrder(signData, writerIndices, holder, '0');
|
|
55
|
+
const body = {
|
|
56
|
+
signData,
|
|
57
|
+
signature,
|
|
58
|
+
managedOrder,
|
|
59
|
+
ppoSettings: { optionExpireTime: '0' },
|
|
60
|
+
};
|
|
61
|
+
const config = loadConfig();
|
|
62
|
+
const client = new ApiClient(config);
|
|
63
|
+
const res = await client.post(ENDPOINTS.ORDER_CREATE, body);
|
|
64
|
+
printJson(res.data, opts.pretty);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=tp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tp.js","sourceRoot":"","sources":["../../../src/commands/tp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { ethers } from 'ethers';
|
|
3
|
+
export interface DelegationSignData {
|
|
4
|
+
domain: {
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
chainId: number;
|
|
8
|
+
verifyingContract: string;
|
|
9
|
+
};
|
|
10
|
+
types: Record<string, Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
}>>;
|
|
14
|
+
message: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build EIP-712 delegation sign data (domain, types, message) without signing.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildDelegationSignData(walletAddress: string, signerAddress: string, currentNonce: number, chainId: number, diamondAddress: string): DelegationSignData;
|
|
20
|
+
/**
|
|
21
|
+
* Sign delegation data with user wallet.
|
|
22
|
+
*/
|
|
23
|
+
export declare function signDelegationData(wallet: ethers.Wallet, signData: DelegationSignData): Promise<string>;
|
|
24
|
+
export declare function registerVaultCommand(program: Command): void;
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { ethers } from 'ethers';
|
|
3
|
+
import { loadConfig } from '../utils/config.js';
|
|
4
|
+
import { ENDPOINTS } from '../utils/endpoints.js';
|
|
5
|
+
import { ApiClient } from '../client.js';
|
|
6
|
+
import { printJson, exitWithError, EXIT_CODES } from '../utils/output.js';
|
|
7
|
+
import { getNetworkConfig } from '../services/chain-config.js';
|
|
8
|
+
import { loadOrGenerateDelegationKey, saveDelegationKey } from '../services/key-manager.js';
|
|
9
|
+
import { saveVaultProfile } from '../services/vault-profile.js';
|
|
10
|
+
import { initWcAndConnect } from './connect.js';
|
|
11
|
+
function getJvDir() {
|
|
12
|
+
return join(process.env.HOME || process.env.USERPROFILE || '', '.jaspervault');
|
|
13
|
+
}
|
|
14
|
+
const PERPS_OPTION_MODULE_ABI = [
|
|
15
|
+
'function getUserDelegationWhiteListNonce(address wallet) view returns (uint256)',
|
|
16
|
+
];
|
|
17
|
+
const VAULT_FACTORY_ABI = [
|
|
18
|
+
'function getVaultMaxSaltAddress(address wallet) view returns (address, uint256)',
|
|
19
|
+
'function getAddress(address wallet, uint256 salt) view returns (address)',
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Build EIP-712 delegation sign data (domain, types, message) without signing.
|
|
23
|
+
*/
|
|
24
|
+
export function buildDelegationSignData(walletAddress, signerAddress, currentNonce, chainId, diamondAddress) {
|
|
25
|
+
const now = Math.floor(Date.now() / 1000);
|
|
26
|
+
const DELEGATION_DEADLINE_SECONDS = 7 * 24 * 60 * 60; // 1 week
|
|
27
|
+
const deadline = now + DELEGATION_DEADLINE_SECONDS;
|
|
28
|
+
const domain = {
|
|
29
|
+
name: 'jasperVault',
|
|
30
|
+
version: '1.0',
|
|
31
|
+
chainId,
|
|
32
|
+
verifyingContract: diamondAddress,
|
|
33
|
+
};
|
|
34
|
+
const types = {
|
|
35
|
+
SignerWhiteListData: [
|
|
36
|
+
{ name: 'wallet', type: 'address' },
|
|
37
|
+
{ name: 'signer', type: 'address' },
|
|
38
|
+
{ name: 'isWhiteList', type: 'bool' },
|
|
39
|
+
{ name: 'nonce', type: 'uint256' },
|
|
40
|
+
{ name: 'deadline', type: 'uint256' },
|
|
41
|
+
{ name: 'name', type: 'string' },
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
const message = {
|
|
45
|
+
wallet: walletAddress,
|
|
46
|
+
signer: signerAddress,
|
|
47
|
+
isWhiteList: true,
|
|
48
|
+
nonce: String(currentNonce + 1),
|
|
49
|
+
deadline: String(deadline),
|
|
50
|
+
name: 'jasperVaultDelegateDemo',
|
|
51
|
+
};
|
|
52
|
+
return { domain, types, message };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Sign delegation data with user wallet.
|
|
56
|
+
*/
|
|
57
|
+
export async function signDelegationData(wallet, signData) {
|
|
58
|
+
return wallet.signTypedData(signData.domain, signData.types, signData.message);
|
|
59
|
+
}
|
|
60
|
+
function generateDelegationSignature(userWallet, signerAddress, currentNonce, chainId, diamondAddress) {
|
|
61
|
+
const signData = buildDelegationSignData(userWallet.address, signerAddress, currentNonce, chainId, diamondAddress);
|
|
62
|
+
return signDelegationData(userWallet, signData).then((signature) => ({
|
|
63
|
+
message: signData.message,
|
|
64
|
+
signature,
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
async function generateVaultSignatures(userAddress, signerWallet, vaultTypes, vaultFactoryAddress, provider) {
|
|
68
|
+
const signerAddress = signerWallet.address;
|
|
69
|
+
const vaultFactory = new ethers.Contract(vaultFactoryAddress, VAULT_FACTORY_ABI, provider);
|
|
70
|
+
const [, maxSalt] = (await vaultFactory.getVaultMaxSaltAddress(userAddress));
|
|
71
|
+
const expire = Math.floor(Date.now() / 1000) + 600;
|
|
72
|
+
const createVaultSignType = `tuple(address wallet, address delegationAddr, uint256 salt, uint256 expire, uint256 vaultType)`;
|
|
73
|
+
const createVaultSignData = [];
|
|
74
|
+
const signatureList = [];
|
|
75
|
+
for (let i = 0; i < vaultTypes.length; i++) {
|
|
76
|
+
const values = {
|
|
77
|
+
wallet: userAddress,
|
|
78
|
+
delegationAddr: signerAddress,
|
|
79
|
+
salt: (BigInt(maxSalt) + BigInt(i)).toString(),
|
|
80
|
+
expire: expire.toString(),
|
|
81
|
+
vaultType: vaultTypes[i],
|
|
82
|
+
};
|
|
83
|
+
const encodedData = ethers.AbiCoder.defaultAbiCoder().encode([createVaultSignType], [values]);
|
|
84
|
+
const messageHash = ethers.keccak256(encodedData);
|
|
85
|
+
const signature = await signerWallet.signMessage(ethers.getBytes(messageHash));
|
|
86
|
+
createVaultSignData.push(values);
|
|
87
|
+
signatureList.push(signature);
|
|
88
|
+
}
|
|
89
|
+
return { createVaultSignData, signatureList };
|
|
90
|
+
}
|
|
91
|
+
export function registerVaultCommand(program) {
|
|
92
|
+
const vault = program
|
|
93
|
+
.command('vault')
|
|
94
|
+
.description('Vault initialization (enable trading)');
|
|
95
|
+
vault
|
|
96
|
+
.command('init')
|
|
97
|
+
.description('Initialize AA account with delegation and vault creation (POST /order/createVaultRequest)')
|
|
98
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
99
|
+
.option('--vault-types <types>', 'Comma-separated vault types', '33,37')
|
|
100
|
+
.option('--vault-index <n>', 'Vault index for address computation', '1')
|
|
101
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
102
|
+
.action(async (opts) => {
|
|
103
|
+
const privateKey = process.env.PRIVATE_KEY;
|
|
104
|
+
if (!privateKey) {
|
|
105
|
+
exitWithError('PRIVATE_KEY environment variable is not set. Set it to your EOA wallet private key.', EXIT_CODES.CONFIG_ERROR);
|
|
106
|
+
}
|
|
107
|
+
const config = loadConfig();
|
|
108
|
+
const net = getNetworkConfig(opts.network);
|
|
109
|
+
const { privateKey: delegationKey, address: delegationAddress, wasGenerated } = loadOrGenerateDelegationKey(opts.network);
|
|
110
|
+
const userWallet = new ethers.Wallet(privateKey);
|
|
111
|
+
const delegationWallet = new ethers.Wallet(delegationKey);
|
|
112
|
+
const provider = new ethers.JsonRpcProvider(net.rpcUrl);
|
|
113
|
+
const nonceContract = new ethers.Contract(net.contracts.perpsOptionModuleHandle, PERPS_OPTION_MODULE_ABI, provider);
|
|
114
|
+
const currentNonce = Number(await nonceContract.getUserDelegationWhiteListNonce(userWallet.address));
|
|
115
|
+
const vaultTypes = opts.vaultTypes.split(',').map((s) => parseInt(s.trim(), 10));
|
|
116
|
+
const { createVaultSignData, signatureList } = await generateVaultSignatures(userWallet.address, delegationWallet, vaultTypes, net.contracts.vaultFactory, provider);
|
|
117
|
+
const delegationSignature = await generateDelegationSignature(userWallet, delegationAddress, currentNonce, net.chainId, net.contracts.diamond);
|
|
118
|
+
const body = {
|
|
119
|
+
chainId: String(net.chainId),
|
|
120
|
+
delegationSignature,
|
|
121
|
+
vaultSignatures: { createVaultSignData, signatureList },
|
|
122
|
+
};
|
|
123
|
+
const apiClient = new ApiClient(config);
|
|
124
|
+
const res = await apiClient.post(ENDPOINTS.VAULT_INIT, body);
|
|
125
|
+
if (res.data.success) {
|
|
126
|
+
if (wasGenerated) {
|
|
127
|
+
saveDelegationKey(delegationKey, delegationAddress, opts.network);
|
|
128
|
+
}
|
|
129
|
+
const vaultFactory = new ethers.Contract(net.contracts.vaultFactory, VAULT_FACTORY_ABI, provider);
|
|
130
|
+
const getAddr = vaultFactory.getFunction('getAddress');
|
|
131
|
+
const marginAccount = await getAddr(userWallet.address, 1);
|
|
132
|
+
const vaultEntries = await Promise.all(vaultTypes.map(async (type) => {
|
|
133
|
+
const address = await getAddr(userWallet.address, type);
|
|
134
|
+
return { type, address };
|
|
135
|
+
}));
|
|
136
|
+
saveVaultProfile({
|
|
137
|
+
eoa: userWallet.address,
|
|
138
|
+
delegationAddress,
|
|
139
|
+
network: opts.network,
|
|
140
|
+
vaults: vaultEntries,
|
|
141
|
+
marginAccount,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
printJson(res.data, opts.pretty);
|
|
145
|
+
});
|
|
146
|
+
vault
|
|
147
|
+
.command('init-wc')
|
|
148
|
+
.description('Initialize vault via WalletConnect — scan QR, sign on phone, done (no PRIVATE_KEY)')
|
|
149
|
+
.option('--network <name>', 'Network name', 'jaspervault')
|
|
150
|
+
.option('--vault-types <types>', 'Comma-separated vault types', '33,37')
|
|
151
|
+
.option('--timeout <seconds>', 'WalletConnect timeout in seconds', '120')
|
|
152
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
153
|
+
.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, qrCodePath) => {
|
|
160
|
+
printJson({
|
|
161
|
+
status: 'awaiting_connection',
|
|
162
|
+
uri,
|
|
163
|
+
qrCodePath,
|
|
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();
|
|
175
|
+
const net = getNetworkConfig(opts.network);
|
|
176
|
+
const { privateKey: delegationKey, address: delegationAddress, wasGenerated } = loadOrGenerateDelegationKey(opts.network);
|
|
177
|
+
const delegationWallet = new ethers.Wallet(delegationKey);
|
|
178
|
+
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,
|
|
186
|
+
types: {
|
|
187
|
+
EIP712Domain: [
|
|
188
|
+
{ name: 'name', type: 'string' },
|
|
189
|
+
{ name: 'version', type: 'string' },
|
|
190
|
+
{ name: 'chainId', type: 'uint256' },
|
|
191
|
+
{ name: 'verifyingContract', type: 'address' },
|
|
192
|
+
],
|
|
193
|
+
...signData.types,
|
|
194
|
+
},
|
|
195
|
+
primaryType: 'SignerWhiteListData',
|
|
196
|
+
message: signData.message,
|
|
197
|
+
};
|
|
198
|
+
let delegationSignature;
|
|
199
|
+
try {
|
|
200
|
+
delegationSignature = (await client.request({
|
|
201
|
+
topic: session.topic,
|
|
202
|
+
chainId: 'eip155:8453',
|
|
203
|
+
request: {
|
|
204
|
+
method: 'eth_signTypedData_v4',
|
|
205
|
+
params: [walletAddress, JSON.stringify(typedData)],
|
|
206
|
+
},
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
printJson({ success: false, message: `Signature rejected or failed: ${err.message}` }, opts.pretty);
|
|
211
|
+
process.exit(EXIT_CODES.BUSINESS_ERROR);
|
|
212
|
+
}
|
|
213
|
+
const config = loadConfig();
|
|
214
|
+
const apiClient = new ApiClient(config);
|
|
215
|
+
const body = {
|
|
216
|
+
chainId: String(net.chainId),
|
|
217
|
+
delegationSignature: {
|
|
218
|
+
message: signData.message,
|
|
219
|
+
signature: delegationSignature,
|
|
220
|
+
},
|
|
221
|
+
vaultSignatures: { createVaultSignData, signatureList },
|
|
222
|
+
};
|
|
223
|
+
const res = await apiClient.post(ENDPOINTS.VAULT_INIT, body);
|
|
224
|
+
if (!res.data.success) {
|
|
225
|
+
printJson(res.data, opts.pretty);
|
|
226
|
+
process.exit(EXIT_CODES.BUSINESS_ERROR);
|
|
227
|
+
}
|
|
228
|
+
if (wasGenerated) {
|
|
229
|
+
saveDelegationKey(delegationKey, delegationAddress, opts.network);
|
|
230
|
+
}
|
|
231
|
+
const vaultFactory = new ethers.Contract(net.contracts.vaultFactory, VAULT_FACTORY_ABI, provider);
|
|
232
|
+
const getAddr = vaultFactory.getFunction('getAddress');
|
|
233
|
+
const marginAccount = (await getAddr(walletAddress, 1));
|
|
234
|
+
const vaultEntries = await Promise.all(vaultTypes.map(async (type) => {
|
|
235
|
+
const address = (await getAddr(walletAddress, type));
|
|
236
|
+
return { type, address };
|
|
237
|
+
}));
|
|
238
|
+
saveVaultProfile({
|
|
239
|
+
eoa: walletAddress,
|
|
240
|
+
delegationAddress,
|
|
241
|
+
network: opts.network,
|
|
242
|
+
vaults: vaultEntries,
|
|
243
|
+
marginAccount,
|
|
244
|
+
});
|
|
245
|
+
printJson(res.data, opts.pretty);
|
|
246
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/commands/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { NetworkTokenConfig, WriterConfig, MarginAssetConfig } from '../types.js';
|
|
2
|
+
export interface NetworkContracts {
|
|
3
|
+
diamond: string;
|
|
4
|
+
vaultFactory: string;
|
|
5
|
+
perpsOptionModuleHandle: string;
|
|
6
|
+
optionModuleV2?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NetworkConfig {
|
|
9
|
+
name: string;
|
|
10
|
+
chainId: number;
|
|
11
|
+
rpcUrl: string;
|
|
12
|
+
contracts: NetworkContracts;
|
|
13
|
+
tokens?: Record<string, NetworkTokenConfig>;
|
|
14
|
+
marginAsset?: MarginAssetConfig;
|
|
15
|
+
writers?: Record<string, WriterConfig>;
|
|
16
|
+
defaultLeverage?: number;
|
|
17
|
+
quoteCenterUrl?: string;
|
|
18
|
+
subgraphUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface WarpTokenConfig {
|
|
21
|
+
symbol: string;
|
|
22
|
+
decimals: number;
|
|
23
|
+
base: {
|
|
24
|
+
underlyingToken: string;
|
|
25
|
+
warpRouter: string;
|
|
26
|
+
};
|
|
27
|
+
jaspervault: {
|
|
28
|
+
domain: number;
|
|
29
|
+
warpRouter: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get network configuration, with RPC URL override via env vars.
|
|
34
|
+
* JV_BASE_RPC_URL for base_uat, JV_JASPERVAULT_RPC_URL for jaspervault.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getNetworkConfig(network: string): NetworkConfig;
|
|
37
|
+
/**
|
|
38
|
+
* Get token config for a symbol within a network.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getTokenConfig(network: string, symbol: string): NetworkTokenConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Get writer address for a symbol and side within a network.
|
|
43
|
+
*/
|
|
44
|
+
export declare function getWriterAddress(network: string, symbol: string, side: 'long' | 'short'): string;
|
|
45
|
+
/**
|
|
46
|
+
* Get Warp Route token configuration.
|
|
47
|
+
* Token: jbtc | jusdc | cbbtc | usdc
|
|
48
|
+
*/
|
|
49
|
+
export declare function getWarpConfig(token: string): WarpTokenConfig;
|
|
50
|
+
/**
|
|
51
|
+
* Get Base chain RPC URL for deposit (source chain).
|
|
52
|
+
*/
|
|
53
|
+
export declare function getBaseRpcUrl(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Get JasperVault chain RPC URL for deposit (destination chain, vault address computation).
|
|
56
|
+
*/
|
|
57
|
+
export declare function getJaspervaultRpcUrl(): string;
|