hyperliquid-prime 0.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 (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +426 -0
  3. package/dist/cli/context.d.ts +12 -0
  4. package/dist/cli/context.d.ts.map +1 -0
  5. package/dist/cli/context.js +27 -0
  6. package/dist/cli/context.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +5 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/output.d.ts +7 -0
  12. package/dist/cli/output.d.ts.map +1 -0
  13. package/dist/cli/output.js +29 -0
  14. package/dist/cli/output.js.map +1 -0
  15. package/dist/cli/program.d.ts +3 -0
  16. package/dist/cli/program.d.ts.map +1 -0
  17. package/dist/cli/program.js +232 -0
  18. package/dist/cli/program.js.map +1 -0
  19. package/dist/collateral/manager.d.ts +45 -0
  20. package/dist/collateral/manager.d.ts.map +1 -0
  21. package/dist/collateral/manager.js +252 -0
  22. package/dist/collateral/manager.js.map +1 -0
  23. package/dist/collateral/types.d.ts +26 -0
  24. package/dist/collateral/types.d.ts.map +1 -0
  25. package/dist/collateral/types.js +2 -0
  26. package/dist/collateral/types.js.map +1 -0
  27. package/dist/config.d.ts +31 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +6 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/execution/executor.d.ts +30 -0
  32. package/dist/execution/executor.d.ts.map +1 -0
  33. package/dist/execution/executor.js +291 -0
  34. package/dist/execution/executor.js.map +1 -0
  35. package/dist/execution/monitor.d.ts +26 -0
  36. package/dist/execution/monitor.d.ts.map +1 -0
  37. package/dist/execution/monitor.js +50 -0
  38. package/dist/execution/monitor.js.map +1 -0
  39. package/dist/execution/types.d.ts +26 -0
  40. package/dist/execution/types.d.ts.map +1 -0
  41. package/dist/execution/types.js +2 -0
  42. package/dist/execution/types.js.map +1 -0
  43. package/dist/index.d.ts +87 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +249 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/logging/logger.d.ts +7 -0
  48. package/dist/logging/logger.d.ts.map +1 -0
  49. package/dist/logging/logger.js +10 -0
  50. package/dist/logging/logger.js.map +1 -0
  51. package/dist/market/aggregator.d.ts +28 -0
  52. package/dist/market/aggregator.d.ts.map +1 -0
  53. package/dist/market/aggregator.js +166 -0
  54. package/dist/market/aggregator.js.map +1 -0
  55. package/dist/market/book.d.ts +22 -0
  56. package/dist/market/book.d.ts.map +1 -0
  57. package/dist/market/book.js +34 -0
  58. package/dist/market/book.js.map +1 -0
  59. package/dist/market/registry.d.ts +19 -0
  60. package/dist/market/registry.d.ts.map +1 -0
  61. package/dist/market/registry.js +127 -0
  62. package/dist/market/registry.js.map +1 -0
  63. package/dist/market/types.d.ts +53 -0
  64. package/dist/market/types.d.ts.map +1 -0
  65. package/dist/market/types.js +2 -0
  66. package/dist/market/types.js.map +1 -0
  67. package/dist/position/manager.d.ts +21 -0
  68. package/dist/position/manager.d.ts.map +1 -0
  69. package/dist/position/manager.js +63 -0
  70. package/dist/position/manager.js.map +1 -0
  71. package/dist/position/risk.d.ts +7 -0
  72. package/dist/position/risk.d.ts.map +1 -0
  73. package/dist/position/risk.js +23 -0
  74. package/dist/position/risk.js.map +1 -0
  75. package/dist/position/types.d.ts +28 -0
  76. package/dist/position/types.d.ts.map +1 -0
  77. package/dist/position/types.js +2 -0
  78. package/dist/position/types.js.map +1 -0
  79. package/dist/provider/nktkas.d.ts +63 -0
  80. package/dist/provider/nktkas.d.ts.map +1 -0
  81. package/dist/provider/nktkas.js +277 -0
  82. package/dist/provider/nktkas.js.map +1 -0
  83. package/dist/provider/provider.d.ts +42 -0
  84. package/dist/provider/provider.d.ts.map +1 -0
  85. package/dist/provider/provider.js +2 -0
  86. package/dist/provider/provider.js.map +1 -0
  87. package/dist/provider/types.d.ts +214 -0
  88. package/dist/provider/types.d.ts.map +1 -0
  89. package/dist/provider/types.js +4 -0
  90. package/dist/provider/types.js.map +1 -0
  91. package/dist/router/router.d.ts +30 -0
  92. package/dist/router/router.d.ts.map +1 -0
  93. package/dist/router/router.js +256 -0
  94. package/dist/router/router.js.map +1 -0
  95. package/dist/router/scorer.d.ts +18 -0
  96. package/dist/router/scorer.d.ts.map +1 -0
  97. package/dist/router/scorer.js +43 -0
  98. package/dist/router/scorer.js.map +1 -0
  99. package/dist/router/simulator.d.ts +11 -0
  100. package/dist/router/simulator.d.ts.map +1 -0
  101. package/dist/router/simulator.js +44 -0
  102. package/dist/router/simulator.js.map +1 -0
  103. package/dist/router/splitter.d.ts +26 -0
  104. package/dist/router/splitter.d.ts.map +1 -0
  105. package/dist/router/splitter.js +119 -0
  106. package/dist/router/splitter.js.map +1 -0
  107. package/dist/router/types.d.ts +69 -0
  108. package/dist/router/types.d.ts.map +1 -0
  109. package/dist/router/types.js +4 -0
  110. package/dist/router/types.js.map +1 -0
  111. package/dist/utils/errors.d.ts +28 -0
  112. package/dist/utils/errors.d.ts.map +1 -0
  113. package/dist/utils/errors.js +55 -0
  114. package/dist/utils/errors.js.map +1 -0
  115. package/dist/utils/math.d.ts +24 -0
  116. package/dist/utils/math.d.ts.map +1 -0
  117. package/dist/utils/math.js +43 -0
  118. package/dist/utils/math.js.map +1 -0
  119. package/package.json +59 -0
@@ -0,0 +1,232 @@
1
+ import { Command } from "commander";
2
+ import { createContext } from "./context.js";
3
+ import { output, formatTable } from "./output.js";
4
+ async function withClient(program, action) {
5
+ const opts = program.opts();
6
+ const hp = await createContext(opts);
7
+ try {
8
+ await action(hp, opts);
9
+ }
10
+ finally {
11
+ await hp.disconnect();
12
+ }
13
+ }
14
+ function parseSide(side) {
15
+ const normalized = side.toLowerCase();
16
+ if (normalized === "buy" || normalized === "sell") {
17
+ return normalized;
18
+ }
19
+ throw new Error(`Invalid side "${side}". Expected "buy" or "sell".`);
20
+ }
21
+ function parsePositiveNumber(raw, label) {
22
+ const value = Number(raw);
23
+ if (!Number.isFinite(value) || value <= 0) {
24
+ throw new Error(`Invalid ${label} "${raw}". Expected a positive number.`);
25
+ }
26
+ return value;
27
+ }
28
+ function parsePositiveInt(raw, label) {
29
+ const value = Number(raw);
30
+ if (!Number.isInteger(value) || value <= 0) {
31
+ throw new Error(`Invalid ${label} "${raw}". Expected a positive integer.`);
32
+ }
33
+ return value;
34
+ }
35
+ export function createProgram() {
36
+ const program = new Command();
37
+ program
38
+ .name("hp")
39
+ .description("Hyperliquid Prime CLI — unified HIP-3 market trading")
40
+ .version("0.1.0")
41
+ .option("--testnet", "Use Hyperliquid testnet", false)
42
+ .option("--key <hex>", "Private key (hex) for trading")
43
+ .option("--key-env <name>", "Environment variable for private key (recommended)", "HP_PRIVATE_KEY")
44
+ .option("--log-level <level>", "Log level", "warn")
45
+ .option("--json", "Output as JSON", false)
46
+ .option("--no-builder-fee", "Disable builder fee");
47
+ program
48
+ .command("markets")
49
+ .description("Show all HIP-3 markets for an asset")
50
+ .argument("<asset>", "Base asset symbol (e.g. ETH)")
51
+ .action(async (asset) => withClient(program, async (hp, opts) => {
52
+ const markets = hp.getMarkets(asset);
53
+ if (opts.json) {
54
+ output(markets, true);
55
+ return;
56
+ }
57
+ if (markets.length === 0) {
58
+ console.log(`No markets found for ${asset}`);
59
+ return;
60
+ }
61
+ const table = formatTable(["Coin", "Dex", "Collateral", "Native", "Funding", "OI", "Mark"], markets.map((m) => [
62
+ m.coin,
63
+ m.dexName,
64
+ m.collateral,
65
+ m.isNative ? "yes" : "no",
66
+ m.funding ?? "-",
67
+ m.openInterest ?? "-",
68
+ m.markPrice ?? "-",
69
+ ]));
70
+ console.log(table);
71
+ }));
72
+ program
73
+ .command("book")
74
+ .description("Show aggregated orderbook for an asset")
75
+ .argument("<asset>", "Base asset symbol")
76
+ .option("-d, --depth <n>", "Number of levels", "5")
77
+ .action(async (asset, cmdOpts) => withClient(program, async (hp, opts) => {
78
+ const depth = parsePositiveInt(cmdOpts.depth, "depth");
79
+ const book = await hp.getAggregatedBook(asset);
80
+ if (opts.json) {
81
+ output(book, true);
82
+ return;
83
+ }
84
+ console.log(`\nAggregated Book: ${asset}`);
85
+ console.log("=".repeat(60));
86
+ console.log("\nAsks (best first):");
87
+ const asks = book.asks.slice(0, depth).reverse();
88
+ for (const level of asks) {
89
+ const sources = level.sources
90
+ .map((s) => `${s.coin}:${s.sz.toFixed(4)}`)
91
+ .join(", ");
92
+ console.log(` ${level.px.toFixed(2)} | ${level.sz.toFixed(4)} [${sources}]`);
93
+ }
94
+ console.log(" --- mid ---");
95
+ console.log("Bids (best first):");
96
+ const bids = book.bids.slice(0, depth);
97
+ for (const level of bids) {
98
+ const sources = level.sources
99
+ .map((s) => `${s.coin}:${s.sz.toFixed(4)}`)
100
+ .join(", ");
101
+ console.log(` ${level.px.toFixed(2)} | ${level.sz.toFixed(4)} [${sources}]`);
102
+ }
103
+ }));
104
+ program
105
+ .command("funding")
106
+ .description("Compare funding rates across markets")
107
+ .argument("<asset>", "Base asset symbol")
108
+ .action(async (asset) => withClient(program, async (hp, opts) => {
109
+ const comparison = await hp.getFundingComparison(asset);
110
+ if (opts.json) {
111
+ output(comparison, true);
112
+ return;
113
+ }
114
+ console.log(`\nFunding Comparison: ${asset}`);
115
+ console.log("=".repeat(60));
116
+ const table = formatTable(["Coin", "Dex", "Collateral", "Funding Rate", "OI", "Mark"], comparison.markets.map((m) => [
117
+ m.coin,
118
+ m.dexName,
119
+ m.collateral,
120
+ (m.fundingRate * 100).toFixed(6) + "%",
121
+ m.openInterest.toFixed(2),
122
+ m.markPrice.toFixed(2),
123
+ ]));
124
+ console.log(table);
125
+ console.log(`\nBest for LONG: ${comparison.bestForLong}`);
126
+ console.log(`Best for SHORT: ${comparison.bestForShort}`);
127
+ }));
128
+ program
129
+ .command("quote")
130
+ .description("Get a routing quote (does not execute)")
131
+ .argument("<asset>", "Base asset symbol")
132
+ .argument("<side>", "buy or sell")
133
+ .argument("<size>", "Size in base asset units")
134
+ .action(async (asset, sideRaw, sizeRaw) => withClient(program, async (hp, opts) => {
135
+ const side = parseSide(sideRaw);
136
+ const size = parsePositiveNumber(sizeRaw, "size");
137
+ const quote = await hp.quote(asset, side, size);
138
+ if (opts.json) {
139
+ output(quote, true);
140
+ return;
141
+ }
142
+ console.log(`\nQuote: ${side.toUpperCase()} ${size} ${asset}`);
143
+ console.log("=".repeat(60));
144
+ console.log(`Selected Market: ${quote.selectedMarket.coin}`);
145
+ console.log(`Dex: ${quote.selectedMarket.dexName}`);
146
+ console.log(`Collateral: ${quote.selectedMarket.collateral}`);
147
+ console.log(`Est. Avg Price: ${quote.estimatedAvgPrice.toFixed(4)}`);
148
+ console.log(`Est. Impact: ${quote.estimatedPriceImpact.toFixed(2)} bps`);
149
+ console.log(`Funding Rate: ${(quote.estimatedFundingRate * 100).toFixed(6)}%`);
150
+ if (quote.warnings && quote.warnings.length > 0) {
151
+ console.log("\nWarnings:");
152
+ for (const warning of quote.warnings) {
153
+ console.log(` - ${warning}`);
154
+ }
155
+ }
156
+ console.log(`\nAlternatives considered: ${quote.alternativesConsidered.length}`);
157
+ for (const alt of quote.alternativesConsidered) {
158
+ const marker = alt.market.coin === quote.selectedMarket.coin ? " <-- BEST" : "";
159
+ console.log(` ${alt.market.coin}: score=${alt.totalScore.toFixed(2)} impact=${alt.priceImpact.toFixed(2)}bps${alt.reason ? ` (${alt.reason})` : ""}${marker}`);
160
+ }
161
+ }));
162
+ program
163
+ .command("long")
164
+ .description("Open a long position via best market")
165
+ .argument("<asset>", "Base asset symbol")
166
+ .argument("<size>", "Size in base asset units")
167
+ .action(async (asset, sizeRaw) => withClient(program, async (hp, opts) => {
168
+ const size = parsePositiveNumber(sizeRaw, "size");
169
+ const receipt = await hp.long(asset, size);
170
+ if (opts.json) {
171
+ output(receipt, true);
172
+ return;
173
+ }
174
+ console.log(receipt.success
175
+ ? `LONG ${size} ${asset} via ${receipt.market.coin}: filled ${receipt.filledSize} @ ${receipt.avgPrice}`
176
+ : `FAILED: ${receipt.error}`);
177
+ }));
178
+ program
179
+ .command("short")
180
+ .description("Open a short position via best market")
181
+ .argument("<asset>", "Base asset symbol")
182
+ .argument("<size>", "Size in base asset units")
183
+ .action(async (asset, sizeRaw) => withClient(program, async (hp, opts) => {
184
+ const size = parsePositiveNumber(sizeRaw, "size");
185
+ const receipt = await hp.short(asset, size);
186
+ if (opts.json) {
187
+ output(receipt, true);
188
+ return;
189
+ }
190
+ console.log(receipt.success
191
+ ? `SHORT ${size} ${asset} via ${receipt.market.coin}: filled ${receipt.filledSize} @ ${receipt.avgPrice}`
192
+ : `FAILED: ${receipt.error}`);
193
+ }));
194
+ program
195
+ .command("positions")
196
+ .description("Show all positions (unified view)")
197
+ .action(async () => withClient(program, async (hp, opts) => {
198
+ const grouped = await hp.getGroupedPositions();
199
+ if (opts.json) {
200
+ output(Object.fromEntries(grouped), true);
201
+ return;
202
+ }
203
+ if (grouped.size === 0) {
204
+ console.log("No open positions");
205
+ return;
206
+ }
207
+ for (const [asset, positions] of grouped) {
208
+ console.log(`\n${asset}:`);
209
+ for (const pos of positions) {
210
+ console.log(` ${pos.side.toUpperCase()} ${pos.size.toFixed(4)} @ ${pos.entryPrice.toFixed(2)} | mark: ${pos.markPrice.toFixed(2)} | PnL: ${pos.unrealizedPnl.toFixed(2)} | lev: ${pos.leverage}x | via ${pos.coin}`);
211
+ }
212
+ }
213
+ }));
214
+ program
215
+ .command("balance")
216
+ .description("Show account balance")
217
+ .action(async () => withClient(program, async (hp, opts) => {
218
+ const balance = await hp.getBalance();
219
+ if (opts.json) {
220
+ output(balance, true);
221
+ return;
222
+ }
223
+ console.log(`\nAccount Balance`);
224
+ console.log("=".repeat(40));
225
+ console.log(`Account Value: ${balance.accountValue}`);
226
+ console.log(`Margin Used: ${balance.totalMarginUsed}`);
227
+ console.log(`Notional Pos: ${balance.totalNtlPos}`);
228
+ console.log(`Raw USD: ${balance.totalRawUsd}`);
229
+ }));
230
+ return program;
231
+ }
232
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { HLProvider } from "../provider/provider.js";
2
+ import type { Logger } from "../logging/logger.js";
3
+ import type { SplitAllocation } from "../router/types.js";
4
+ import type { CollateralPlan, CollateralReceipt } from "./types.js";
5
+ /**
6
+ * CollateralManager handles two concerns:
7
+ * 1. Estimation (read-only): What collateral swaps are needed and how much will they cost?
8
+ * 2. Execution (writes): Perform the actual swaps and enable DEX abstraction.
9
+ *
10
+ * When DEX abstraction is enabled on Hyperliquid:
11
+ * - USDC-collateral DEXs pull from the perp USDC balance automatically
12
+ * - Non-USDC DEXs pull from the user's spot balance of that token
13
+ *
14
+ * So the flow for non-USDC collateral is:
15
+ * 1. usdClassTransfer: move USDC from perp → spot
16
+ * 2. Spot order: swap USDC → target token (e.g., USDH)
17
+ * 3. DEX abstraction handles the rest
18
+ */
19
+ export declare class CollateralManager {
20
+ private provider;
21
+ private simulator;
22
+ private logger;
23
+ constructor(provider: HLProvider, logger: Logger);
24
+ /**
25
+ * Estimate collateral requirements for a set of split allocations.
26
+ * This is read-only — no orders or transfers are made.
27
+ */
28
+ estimateRequirements(allocations: SplitAllocation[], userAddress: string): Promise<CollateralPlan>;
29
+ /**
30
+ * Estimate the cost in basis points to swap fromToken to toToken on the spot market.
31
+ * Uses the spot L2Book to simulate the swap.
32
+ */
33
+ estimateSwapCost(_fromToken: string, toToken: string, amount: number): Promise<number>;
34
+ /**
35
+ * Execute collateral preparation: enable abstraction, perform swaps.
36
+ * Call this before placing split orders.
37
+ */
38
+ prepare(plan: CollateralPlan, _userAddress: string): Promise<CollateralReceipt>;
39
+ /**
40
+ * Compute weighted average swap cost across all requirements,
41
+ * weighted by the proportion of each token's allocation.
42
+ */
43
+ private weightedSwapCost;
44
+ }
45
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/collateral/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,KAAK,EAEV,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ;IAJlB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,MAAM,CAAS;gBAGb,QAAQ,EAAE,UAAU,EAC5B,MAAM,EAAE,MAAM;IAMhB;;;OAGG;IACG,oBAAoB,CACxB,WAAW,EAAE,eAAe,EAAE,EAC9B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC;IAkF1B;;;OAGG;IACG,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IA2BlB;;;OAGG;IACG,OAAO,CACX,IAAI,EAAE,cAAc,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,CAAC;IAuH7B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAmBzB"}
@@ -0,0 +1,252 @@
1
+ import { FillSimulator } from "../router/simulator.js";
2
+ /**
3
+ * CollateralManager handles two concerns:
4
+ * 1. Estimation (read-only): What collateral swaps are needed and how much will they cost?
5
+ * 2. Execution (writes): Perform the actual swaps and enable DEX abstraction.
6
+ *
7
+ * When DEX abstraction is enabled on Hyperliquid:
8
+ * - USDC-collateral DEXs pull from the perp USDC balance automatically
9
+ * - Non-USDC DEXs pull from the user's spot balance of that token
10
+ *
11
+ * So the flow for non-USDC collateral is:
12
+ * 1. usdClassTransfer: move USDC from perp → spot
13
+ * 2. Spot order: swap USDC → target token (e.g., USDH)
14
+ * 3. DEX abstraction handles the rest
15
+ */
16
+ export class CollateralManager {
17
+ provider;
18
+ simulator;
19
+ logger;
20
+ constructor(provider, logger) {
21
+ this.provider = provider;
22
+ this.simulator = new FillSimulator();
23
+ this.logger = logger.child({ module: "collateral" });
24
+ }
25
+ /**
26
+ * Estimate collateral requirements for a set of split allocations.
27
+ * This is read-only — no orders or transfers are made.
28
+ */
29
+ async estimateRequirements(allocations, userAddress) {
30
+ // Get user's current spot balances
31
+ const spotState = await this.provider.spotClearinghouseState(userAddress);
32
+ const balanceMap = new Map();
33
+ for (const b of spotState.balances) {
34
+ balanceMap.set(b.coin, parseFloat(b.total));
35
+ }
36
+ // Get perp balance (USDC is the perp native collateral)
37
+ const perpState = await this.provider.clearinghouseState(userAddress);
38
+ const perpUsdcBalance = parseFloat(perpState.marginSummary.accountValue);
39
+ // Group allocations by collateral type
40
+ const collateralNeeds = new Map();
41
+ for (const alloc of allocations) {
42
+ const token = alloc.market.collateral;
43
+ const amount = alloc.estimatedCost; // USD value needed
44
+ collateralNeeds.set(token, (collateralNeeds.get(token) ?? 0) + amount);
45
+ }
46
+ const requirements = [];
47
+ let swapsNeeded = false;
48
+ const swapShortfalls = new Map();
49
+ const tokenBalances = new Map();
50
+ for (const [token, amountNeeded] of collateralNeeds) {
51
+ if (token === "USDC") {
52
+ // USDC comes from perp balance automatically via abstraction
53
+ requirements.push({
54
+ token,
55
+ amountNeeded,
56
+ currentBalance: perpUsdcBalance,
57
+ shortfall: 0, // Abstraction handles USDC automatically
58
+ swapFrom: "USDC",
59
+ estimatedSwapCostBps: 0,
60
+ });
61
+ continue;
62
+ }
63
+ // Non-USDC: needs to be in spot balance
64
+ const currentBalance = balanceMap.get(token) ?? 0;
65
+ const shortfall = Math.max(0, amountNeeded - currentBalance);
66
+ tokenBalances.set(token, currentBalance);
67
+ if (shortfall > 0) {
68
+ swapsNeeded = true;
69
+ swapShortfalls.set(token, shortfall);
70
+ }
71
+ }
72
+ const swapCostMap = new Map();
73
+ await Promise.all([...swapShortfalls.entries()].map(async ([token, shortfall]) => {
74
+ const swapCostBps = await this.estimateSwapCost("USDC", token, shortfall);
75
+ swapCostMap.set(token, swapCostBps);
76
+ }));
77
+ for (const [token, amountNeeded] of collateralNeeds) {
78
+ if (token === "USDC")
79
+ continue;
80
+ const currentBalance = tokenBalances.get(token) ?? 0;
81
+ const shortfall = Math.max(0, amountNeeded - currentBalance);
82
+ requirements.push({
83
+ token,
84
+ amountNeeded,
85
+ currentBalance,
86
+ shortfall,
87
+ swapFrom: "USDC",
88
+ estimatedSwapCostBps: swapCostMap.get(token) ?? 0,
89
+ });
90
+ }
91
+ const totalSwapCostBps = this.weightedSwapCost(requirements, allocations);
92
+ return {
93
+ requirements,
94
+ totalSwapCostBps,
95
+ swapsNeeded,
96
+ abstractionEnabled: false, // Will be checked during prepare()
97
+ };
98
+ }
99
+ /**
100
+ * Estimate the cost in basis points to swap fromToken to toToken on the spot market.
101
+ * Uses the spot L2Book to simulate the swap.
102
+ */
103
+ async estimateSwapCost(_fromToken, toToken, amount) {
104
+ try {
105
+ // Fetch the spot book for the target token
106
+ // On Hyperliquid, stablecoin pairs typically use @{index} format
107
+ // For now, try the token name directly
108
+ const book = await this.provider.l2Book(toToken);
109
+ if (book.levels[0].length === 0 && book.levels[1].length === 0) {
110
+ // No spot book available — return conservative default
111
+ return 50;
112
+ }
113
+ // Simulate buying `amount` worth of toToken on the spot market
114
+ // Since stablecoins trade near $1, amount ≈ size
115
+ const sim = this.simulator.simulate(book, "buy", amount);
116
+ if (!sim) {
117
+ return 100; // Insufficient spot depth
118
+ }
119
+ return sim.priceImpactBps;
120
+ }
121
+ catch {
122
+ // Spot book not available — return conservative estimate
123
+ this.logger.debug({ toToken, amount }, "Spot book unavailable, using default swap cost");
124
+ return 50;
125
+ }
126
+ }
127
+ /**
128
+ * Execute collateral preparation: enable abstraction, perform swaps.
129
+ * Call this before placing split orders.
130
+ */
131
+ async prepare(plan, _userAddress) {
132
+ const swapsExecuted = [];
133
+ let abstractionWasEnabled = false;
134
+ try {
135
+ // Step 1: Enable DEX abstraction if not already enabled
136
+ if (!plan.abstractionEnabled) {
137
+ this.logger.info("Enabling DEX abstraction");
138
+ await this.provider.setDexAbstraction(true);
139
+ abstractionWasEnabled = true;
140
+ }
141
+ const spotMeta = await this.provider.spotMeta();
142
+ const tokenByName = new Map(spotMeta.tokens.map((token) => [token.name, token]));
143
+ const pairByTokenIndex = new Map();
144
+ for (const pair of spotMeta.universe) {
145
+ for (const tokenIndex of pair.tokens) {
146
+ if (!pairByTokenIndex.has(tokenIndex)) {
147
+ pairByTokenIndex.set(tokenIndex, pair);
148
+ }
149
+ }
150
+ }
151
+ // Step 2: Execute swaps for each requirement with shortfall
152
+ for (const req of plan.requirements) {
153
+ if (req.shortfall <= 0 || req.token === "USDC")
154
+ continue;
155
+ // Move USDC from perp → spot
156
+ const transferAmount = req.shortfall * 1.01; // 1% buffer for slippage
157
+ this.logger.info({ amount: transferAmount, token: req.token }, "Transferring USDC to spot for swap");
158
+ await this.provider.usdClassTransfer(transferAmount, false);
159
+ // Place spot order to swap USDC → target token
160
+ // Spot orders use the same provider.placeOrder with spot asset indices
161
+ const spotBook = await this.provider.l2Book(req.token);
162
+ if (spotBook.levels[1].length === 0) {
163
+ return {
164
+ success: false,
165
+ swapsExecuted,
166
+ abstractionWasEnabled,
167
+ error: `No spot liquidity for ${req.token}`,
168
+ };
169
+ }
170
+ // Use best ask with slippage for limit price
171
+ const bestAsk = parseFloat(spotBook.levels[1][0].px);
172
+ const limitPrice = (bestAsk * 1.005).toFixed(6); // 0.5% slippage on swap
173
+ const spotToken = tokenByName.get(req.token);
174
+ if (!spotToken) {
175
+ return {
176
+ success: false,
177
+ swapsExecuted,
178
+ abstractionWasEnabled,
179
+ error: `Spot token ${req.token} not found in spotMeta`,
180
+ };
181
+ }
182
+ // Spot asset index = 10000 + 2 * pair_index for the base token
183
+ // Find the pair that has this token
184
+ const pair = pairByTokenIndex.get(spotToken.index);
185
+ if (!pair) {
186
+ return {
187
+ success: false,
188
+ swapsExecuted,
189
+ abstractionWasEnabled,
190
+ error: `No spot pair found for ${req.token}`,
191
+ };
192
+ }
193
+ const spotAssetIndex = 10000 + 2 * pair.index;
194
+ this.logger.info({ token: req.token, size: req.shortfall, limitPrice, spotAssetIndex }, "Placing spot swap order");
195
+ const result = await this.provider.placeOrder({
196
+ assetIndex: spotAssetIndex,
197
+ isBuy: true,
198
+ price: limitPrice,
199
+ size: req.shortfall.toString(),
200
+ reduceOnly: false,
201
+ orderType: { limit: { tif: "Ioc" } },
202
+ });
203
+ const status = result.statuses[0];
204
+ let filled = "0";
205
+ if (status && typeof status === "object" && "filled" in status) {
206
+ filled = status.filled.totalSz;
207
+ }
208
+ swapsExecuted.push({
209
+ from: req.swapFrom,
210
+ to: req.token,
211
+ amount: req.shortfall.toString(),
212
+ filled,
213
+ });
214
+ }
215
+ return {
216
+ success: true,
217
+ swapsExecuted,
218
+ abstractionWasEnabled,
219
+ };
220
+ }
221
+ catch (error) {
222
+ this.logger.error({ error }, "Collateral preparation failed");
223
+ return {
224
+ success: false,
225
+ swapsExecuted,
226
+ abstractionWasEnabled,
227
+ error: error instanceof Error ? error.message : String(error),
228
+ };
229
+ }
230
+ }
231
+ /**
232
+ * Compute weighted average swap cost across all requirements,
233
+ * weighted by the proportion of each token's allocation.
234
+ */
235
+ weightedSwapCost(requirements, allocations) {
236
+ const totalCost = allocations.reduce((sum, a) => sum + a.estimatedCost, 0);
237
+ if (totalCost === 0)
238
+ return 0;
239
+ let weightedSum = 0;
240
+ for (const req of requirements) {
241
+ if (req.shortfall <= 0)
242
+ continue;
243
+ const tokenAllocCost = allocations
244
+ .filter((a) => a.market.collateral === req.token)
245
+ .reduce((sum, a) => sum + a.estimatedCost, 0);
246
+ const weight = tokenAllocCost / totalCost;
247
+ weightedSum += req.estimatedSwapCostBps * weight;
248
+ }
249
+ return weightedSum;
250
+ }
251
+ }
252
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/collateral/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface CollateralRequirement {
2
+ token: string;
3
+ amountNeeded: number;
4
+ currentBalance: number;
5
+ shortfall: number;
6
+ swapFrom: string;
7
+ estimatedSwapCostBps: number;
8
+ }
9
+ export interface CollateralPlan {
10
+ requirements: CollateralRequirement[];
11
+ totalSwapCostBps: number;
12
+ swapsNeeded: boolean;
13
+ abstractionEnabled: boolean;
14
+ }
15
+ export interface CollateralReceipt {
16
+ success: boolean;
17
+ swapsExecuted: {
18
+ from: string;
19
+ to: string;
20
+ amount: string;
21
+ filled: string;
22
+ }[];
23
+ abstractionWasEnabled: boolean;
24
+ error?: string;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/collateral/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;IACJ,qBAAqB,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/collateral/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ /** Builder fee configuration. */
2
+ export interface BuilderConfig {
3
+ /** Builder address (0x-prefixed). */
4
+ address: `0x${string}`;
5
+ /** Fee in basis points. 1 bps = 0.01%. Max 10 bps (0.1%) for perps. */
6
+ feeBps: number;
7
+ }
8
+ /** @internal SDK default builder fee configuration. */
9
+ export declare const DEFAULT_BUILDER: BuilderConfig;
10
+ export interface HyperliquidPrimeConfig {
11
+ /** Hex private key. Required for trading, optional for read-only. */
12
+ privateKey?: `0x${string}`;
13
+ /** User's wallet address. Derived from privateKey if not provided. */
14
+ walletAddress?: string;
15
+ /** Use testnet. Default: false. */
16
+ testnet?: boolean;
17
+ /** Default slippage for market orders. Default: 0.01 (1%). */
18
+ defaultSlippage?: number;
19
+ /** Log level. Default: "info". */
20
+ logLevel?: "debug" | "info" | "warn" | "error" | "silent";
21
+ /** Pretty-print logs. Default: false. */
22
+ prettyLogs?: boolean;
23
+ /**
24
+ * Builder fee configuration.
25
+ * - Default (undefined): SDK author's address with 1 bps fee.
26
+ * - null: Disable builder fees entirely.
27
+ * - BuilderConfig: Custom builder address and fee.
28
+ */
29
+ builder?: BuilderConfig | null;
30
+ }
31
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uDAAuD;AACvD,eAAO,MAAM,eAAe,EAAE,aAG7B,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAE3B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAE1D,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC"}
package/dist/config.js ADDED
@@ -0,0 +1,6 @@
1
+ /** @internal SDK default builder fee configuration. */
2
+ export const DEFAULT_BUILDER = {
3
+ address: "0x34411c9d3c312e6ECb32C079AA0F34B572Dddc37",
4
+ feeBps: 1,
5
+ };
6
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,uDAAuD;AACvD,MAAM,CAAC,MAAM,eAAe,GAAkB;IAC5C,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,CAAC;CACV,CAAC"}