@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.
Files changed (228) hide show
  1. package/.env.example +37 -0
  2. package/CHANGELOG.md +19 -0
  3. package/README.md +199 -0
  4. package/bin/alf +4 -0
  5. package/cli/README.md +198 -0
  6. package/cli/TEST_MANUAL.md +577 -0
  7. package/cli/commands/account.ts +545 -0
  8. package/cli/commands/funding.ts +481 -0
  9. package/cli/commands/liquidation.ts +523 -0
  10. package/cli/commands/market.ts +590 -0
  11. package/cli/commands/orders.ts +395 -0
  12. package/cli/commands/position.ts +1085 -0
  13. package/cli/commands/shared/positionUtils.ts +239 -0
  14. package/cli/commands/trading.ts +483 -0
  15. package/cli/commands/utils.ts +281 -0
  16. package/cli/commands/vault.ts +522 -0
  17. package/cli/index.ts +169 -0
  18. package/cli/interactive.ts +530 -0
  19. package/cli/utils/client.ts +457 -0
  20. package/cli/utils/config.ts +226 -0
  21. package/cli/utils/display.ts +258 -0
  22. package/cli/utils/index.ts +10 -0
  23. package/cli/utils/prompts.ts +364 -0
  24. package/config.example.json +23 -0
  25. package/dist/AlphaFuturesClient.d.ts +36 -0
  26. package/dist/AlphaFuturesClient.d.ts.map +1 -0
  27. package/dist/AlphaFuturesClient.js +116 -0
  28. package/dist/AlphaFuturesClient.js.map +1 -0
  29. package/dist/abi/Alpha.json +5987 -0
  30. package/dist/abi/abis.d.ts +319 -0
  31. package/dist/abi/abis.d.ts.map +1 -0
  32. package/dist/abi/abis.js +128 -0
  33. package/dist/abi/abis.js.map +1 -0
  34. package/dist/abi/index.d.ts +11 -0
  35. package/dist/abi/index.d.ts.map +1 -0
  36. package/dist/abi/index.js +15 -0
  37. package/dist/abi/index.js.map +1 -0
  38. package/dist/config/contracts.config.d.ts +70 -0
  39. package/dist/config/contracts.config.d.ts.map +1 -0
  40. package/dist/config/contracts.config.js +137 -0
  41. package/dist/config/contracts.config.js.map +1 -0
  42. package/dist/config/environments/alpha.config.d.ts +17 -0
  43. package/dist/config/environments/alpha.config.d.ts.map +1 -0
  44. package/dist/config/environments/alpha.config.js +140 -0
  45. package/dist/config/environments/alpha.config.js.map +1 -0
  46. package/dist/config/environments/beta.config.d.ts +16 -0
  47. package/dist/config/environments/beta.config.d.ts.map +1 -0
  48. package/dist/config/environments/beta.config.js +131 -0
  49. package/dist/config/environments/beta.config.js.map +1 -0
  50. package/dist/config/environments/dev.config.d.ts +13 -0
  51. package/dist/config/environments/dev.config.d.ts.map +1 -0
  52. package/dist/config/environments/dev.config.js +123 -0
  53. package/dist/config/environments/dev.config.js.map +1 -0
  54. package/dist/config/environments/index.d.ts +48 -0
  55. package/dist/config/environments/index.d.ts.map +1 -0
  56. package/dist/config/environments/index.js +81 -0
  57. package/dist/config/environments/index.js.map +1 -0
  58. package/dist/config/environments/localhost.config.d.ts +16 -0
  59. package/dist/config/environments/localhost.config.d.ts.map +1 -0
  60. package/dist/config/environments/localhost.config.js +152 -0
  61. package/dist/config/environments/localhost.config.js.map +1 -0
  62. package/dist/config/environments/prod.config.d.ts +20 -0
  63. package/dist/config/environments/prod.config.d.ts.map +1 -0
  64. package/dist/config/environments/prod.config.js +143 -0
  65. package/dist/config/environments/prod.config.js.map +1 -0
  66. package/dist/config/index.d.ts +7 -0
  67. package/dist/config/index.d.ts.map +1 -0
  68. package/dist/config/index.js +41 -0
  69. package/dist/config/index.js.map +1 -0
  70. package/dist/constants/assets.d.ts +76 -0
  71. package/dist/constants/assets.d.ts.map +1 -0
  72. package/dist/constants/assets.js +277 -0
  73. package/dist/constants/assets.js.map +1 -0
  74. package/dist/constants/contracts.d.ts +41 -0
  75. package/dist/constants/contracts.d.ts.map +1 -0
  76. package/dist/constants/contracts.js +57 -0
  77. package/dist/constants/contracts.js.map +1 -0
  78. package/dist/constants/index.d.ts +36 -0
  79. package/dist/constants/index.d.ts.map +1 -0
  80. package/dist/constants/index.js +75 -0
  81. package/dist/constants/index.js.map +1 -0
  82. package/dist/constants/networks.d.ts +32 -0
  83. package/dist/constants/networks.d.ts.map +1 -0
  84. package/dist/constants/networks.js +174 -0
  85. package/dist/constants/networks.js.map +1 -0
  86. package/dist/contracts/index.d.ts +5 -0
  87. package/dist/contracts/index.d.ts.map +1 -0
  88. package/dist/contracts/index.js +21 -0
  89. package/dist/contracts/index.js.map +1 -0
  90. package/dist/contracts/viem/AlphaViem.d.ts +518 -0
  91. package/dist/contracts/viem/AlphaViem.d.ts.map +1 -0
  92. package/dist/contracts/viem/AlphaViem.js +1287 -0
  93. package/dist/contracts/viem/AlphaViem.js.map +1 -0
  94. package/dist/contracts/viem/PriceOracleViem.d.ts +71 -0
  95. package/dist/contracts/viem/PriceOracleViem.d.ts.map +1 -0
  96. package/dist/contracts/viem/PriceOracleViem.js +212 -0
  97. package/dist/contracts/viem/PriceOracleViem.js.map +1 -0
  98. package/dist/contracts/viem/index.d.ts +9 -0
  99. package/dist/contracts/viem/index.d.ts.map +1 -0
  100. package/dist/contracts/viem/index.js +17 -0
  101. package/dist/contracts/viem/index.js.map +1 -0
  102. package/dist/errors/index.d.ts +44 -0
  103. package/dist/errors/index.d.ts.map +1 -0
  104. package/dist/errors/index.js +83 -0
  105. package/dist/errors/index.js.map +1 -0
  106. package/dist/index.d.ts +19 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +60 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/types/alpha.d.ts +299 -0
  111. package/dist/types/alpha.d.ts.map +1 -0
  112. package/dist/types/alpha.js +6 -0
  113. package/dist/types/alpha.js.map +1 -0
  114. package/dist/types/client.d.ts +24 -0
  115. package/dist/types/client.d.ts.map +1 -0
  116. package/dist/types/client.js +13 -0
  117. package/dist/types/client.js.map +1 -0
  118. package/dist/types/contracts.d.ts +48 -0
  119. package/dist/types/contracts.d.ts.map +1 -0
  120. package/dist/types/contracts.js +6 -0
  121. package/dist/types/contracts.js.map +1 -0
  122. package/dist/types/funding.d.ts +27 -0
  123. package/dist/types/funding.d.ts.map +1 -0
  124. package/dist/types/funding.js +6 -0
  125. package/dist/types/funding.js.map +1 -0
  126. package/dist/types/index.d.ts +92 -0
  127. package/dist/types/index.d.ts.map +1 -0
  128. package/dist/types/index.js +47 -0
  129. package/dist/types/index.js.map +1 -0
  130. package/dist/types/liquidation.d.ts +20 -0
  131. package/dist/types/liquidation.d.ts.map +1 -0
  132. package/dist/types/liquidation.js +6 -0
  133. package/dist/types/liquidation.js.map +1 -0
  134. package/dist/types/margin.d.ts +29 -0
  135. package/dist/types/margin.d.ts.map +1 -0
  136. package/dist/types/margin.js +6 -0
  137. package/dist/types/margin.js.map +1 -0
  138. package/dist/types/oracle.d.ts +21 -0
  139. package/dist/types/oracle.d.ts.map +1 -0
  140. package/dist/types/oracle.js +6 -0
  141. package/dist/types/oracle.js.map +1 -0
  142. package/dist/types/positions.d.ts +43 -0
  143. package/dist/types/positions.d.ts.map +1 -0
  144. package/dist/types/positions.js +13 -0
  145. package/dist/types/positions.js.map +1 -0
  146. package/dist/utils/calculations.d.ts +84 -0
  147. package/dist/utils/calculations.d.ts.map +1 -0
  148. package/dist/utils/calculations.js +155 -0
  149. package/dist/utils/calculations.js.map +1 -0
  150. package/dist/utils/errors.d.ts +24 -0
  151. package/dist/utils/errors.d.ts.map +1 -0
  152. package/dist/utils/errors.js +129 -0
  153. package/dist/utils/errors.js.map +1 -0
  154. package/dist/utils/events.d.ts +40 -0
  155. package/dist/utils/events.d.ts.map +1 -0
  156. package/dist/utils/events.js +73 -0
  157. package/dist/utils/events.js.map +1 -0
  158. package/dist/utils/format.d.ts +40 -0
  159. package/dist/utils/format.d.ts.map +1 -0
  160. package/dist/utils/format.js +86 -0
  161. package/dist/utils/format.js.map +1 -0
  162. package/dist/utils/index.d.ts +10 -0
  163. package/dist/utils/index.d.ts.map +1 -0
  164. package/dist/utils/index.js +26 -0
  165. package/dist/utils/index.js.map +1 -0
  166. package/dist/utils/network.d.ts +52 -0
  167. package/dist/utils/network.d.ts.map +1 -0
  168. package/dist/utils/network.js +192 -0
  169. package/dist/utils/network.js.map +1 -0
  170. package/dist/utils/positionCalculations.d.ts +145 -0
  171. package/dist/utils/positionCalculations.d.ts.map +1 -0
  172. package/dist/utils/positionCalculations.js +278 -0
  173. package/dist/utils/positionCalculations.js.map +1 -0
  174. package/dist/utils/validation.d.ts +28 -0
  175. package/dist/utils/validation.d.ts.map +1 -0
  176. package/dist/utils/validation.js +68 -0
  177. package/dist/utils/validation.js.map +1 -0
  178. package/docs/README.md +40 -0
  179. package/docs/api/API.md +831 -0
  180. package/docs/guides/GETTING_STARTED.md +316 -0
  181. package/docs/guides/TRADING_GUIDE.md +677 -0
  182. package/docs/integration/INTEGRATION_GUIDE.md +1679 -0
  183. package/docs/integration/VIEM_INTEGRATION.md +294 -0
  184. package/docs/reference/CLI_QUICK_REFERENCE.md +197 -0
  185. package/docs/reference/TROUBLESHOOTING.md +922 -0
  186. package/package.json +113 -0
  187. package/src/AlphaFuturesClient.ts +158 -0
  188. package/src/abi/.gitkeep +1 -0
  189. package/src/abi/Alpha.json +5987 -0
  190. package/src/abi/README.md +99 -0
  191. package/src/abi/abis.ts +131 -0
  192. package/src/abi/index.ts +13 -0
  193. package/src/config/contracts.config.ts +186 -0
  194. package/src/config/environments/alpha.config.ts +139 -0
  195. package/src/config/environments/beta.config.ts +130 -0
  196. package/src/config/environments/dev.config.ts +122 -0
  197. package/src/config/environments/index.ts +87 -0
  198. package/src/config/environments/localhost.config.ts +153 -0
  199. package/src/config/environments/prod.config.ts +142 -0
  200. package/src/config/index.ts +29 -0
  201. package/src/constants/assets.ts +299 -0
  202. package/src/constants/contracts.ts +64 -0
  203. package/src/constants/index.ts +69 -0
  204. package/src/constants/networks.ts +182 -0
  205. package/src/contracts/index.ts +5 -0
  206. package/src/contracts/viem/AlphaViem.ts +1615 -0
  207. package/src/contracts/viem/PriceOracleViem.ts +272 -0
  208. package/src/contracts/viem/index.ts +11 -0
  209. package/src/errors/index.ts +87 -0
  210. package/src/index.ts +59 -0
  211. package/src/types/VIEM_TYPES_README.md +70 -0
  212. package/src/types/alpha.ts +358 -0
  213. package/src/types/client.ts +27 -0
  214. package/src/types/contracts.ts +74 -0
  215. package/src/types/funding.ts +31 -0
  216. package/src/types/index.ts +108 -0
  217. package/src/types/liquidation.ts +23 -0
  218. package/src/types/margin.ts +34 -0
  219. package/src/types/oracle.ts +24 -0
  220. package/src/types/positions.ts +48 -0
  221. package/src/utils/calculations.ts +175 -0
  222. package/src/utils/errors.ts +147 -0
  223. package/src/utils/events.ts +98 -0
  224. package/src/utils/format.ts +84 -0
  225. package/src/utils/index.ts +10 -0
  226. package/src/utils/network.ts +212 -0
  227. package/src/utils/positionCalculations.ts +317 -0
  228. 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
+ }