@megatao/sdk 1.1.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/.env.example +37 -0
- package/CHANGELOG.md +19 -0
- package/README.md +199 -0
- package/bin/alf +4 -0
- package/cli/README.md +198 -0
- package/cli/TEST_MANUAL.md +577 -0
- package/cli/commands/account.ts +545 -0
- package/cli/commands/funding.ts +481 -0
- package/cli/commands/liquidation.ts +523 -0
- package/cli/commands/market.ts +590 -0
- package/cli/commands/orders.ts +395 -0
- package/cli/commands/position.ts +1085 -0
- package/cli/commands/shared/positionUtils.ts +239 -0
- package/cli/commands/trading.ts +483 -0
- package/cli/commands/utils.ts +281 -0
- package/cli/commands/vault.ts +522 -0
- package/cli/index.ts +169 -0
- package/cli/interactive.ts +530 -0
- package/cli/utils/client.ts +457 -0
- package/cli/utils/config.ts +226 -0
- package/cli/utils/display.ts +258 -0
- package/cli/utils/index.ts +10 -0
- package/cli/utils/prompts.ts +364 -0
- package/config.example.json +23 -0
- package/dist/AlphaFuturesClient.d.ts +36 -0
- package/dist/AlphaFuturesClient.d.ts.map +1 -0
- package/dist/AlphaFuturesClient.js +116 -0
- package/dist/AlphaFuturesClient.js.map +1 -0
- package/dist/abi/Alpha.json +5987 -0
- package/dist/abi/abis.d.ts +319 -0
- package/dist/abi/abis.d.ts.map +1 -0
- package/dist/abi/abis.js +128 -0
- package/dist/abi/abis.js.map +1 -0
- package/dist/abi/index.d.ts +11 -0
- package/dist/abi/index.d.ts.map +1 -0
- package/dist/abi/index.js +15 -0
- package/dist/abi/index.js.map +1 -0
- package/dist/config/contracts.config.d.ts +70 -0
- package/dist/config/contracts.config.d.ts.map +1 -0
- package/dist/config/contracts.config.js +137 -0
- package/dist/config/contracts.config.js.map +1 -0
- package/dist/config/environments/alpha.config.d.ts +17 -0
- package/dist/config/environments/alpha.config.d.ts.map +1 -0
- package/dist/config/environments/alpha.config.js +140 -0
- package/dist/config/environments/alpha.config.js.map +1 -0
- package/dist/config/environments/beta.config.d.ts +16 -0
- package/dist/config/environments/beta.config.d.ts.map +1 -0
- package/dist/config/environments/beta.config.js +131 -0
- package/dist/config/environments/beta.config.js.map +1 -0
- package/dist/config/environments/dev.config.d.ts +13 -0
- package/dist/config/environments/dev.config.d.ts.map +1 -0
- package/dist/config/environments/dev.config.js +123 -0
- package/dist/config/environments/dev.config.js.map +1 -0
- package/dist/config/environments/index.d.ts +48 -0
- package/dist/config/environments/index.d.ts.map +1 -0
- package/dist/config/environments/index.js +81 -0
- package/dist/config/environments/index.js.map +1 -0
- package/dist/config/environments/localhost.config.d.ts +16 -0
- package/dist/config/environments/localhost.config.d.ts.map +1 -0
- package/dist/config/environments/localhost.config.js +152 -0
- package/dist/config/environments/localhost.config.js.map +1 -0
- package/dist/config/environments/prod.config.d.ts +20 -0
- package/dist/config/environments/prod.config.d.ts.map +1 -0
- package/dist/config/environments/prod.config.js +143 -0
- package/dist/config/environments/prod.config.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/constants/assets.d.ts +76 -0
- package/dist/constants/assets.d.ts.map +1 -0
- package/dist/constants/assets.js +277 -0
- package/dist/constants/assets.js.map +1 -0
- package/dist/constants/contracts.d.ts +41 -0
- package/dist/constants/contracts.d.ts.map +1 -0
- package/dist/constants/contracts.js +57 -0
- package/dist/constants/contracts.js.map +1 -0
- package/dist/constants/index.d.ts +36 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +75 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/networks.d.ts +32 -0
- package/dist/constants/networks.d.ts.map +1 -0
- package/dist/constants/networks.js +174 -0
- package/dist/constants/networks.js.map +1 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +21 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/viem/AlphaViem.d.ts +518 -0
- package/dist/contracts/viem/AlphaViem.d.ts.map +1 -0
- package/dist/contracts/viem/AlphaViem.js +1287 -0
- package/dist/contracts/viem/AlphaViem.js.map +1 -0
- package/dist/contracts/viem/PriceOracleViem.d.ts +71 -0
- package/dist/contracts/viem/PriceOracleViem.d.ts.map +1 -0
- package/dist/contracts/viem/PriceOracleViem.js +212 -0
- package/dist/contracts/viem/PriceOracleViem.js.map +1 -0
- package/dist/contracts/viem/index.d.ts +9 -0
- package/dist/contracts/viem/index.d.ts.map +1 -0
- package/dist/contracts/viem/index.js +17 -0
- package/dist/contracts/viem/index.js.map +1 -0
- package/dist/errors/index.d.ts +44 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +83 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/types/alpha.d.ts +299 -0
- package/dist/types/alpha.d.ts.map +1 -0
- package/dist/types/alpha.js +6 -0
- package/dist/types/alpha.js.map +1 -0
- package/dist/types/client.d.ts +24 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +13 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/contracts.d.ts +48 -0
- package/dist/types/contracts.d.ts.map +1 -0
- package/dist/types/contracts.js +6 -0
- package/dist/types/contracts.js.map +1 -0
- package/dist/types/funding.d.ts +27 -0
- package/dist/types/funding.d.ts.map +1 -0
- package/dist/types/funding.js +6 -0
- package/dist/types/funding.js.map +1 -0
- package/dist/types/index.d.ts +92 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +47 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/liquidation.d.ts +20 -0
- package/dist/types/liquidation.d.ts.map +1 -0
- package/dist/types/liquidation.js +6 -0
- package/dist/types/liquidation.js.map +1 -0
- package/dist/types/margin.d.ts +29 -0
- package/dist/types/margin.d.ts.map +1 -0
- package/dist/types/margin.js +6 -0
- package/dist/types/margin.js.map +1 -0
- package/dist/types/oracle.d.ts +21 -0
- package/dist/types/oracle.d.ts.map +1 -0
- package/dist/types/oracle.js +6 -0
- package/dist/types/oracle.js.map +1 -0
- package/dist/types/positions.d.ts +43 -0
- package/dist/types/positions.d.ts.map +1 -0
- package/dist/types/positions.js +13 -0
- package/dist/types/positions.js.map +1 -0
- package/dist/utils/calculations.d.ts +84 -0
- package/dist/utils/calculations.d.ts.map +1 -0
- package/dist/utils/calculations.js +155 -0
- package/dist/utils/calculations.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +129 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/events.d.ts +40 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +73 -0
- package/dist/utils/events.js.map +1 -0
- package/dist/utils/format.d.ts +40 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +86 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +26 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/network.d.ts +52 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +192 -0
- package/dist/utils/network.js.map +1 -0
- package/dist/utils/positionCalculations.d.ts +145 -0
- package/dist/utils/positionCalculations.d.ts.map +1 -0
- package/dist/utils/positionCalculations.js +278 -0
- package/dist/utils/positionCalculations.js.map +1 -0
- package/dist/utils/validation.d.ts +28 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +68 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/README.md +40 -0
- package/docs/api/API.md +831 -0
- package/docs/guides/GETTING_STARTED.md +316 -0
- package/docs/guides/TRADING_GUIDE.md +677 -0
- package/docs/integration/INTEGRATION_GUIDE.md +1679 -0
- package/docs/integration/VIEM_INTEGRATION.md +294 -0
- package/docs/reference/CLI_QUICK_REFERENCE.md +197 -0
- package/docs/reference/TROUBLESHOOTING.md +922 -0
- package/package.json +113 -0
- package/src/AlphaFuturesClient.ts +158 -0
- package/src/abi/.gitkeep +1 -0
- package/src/abi/Alpha.json +5987 -0
- package/src/abi/README.md +99 -0
- package/src/abi/abis.ts +131 -0
- package/src/abi/index.ts +13 -0
- package/src/config/contracts.config.ts +186 -0
- package/src/config/environments/alpha.config.ts +139 -0
- package/src/config/environments/beta.config.ts +130 -0
- package/src/config/environments/dev.config.ts +122 -0
- package/src/config/environments/index.ts +87 -0
- package/src/config/environments/localhost.config.ts +153 -0
- package/src/config/environments/prod.config.ts +142 -0
- package/src/config/index.ts +29 -0
- package/src/constants/assets.ts +299 -0
- package/src/constants/contracts.ts +64 -0
- package/src/constants/index.ts +69 -0
- package/src/constants/networks.ts +182 -0
- package/src/contracts/index.ts +5 -0
- package/src/contracts/viem/AlphaViem.ts +1615 -0
- package/src/contracts/viem/PriceOracleViem.ts +272 -0
- package/src/contracts/viem/index.ts +11 -0
- package/src/errors/index.ts +87 -0
- package/src/index.ts +59 -0
- package/src/types/VIEM_TYPES_README.md +70 -0
- package/src/types/alpha.ts +358 -0
- package/src/types/client.ts +27 -0
- package/src/types/contracts.ts +74 -0
- package/src/types/funding.ts +31 -0
- package/src/types/index.ts +108 -0
- package/src/types/liquidation.ts +23 -0
- package/src/types/margin.ts +34 -0
- package/src/types/oracle.ts +24 -0
- package/src/types/positions.ts +48 -0
- package/src/utils/calculations.ts +175 -0
- package/src/utils/errors.ts +147 -0
- package/src/utils/events.ts +98 -0
- package/src/utils/format.ts +84 -0
- package/src/utils/index.ts +10 -0
- package/src/utils/network.ts +212 -0
- package/src/utils/positionCalculations.ts +317 -0
- package/src/utils/validation.ts +76 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Position Utilities
|
|
3
|
+
* Common functions for opening positions used across multiple commands
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { parseEther, formatEther } from 'viem';
|
|
7
|
+
import type { Address, Hash } from 'viem';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import ora from 'ora';
|
|
10
|
+
import { formatUSD, formatTAO, formatPercentage } from '../../../src/utils';
|
|
11
|
+
import { getClient, getMarketAddress } from '../../utils/client';
|
|
12
|
+
import { confirmAction } from '../../utils/prompts';
|
|
13
|
+
import {
|
|
14
|
+
calculatePositionSizeFromCollateral,
|
|
15
|
+
calculateCollateralFromSize,
|
|
16
|
+
leverageToWei,
|
|
17
|
+
} from '../../../src/utils/positionCalculations';
|
|
18
|
+
import type { AlphaViem } from '../../../src';
|
|
19
|
+
|
|
20
|
+
export interface PositionOptions {
|
|
21
|
+
asset: string;
|
|
22
|
+
direction: 'long' | 'short';
|
|
23
|
+
size: string; // USD size
|
|
24
|
+
leverage?: number;
|
|
25
|
+
margin?: string; // TAO margin
|
|
26
|
+
skipConfirmation?: boolean;
|
|
27
|
+
stopLoss?: string;
|
|
28
|
+
takeProfit?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Detect which paradigm to use based on provided options
|
|
33
|
+
*/
|
|
34
|
+
export function detectParadigm(options: {
|
|
35
|
+
size?: string;
|
|
36
|
+
margin?: string;
|
|
37
|
+
collateral?: string;
|
|
38
|
+
leverage?: number;
|
|
39
|
+
}): 'collateral-first' | 'size-first' | 'invalid' {
|
|
40
|
+
const hasCollateral = options.collateral !== undefined;
|
|
41
|
+
const hasSize = options.size !== undefined;
|
|
42
|
+
const hasMargin = options.margin !== undefined;
|
|
43
|
+
|
|
44
|
+
// Check for paradigm mixing (error case)
|
|
45
|
+
if (hasCollateral && (hasSize || hasMargin)) {
|
|
46
|
+
return 'invalid';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Collateral-first: has --collateral
|
|
50
|
+
if (hasCollateral) {
|
|
51
|
+
return 'collateral-first';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Size-first: has --size or --margin
|
|
55
|
+
if (hasSize || hasMargin) {
|
|
56
|
+
return 'size-first';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// No paradigm detected (missing required flags)
|
|
60
|
+
return 'invalid';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Open position using collateral-first paradigm (NEW)
|
|
65
|
+
* @param alpha - AlphaViem instance
|
|
66
|
+
* @param marketAddress - Market address
|
|
67
|
+
* @param isLong - True for long, false for short
|
|
68
|
+
* @param collateralUSD - Collateral amount in USD
|
|
69
|
+
* @param leverage - Leverage multiplier (supports decimals, e.g., 3.5)
|
|
70
|
+
* @param currentPrice - Current token price in USD (as bigint with 18 decimals)
|
|
71
|
+
* @returns Transaction hash
|
|
72
|
+
*/
|
|
73
|
+
export async function openPositionFromCollateral(
|
|
74
|
+
alpha: AlphaViem,
|
|
75
|
+
marketAddress: Address,
|
|
76
|
+
isLong: boolean,
|
|
77
|
+
collateralUSD: number,
|
|
78
|
+
leverage: number,
|
|
79
|
+
currentPrice: bigint,
|
|
80
|
+
): Promise<Hash> {
|
|
81
|
+
// Validate inputs
|
|
82
|
+
if (collateralUSD <= 0) {
|
|
83
|
+
throw new Error('Collateral must be greater than 0');
|
|
84
|
+
}
|
|
85
|
+
if (leverage < 1 || leverage > 30) {
|
|
86
|
+
throw new Error('Leverage must be between 1x and 30x');
|
|
87
|
+
}
|
|
88
|
+
if (currentPrice <= 0n) {
|
|
89
|
+
throw new Error('Invalid token price');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Convert price from bigint (wei) to number (USD)
|
|
93
|
+
const currentPriceUSD = parseFloat(formatEther(currentPrice));
|
|
94
|
+
|
|
95
|
+
// Calculate position size from collateral
|
|
96
|
+
const positionSize = calculatePositionSizeFromCollateral(
|
|
97
|
+
collateralUSD,
|
|
98
|
+
leverage,
|
|
99
|
+
currentPriceUSD,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// Convert leverage to wei
|
|
103
|
+
const leverageWei = leverageToWei(leverage);
|
|
104
|
+
|
|
105
|
+
console.log(`Opening position:`);
|
|
106
|
+
console.log(` Collateral: $${collateralUSD}`);
|
|
107
|
+
console.log(` Leverage: ${leverage}x`);
|
|
108
|
+
console.log(` Position Value: $${(collateralUSD * leverage).toFixed(2)}`);
|
|
109
|
+
console.log(` Position Size: ${formatEther(positionSize)} tokens`);
|
|
110
|
+
console.log(` Entry Price: $${currentPriceUSD}`);
|
|
111
|
+
|
|
112
|
+
// Open position
|
|
113
|
+
return await alpha.openPosition(marketAddress, isLong, positionSize, leverageWei);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Size-First Paradigm (LEGACY - for backward compatibility)
|
|
117
|
+
export async function openPositionCommon(
|
|
118
|
+
options: PositionOptions,
|
|
119
|
+
programOptions: any,
|
|
120
|
+
): Promise<boolean> {
|
|
121
|
+
const spinner = ora('Preparing position...').start();
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
const client = await getClient(programOptions);
|
|
125
|
+
const alpha = client.getAlpha();
|
|
126
|
+
const userAddress = await client.getSignerAddress();
|
|
127
|
+
|
|
128
|
+
// Parse inputs
|
|
129
|
+
const asset = options.asset.toUpperCase();
|
|
130
|
+
const isLong = options.direction === 'long';
|
|
131
|
+
const positionSizeUSD = parseEther(options.size);
|
|
132
|
+
const leverage = options.leverage || 3;
|
|
133
|
+
|
|
134
|
+
// Validate leverage
|
|
135
|
+
if (leverage > 10 || leverage < 1) {
|
|
136
|
+
spinner.fail('Invalid leverage: must be between 1x and 10x');
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Get market data
|
|
141
|
+
const marketAddress = getMarketAddress(asset);
|
|
142
|
+
const currentPrice = await client.oracle.getPrice(marketAddress);
|
|
143
|
+
|
|
144
|
+
// Calculate margin if not provided
|
|
145
|
+
const marginAmount = options.margin
|
|
146
|
+
? parseEther(options.margin)
|
|
147
|
+
: (positionSizeUSD * 100n) / BigInt(Math.floor(leverage * 100));
|
|
148
|
+
|
|
149
|
+
// Check available balance
|
|
150
|
+
const available = await alpha.getAvailableMargin(userAddress);
|
|
151
|
+
if (marginAmount > available) {
|
|
152
|
+
spinner.fail('Insufficient available margin');
|
|
153
|
+
console.log(` Required: ${formatTAO(marginAmount)} TAO`);
|
|
154
|
+
console.log(` Available: ${formatTAO(available)} TAO`);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Get funding rate
|
|
159
|
+
const fundingRate = await alpha.getFundingRate(marketAddress);
|
|
160
|
+
|
|
161
|
+
spinner.stop();
|
|
162
|
+
|
|
163
|
+
// Display position preview
|
|
164
|
+
console.log(chalk.bold('\n📈 Position Preview:'));
|
|
165
|
+
console.log(` Asset: ${chalk.cyan(asset)}`);
|
|
166
|
+
console.log(` Direction: ${isLong ? chalk.green('LONG') : chalk.red('SHORT')}`);
|
|
167
|
+
console.log(` Current Price: ${formatUSD(currentPrice)}`);
|
|
168
|
+
console.log(` Position Size: ${formatUSD(positionSizeUSD)}`);
|
|
169
|
+
console.log(` Margin: ${formatTAO(marginAmount)} TAO`);
|
|
170
|
+
console.log(` Leverage: ${chalk.yellow(leverage + 'x')}`);
|
|
171
|
+
|
|
172
|
+
// Calculate liquidation price (simplified calculation)
|
|
173
|
+
const liquidationBuffer = parseEther('0.2'); // 20% maintenance margin
|
|
174
|
+
const liquidationPrice = isLong
|
|
175
|
+
? currentPrice - (marginAmount * liquidationBuffer) / parseEther('1')
|
|
176
|
+
: currentPrice + (marginAmount * liquidationBuffer) / parseEther('1');
|
|
177
|
+
|
|
178
|
+
console.log(` Liquidation Price: ${formatUSD(liquidationPrice)}`);
|
|
179
|
+
console.log(` Funding Rate: ${formatPercentage(fundingRate)} per 8h`);
|
|
180
|
+
|
|
181
|
+
// Show stop loss and take profit if provided
|
|
182
|
+
if (options.stopLoss) {
|
|
183
|
+
console.log(` Stop Loss: ${formatUSD(parseEther(options.stopLoss))}`);
|
|
184
|
+
}
|
|
185
|
+
if (options.takeProfit) {
|
|
186
|
+
console.log(` Take Profit: ${formatUSD(parseEther(options.takeProfit))}`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Calculate and display fees
|
|
190
|
+
const tradingFee = (positionSizeUSD * 10n) / 10000n; // 0.1% of notional
|
|
191
|
+
console.log(` Trading Fee: ${formatUSD(tradingFee)} (0.1%)`);
|
|
192
|
+
|
|
193
|
+
// Confirm action
|
|
194
|
+
if (!options.skipConfirmation) {
|
|
195
|
+
const confirmed = await confirmAction('Open this position?');
|
|
196
|
+
if (!confirmed) {
|
|
197
|
+
console.log(chalk.yellow('Position cancelled'));
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
spinner.start('Opening position...');
|
|
203
|
+
|
|
204
|
+
// Convert USD position size to token amount at current price
|
|
205
|
+
// positionSizeUSD is in USD with 18 decimals (e.g., 30e18 for $30)
|
|
206
|
+
// currentPrice is price per token with 18 decimals (e.g., 0.019e18 for $0.019)
|
|
207
|
+
// We want: tokens = USD / price, but need to maintain 18 decimal precision
|
|
208
|
+
// So: positionSize = (positionSizeUSD * 1e18) / currentPrice
|
|
209
|
+
const positionSize = (positionSizeUSD * parseEther('1')) / currentPrice;
|
|
210
|
+
|
|
211
|
+
// Open the position
|
|
212
|
+
// Convert leverage to wei format (e.g., 3 -> 3e18)
|
|
213
|
+
const leverageWei = parseEther(leverage.toString());
|
|
214
|
+
const hash = await alpha.openPosition(marketAddress, isLong, positionSize, leverageWei);
|
|
215
|
+
|
|
216
|
+
spinner.text = 'Waiting for confirmation...';
|
|
217
|
+
const publicClient = client.getPublicClient();
|
|
218
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
219
|
+
|
|
220
|
+
spinner.succeed('Position opened successfully!');
|
|
221
|
+
console.log(chalk.gray(` Transaction: ${receipt.transactionHash}`));
|
|
222
|
+
console.log(chalk.gray(` Gas used: ${receipt.gasUsed.toString()}`));
|
|
223
|
+
|
|
224
|
+
// Parse position opened event
|
|
225
|
+
const positionEvent = alpha.parsePositionOpenedEvent(receipt);
|
|
226
|
+
if (positionEvent) {
|
|
227
|
+
console.log(chalk.green(`\n✓ Position ID: ${positionEvent.positionId}`));
|
|
228
|
+
console.log(
|
|
229
|
+
chalk.cyan(` View details: alpha-futures position info ${positionEvent.positionId}`),
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return true;
|
|
234
|
+
} catch (error: any) {
|
|
235
|
+
spinner.fail('Failed to open position');
|
|
236
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|