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.
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/dist/cli/context.d.ts +12 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +27 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +7 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +29 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/program.d.ts +3 -0
- package/dist/cli/program.d.ts.map +1 -0
- package/dist/cli/program.js +232 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/collateral/manager.d.ts +45 -0
- package/dist/collateral/manager.d.ts.map +1 -0
- package/dist/collateral/manager.js +252 -0
- package/dist/collateral/manager.js.map +1 -0
- package/dist/collateral/types.d.ts +26 -0
- package/dist/collateral/types.d.ts.map +1 -0
- package/dist/collateral/types.js +2 -0
- package/dist/collateral/types.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -0
- package/dist/execution/executor.d.ts +30 -0
- package/dist/execution/executor.d.ts.map +1 -0
- package/dist/execution/executor.js +291 -0
- package/dist/execution/executor.js.map +1 -0
- package/dist/execution/monitor.d.ts +26 -0
- package/dist/execution/monitor.d.ts.map +1 -0
- package/dist/execution/monitor.js +50 -0
- package/dist/execution/monitor.js.map +1 -0
- package/dist/execution/types.d.ts +26 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +2 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +249 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/logger.d.ts +7 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +10 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/market/aggregator.d.ts +28 -0
- package/dist/market/aggregator.d.ts.map +1 -0
- package/dist/market/aggregator.js +166 -0
- package/dist/market/aggregator.js.map +1 -0
- package/dist/market/book.d.ts +22 -0
- package/dist/market/book.d.ts.map +1 -0
- package/dist/market/book.js +34 -0
- package/dist/market/book.js.map +1 -0
- package/dist/market/registry.d.ts +19 -0
- package/dist/market/registry.d.ts.map +1 -0
- package/dist/market/registry.js +127 -0
- package/dist/market/registry.js.map +1 -0
- package/dist/market/types.d.ts +53 -0
- package/dist/market/types.d.ts.map +1 -0
- package/dist/market/types.js +2 -0
- package/dist/market/types.js.map +1 -0
- package/dist/position/manager.d.ts +21 -0
- package/dist/position/manager.d.ts.map +1 -0
- package/dist/position/manager.js +63 -0
- package/dist/position/manager.js.map +1 -0
- package/dist/position/risk.d.ts +7 -0
- package/dist/position/risk.d.ts.map +1 -0
- package/dist/position/risk.js +23 -0
- package/dist/position/risk.js.map +1 -0
- package/dist/position/types.d.ts +28 -0
- package/dist/position/types.d.ts.map +1 -0
- package/dist/position/types.js +2 -0
- package/dist/position/types.js.map +1 -0
- package/dist/provider/nktkas.d.ts +63 -0
- package/dist/provider/nktkas.d.ts.map +1 -0
- package/dist/provider/nktkas.js +277 -0
- package/dist/provider/nktkas.js.map +1 -0
- package/dist/provider/provider.d.ts +42 -0
- package/dist/provider/provider.d.ts.map +1 -0
- package/dist/provider/provider.js +2 -0
- package/dist/provider/provider.js.map +1 -0
- package/dist/provider/types.d.ts +214 -0
- package/dist/provider/types.d.ts.map +1 -0
- package/dist/provider/types.js +4 -0
- package/dist/provider/types.js.map +1 -0
- package/dist/router/router.d.ts +30 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +256 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/scorer.d.ts +18 -0
- package/dist/router/scorer.d.ts.map +1 -0
- package/dist/router/scorer.js +43 -0
- package/dist/router/scorer.js.map +1 -0
- package/dist/router/simulator.d.ts +11 -0
- package/dist/router/simulator.d.ts.map +1 -0
- package/dist/router/simulator.js +44 -0
- package/dist/router/simulator.js.map +1 -0
- package/dist/router/splitter.d.ts +26 -0
- package/dist/router/splitter.d.ts.map +1 -0
- package/dist/router/splitter.js +119 -0
- package/dist/router/splitter.js.map +1 -0
- package/dist/router/types.d.ts +69 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +4 -0
- package/dist/router/types.js.map +1 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +55 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/math.d.ts +24 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +43 -0
- package/dist/utils/math.js.map +1 -0
- 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":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAOvD;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,iBAAiB;IAKlB;IAJF,SAAS,CAAgB;IACzB,MAAM,CAAS;IAEvB,YACU,QAAoB,EAC5B,MAAc;QADN,aAAQ,GAAR,QAAQ,CAAY;QAG5B,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,oBAAoB,CACxB,WAA8B,EAC9B,WAAmB;QAEnB,mCAAmC;QACnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACnC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,wDAAwD;QACxD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAEzE,uCAAuC;QACvC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,mBAAmB;YACvD,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,YAAY,GAA4B,EAAE,CAAC;QACjD,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QACjD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEhD,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,eAAe,EAAE,CAAC;YACpD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,6DAA6D;gBAC7D,YAAY,CAAC,IAAI,CAAC;oBAChB,KAAK;oBACL,YAAY;oBACZ,cAAc,EAAE,eAAe;oBAC/B,SAAS,EAAE,CAAC,EAAE,yCAAyC;oBACvD,QAAQ,EAAE,MAAM;oBAChB,oBAAoB,EAAE,CAAC;iBACxB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,wCAAwC;YACxC,MAAM,cAAc,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC,CAAC;YAC7D,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;YAEzC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,WAAW,GAAG,IAAI,CAAC;gBACnB,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC9C,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE;YAC7D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1E,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC,CAAC,CACH,CAAC;QAEF,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,eAAe,EAAE,CAAC;YACpD,IAAI,KAAK,KAAK,MAAM;gBAAE,SAAS;YAC/B,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,cAAc,CAAC,CAAC;YAC7D,YAAY,CAAC,IAAI,CAAC;gBAChB,KAAK;gBACL,YAAY;gBACZ,cAAc;gBACd,SAAS;gBACT,QAAQ,EAAE,MAAM;gBAChB,oBAAoB,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAE1E,OAAO;YACL,YAAY;YACZ,gBAAgB;YAChB,WAAW;YACX,kBAAkB,EAAE,KAAK,EAAE,mCAAmC;SAC/D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CACpB,UAAkB,EAClB,OAAe,EACf,MAAc;QAEd,IAAI,CAAC;YACH,2CAA2C;YAC3C,iEAAiE;YACjE,uCAAuC;YACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEjD,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/D,uDAAuD;gBACvD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,+DAA+D;YAC/D,iDAAiD;YACjD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,GAAG,CAAC,CAAC,0BAA0B;YACxC,CAAC;YAED,OAAO,GAAG,CAAC,cAAc,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,gDAAgD,CAAC,CAAC;YACzF,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CACX,IAAoB,EACpB,YAAoB;QAEpB,MAAM,aAAa,GAAuC,EAAE,CAAC;QAC7D,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAElC,IAAI,CAAC;YACH,wDAAwD;YACxD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC7C,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC5C,qBAAqB,GAAG,IAAI,CAAC;YAC/B,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACjF,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA8C,CAAC;YAC/E,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACrC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACrC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBACtC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,4DAA4D;YAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM;oBAAE,SAAS;gBAEzD,6BAA6B;gBAC7B,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,yBAAyB;gBACtE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,EAC5C,oCAAoC,CACrC,CAAC;gBACF,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBAE5D,+CAA+C;gBAC/C,uEAAuE;gBACvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACvD,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpC,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,aAAa;wBACb,qBAAqB;wBACrB,KAAK,EAAE,yBAAyB,GAAG,CAAC,KAAK,EAAE;qBAC5C,CAAC;gBACJ,CAAC;gBAED,6CAA6C;gBAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrD,MAAM,UAAU,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;gBAEzE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,aAAa;wBACb,qBAAqB;wBACrB,KAAK,EAAE,cAAc,GAAG,CAAC,KAAK,wBAAwB;qBACvD,CAAC;gBACJ,CAAC;gBAED,+DAA+D;gBAC/D,oCAAoC;gBACpC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,aAAa;wBACb,qBAAqB;wBACrB,KAAK,EAAE,0BAA0B,GAAG,CAAC,KAAK,EAAE;qBAC7C,CAAC;gBACJ,CAAC;gBAED,MAAM,cAAc,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBAE9C,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,EACrE,yBAAyB,CAC1B,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC5C,UAAU,EAAE,cAAc;oBAC1B,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE;oBAC9B,UAAU,EAAE,KAAK;oBACjB,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;iBACrC,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,MAAM,GAAG,GAAG,CAAC;gBACjB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;oBAC/D,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;gBACjC,CAAC;gBAED,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,GAAG,CAAC,QAAQ;oBAClB,EAAE,EAAE,GAAG,CAAC,KAAK;oBACb,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE;oBAChC,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,aAAa;gBACb,qBAAqB;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,+BAA+B,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa;gBACb,qBAAqB;gBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,gBAAgB,CACtB,YAAqC,EACrC,WAA8B;QAE9B,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,SAAS,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAE9B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,SAAS,IAAI,CAAC;gBAAE,SAAS;YACjC,MAAM,cAAc,GAAG,WAAW;iBAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;iBAChD,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;YAC1C,WAAW,IAAI,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC;QACnD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/collateral/types.ts"],"names":[],"mappings":""}
|
package/dist/config.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|