openbroker 1.9.6 → 1.12.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/CHANGELOG.md +35 -0
- package/README.md +52 -0
- package/SKILL.md +57 -5
- package/bin/cli.ts +11 -0
- package/dist/auto/examples/grid.js +1 -1
- package/dist/auto/examples/mm-maker.js +4 -4
- package/dist/auto/examples/mm-spread.js +4 -4
- package/dist/core/client.d.ts +83 -32
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +214 -29
- package/dist/core/types.d.ts +22 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/utils.d.ts +29 -0
- package/dist/core/utils.d.ts.map +1 -1
- package/dist/core/utils.js +27 -0
- package/dist/core/ws.d.ts +5 -0
- package/dist/core/ws.d.ts.map +1 -1
- package/dist/core/ws.js +9 -7
- package/dist/guardian/cli.d.ts +2 -0
- package/dist/guardian/cli.d.ts.map +1 -0
- package/dist/guardian/cli.js +288 -0
- package/dist/guardian/engine.d.ts +107 -0
- package/dist/guardian/engine.d.ts.map +1 -0
- package/dist/guardian/engine.js +526 -0
- package/dist/guardian/rules.d.ts +35 -0
- package/dist/guardian/rules.d.ts.map +1 -0
- package/dist/guardian/rules.js +237 -0
- package/dist/guardian/telegram.d.ts +24 -0
- package/dist/guardian/telegram.d.ts.map +1 -0
- package/dist/guardian/telegram.js +125 -0
- package/dist/guardian/types.d.ts +90 -0
- package/dist/guardian/types.d.ts.map +1 -0
- package/dist/guardian/types.js +45 -0
- package/dist/lib.d.ts +10 -1
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +6 -1
- package/dist/operations/advanced-orders.test.js +302 -13
- package/dist/operations/bracket.d.ts +35 -5
- package/dist/operations/bracket.d.ts.map +1 -1
- package/dist/operations/bracket.js +238 -64
- package/dist/operations/cancel.js +4 -1
- package/dist/operations/chase.d.ts +4 -2
- package/dist/operations/chase.d.ts.map +1 -1
- package/dist/operations/chase.js +61 -24
- package/dist/operations/scale.d.ts.map +1 -1
- package/dist/operations/scale.js +10 -1
- package/dist/operations/set-tpsl.js +69 -57
- package/dist/operations/trigger-order.js +18 -6
- package/dist/operations/twap.js +13 -1
- package/package.json +2 -2
- package/scripts/auto/examples/grid.ts +1 -1
- package/scripts/auto/examples/mm-maker.ts +4 -4
- package/scripts/auto/examples/mm-spread.ts +4 -4
- package/scripts/core/client.ts +278 -33
- package/scripts/core/types.ts +23 -0
- package/scripts/core/utils.ts +37 -0
- package/scripts/core/ws.ts +9 -6
- package/scripts/guardian/cli.ts +322 -0
- package/scripts/guardian/engine.ts +614 -0
- package/scripts/guardian/rules.ts +265 -0
- package/scripts/guardian/telegram.ts +147 -0
- package/scripts/guardian/types.ts +160 -0
- package/scripts/lib.ts +36 -0
- package/scripts/operations/advanced-orders.test.ts +347 -14
- package/scripts/operations/bracket.ts +252 -73
- package/scripts/operations/cancel.ts +4 -1
- package/scripts/operations/chase.ts +61 -26
- package/scripts/operations/scale.ts +10 -1
- package/scripts/operations/set-tpsl.ts +62 -57
- package/scripts/operations/trigger-order.ts +20 -6
- package/scripts/operations/twap.ts +14 -1
package/dist/core/client.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { HttpTransport, InfoClient, ExchangeClient } from '@nktkas/hyperliquid';
|
|
4
4
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
5
5
|
import { loadConfig, isMainnet } from './config.js';
|
|
6
|
-
import { roundPrice, roundSize } from './utils.js';
|
|
6
|
+
import { MIN_ORDER_NOTIONAL_USD, roundPrice, roundSize } from './utils.js';
|
|
7
7
|
export class HyperliquidClient {
|
|
8
8
|
config;
|
|
9
9
|
account;
|
|
@@ -1699,6 +1699,18 @@ export class HyperliquidClient {
|
|
|
1699
1699
|
}
|
|
1700
1700
|
return orders;
|
|
1701
1701
|
}
|
|
1702
|
+
/**
|
|
1703
|
+
* Open orders with frontend display fields (isTrigger, reduceOnly,
|
|
1704
|
+
* isPositionTpsl, …) for one dex — empty/omitted dex = main. Unlike
|
|
1705
|
+
* getOpenOrders this does NOT aggregate HIP-3 dexes; callers that need a
|
|
1706
|
+
* HIP-3 book pass its dex name explicitly.
|
|
1707
|
+
*/
|
|
1708
|
+
async getFrontendOpenOrders(user, dex) {
|
|
1709
|
+
const target = (user ?? this.address);
|
|
1710
|
+
this.log('Fetching frontendOpenOrders for:', target, dex ? `(dex: ${dex})` : '');
|
|
1711
|
+
const response = await this.withRetry(() => this.info.frontendOpenOrders(dex ? { user: target, dex } : { user: target }), 'frontendOpenOrders');
|
|
1712
|
+
return response;
|
|
1713
|
+
}
|
|
1702
1714
|
// ============ Trading ============
|
|
1703
1715
|
/**
|
|
1704
1716
|
* HIP-3 perps: prepare for trading.
|
|
@@ -1877,8 +1889,10 @@ export class HyperliquidClient {
|
|
|
1877
1889
|
* @param limitPrice - Limit price for the order (use triggerPrice for market-like execution)
|
|
1878
1890
|
* @param tpsl - 'tp' for take profit, 'sl' for stop loss
|
|
1879
1891
|
* @param reduceOnly - Whether order is reduce-only (should be true for TP/SL)
|
|
1892
|
+
* @param isMarket - Execute as a market trigger on fire; limitPrice then only
|
|
1893
|
+
* caps the fill (slippage band) instead of resting on the book
|
|
1880
1894
|
*/
|
|
1881
|
-
async triggerOrder(coin, isBuy, size, triggerPrice, limitPrice, tpsl, reduceOnly = true, leverage) {
|
|
1895
|
+
async triggerOrder(coin, isBuy, size, triggerPrice, limitPrice, tpsl, reduceOnly = true, leverage, isMarket = false) {
|
|
1882
1896
|
await this.requireTrading();
|
|
1883
1897
|
await this.getMetaAndAssetCtxs();
|
|
1884
1898
|
// Set leverage if specified (for main perps)
|
|
@@ -1890,9 +1904,8 @@ export class HyperliquidClient {
|
|
|
1890
1904
|
await this.ensureHip3Ready(coin, size * limitPrice, leverage);
|
|
1891
1905
|
const assetIndex = this.getAssetIndex(coin);
|
|
1892
1906
|
const szDecimals = this.getSzDecimals(coin);
|
|
1893
|
-
//
|
|
1894
|
-
// isMarket: false
|
|
1895
|
-
// For stop loss, we typically want some slippage protection
|
|
1907
|
+
// isMarket: true fires as a market order capped by limitPrice (slippage band);
|
|
1908
|
+
// isMarket: false rests as a limit order at limitPrice once triggered.
|
|
1896
1909
|
const orderWire = {
|
|
1897
1910
|
a: assetIndex,
|
|
1898
1911
|
b: isBuy,
|
|
@@ -1902,7 +1915,7 @@ export class HyperliquidClient {
|
|
|
1902
1915
|
t: {
|
|
1903
1916
|
trigger: {
|
|
1904
1917
|
triggerPx: roundPrice(triggerPrice, szDecimals),
|
|
1905
|
-
isMarket
|
|
1918
|
+
isMarket,
|
|
1906
1919
|
tpsl,
|
|
1907
1920
|
},
|
|
1908
1921
|
},
|
|
@@ -1931,17 +1944,23 @@ export class HyperliquidClient {
|
|
|
1931
1944
|
}
|
|
1932
1945
|
}
|
|
1933
1946
|
/**
|
|
1934
|
-
* Place a stop loss order
|
|
1947
|
+
* Place a stop loss order.
|
|
1948
|
+
*
|
|
1949
|
+
* Executes as a market trigger by default: in a gap move that jumps past the
|
|
1950
|
+
* trigger, a stop-limit's band can be skipped entirely and the position sits
|
|
1951
|
+
* unprotected — the exact scenario an SL exists for. The limit price still
|
|
1952
|
+
* caps the fill at `slippageBps` past the trigger. Pass `isMarket: false`
|
|
1953
|
+
* for the stop-limit variant (rests at the band price once triggered).
|
|
1935
1954
|
*/
|
|
1936
|
-
async stopLoss(coin, isBuy, size, triggerPrice, slippageBps = 100 // 1% slippage for SL execution
|
|
1937
|
-
) {
|
|
1938
|
-
//
|
|
1955
|
+
async stopLoss(coin, isBuy, size, triggerPrice, slippageBps = 100, // 1% slippage cap for SL execution
|
|
1956
|
+
isMarket = true) {
|
|
1957
|
+
// Limit price sits worse than trigger to ensure fill
|
|
1939
1958
|
// Buy SL: limit above trigger, Sell SL: limit below trigger
|
|
1940
1959
|
const slippageMult = slippageBps / 10000;
|
|
1941
1960
|
const limitPrice = isBuy
|
|
1942
1961
|
? triggerPrice * (1 + slippageMult)
|
|
1943
1962
|
: triggerPrice * (1 - slippageMult);
|
|
1944
|
-
return this.triggerOrder(coin, isBuy, size, triggerPrice, limitPrice, 'sl', true);
|
|
1963
|
+
return this.triggerOrder(coin, isBuy, size, triggerPrice, limitPrice, 'sl', true, undefined, isMarket);
|
|
1945
1964
|
}
|
|
1946
1965
|
/**
|
|
1947
1966
|
* Place a take profit order
|
|
@@ -1951,11 +1970,27 @@ export class HyperliquidClient {
|
|
|
1951
1970
|
return this.triggerOrder(coin, isBuy, size, triggerPrice, triggerPrice, 'tp', true);
|
|
1952
1971
|
}
|
|
1953
1972
|
/**
|
|
1954
|
-
* Place
|
|
1955
|
-
*
|
|
1956
|
-
*
|
|
1973
|
+
* Place TP and/or SL triggers for an open position in one batch.
|
|
1974
|
+
*
|
|
1975
|
+
* Defaults to Hyperliquid's `positionTpsl` grouping: the triggers are tied
|
|
1976
|
+
* to the open position (cancelled when it closes, OCO between themselves)
|
|
1977
|
+
* — the same mechanism the Hyperliquid frontend uses for position TP/SL.
|
|
1978
|
+
* `normalTpsl` is available for a standalone OCO pair not bound to the
|
|
1979
|
+
* position. SL executes as a market trigger by default with the limit price
|
|
1980
|
+
* capping the fill `slSlippageBps` past the trigger (see `stopLoss`).
|
|
1981
|
+
*
|
|
1982
|
+
* `isBuy` is the EXIT side (opposite of the position direction). Statuses
|
|
1983
|
+
* in the response align with the orders sent: TP first (when present),
|
|
1984
|
+
* then SL.
|
|
1957
1985
|
*/
|
|
1958
|
-
async
|
|
1986
|
+
async tpslOrders(coin, isBuy, size, opts = {}) {
|
|
1987
|
+
const { takeProfitPrice, stopLossPrice, leverage } = opts;
|
|
1988
|
+
const stopLossSlippageBps = opts.stopLossSlippageBps ?? 100;
|
|
1989
|
+
const stopLossIsMarket = opts.stopLossIsMarket ?? true;
|
|
1990
|
+
const grouping = opts.grouping ?? 'positionTpsl';
|
|
1991
|
+
if (takeProfitPrice === undefined && stopLossPrice === undefined) {
|
|
1992
|
+
throw new Error('tpslOrders requires takeProfitPrice, stopLossPrice, or both');
|
|
1993
|
+
}
|
|
1959
1994
|
await this.requireTrading();
|
|
1960
1995
|
await this.getMetaAndAssetCtxs();
|
|
1961
1996
|
if (leverage && !this.isHip3(coin)) {
|
|
@@ -1963,15 +1998,19 @@ export class HyperliquidClient {
|
|
|
1963
1998
|
await this.updateLeverage(coin, leverage, true);
|
|
1964
1999
|
}
|
|
1965
2000
|
const slippageMult = stopLossSlippageBps / 10000;
|
|
1966
|
-
const stopLossLimitPrice =
|
|
1967
|
-
?
|
|
1968
|
-
:
|
|
1969
|
-
|
|
2001
|
+
const stopLossLimitPrice = stopLossPrice === undefined
|
|
2002
|
+
? undefined
|
|
2003
|
+
: isBuy
|
|
2004
|
+
? stopLossPrice * (1 + slippageMult)
|
|
2005
|
+
: stopLossPrice * (1 - slippageMult);
|
|
2006
|
+
const worstPrice = Math.max(takeProfitPrice ?? 0, stopLossLimitPrice ?? 0);
|
|
2007
|
+
await this.ensureHip3Ready(coin, size * worstPrice, leverage);
|
|
1970
2008
|
const assetIndex = this.getAssetIndex(coin);
|
|
1971
2009
|
const szDecimals = this.getSzDecimals(coin);
|
|
1972
2010
|
const roundedSize = roundSize(size, szDecimals);
|
|
1973
|
-
const orderWires = [
|
|
1974
|
-
|
|
2011
|
+
const orderWires = [];
|
|
2012
|
+
if (takeProfitPrice !== undefined) {
|
|
2013
|
+
orderWires.push({
|
|
1975
2014
|
a: assetIndex,
|
|
1976
2015
|
b: isBuy,
|
|
1977
2016
|
p: roundPrice(takeProfitPrice, szDecimals),
|
|
@@ -1984,8 +2023,10 @@ export class HyperliquidClient {
|
|
|
1984
2023
|
tpsl: 'tp',
|
|
1985
2024
|
},
|
|
1986
2025
|
},
|
|
1987
|
-
}
|
|
1988
|
-
|
|
2026
|
+
});
|
|
2027
|
+
}
|
|
2028
|
+
if (stopLossPrice !== undefined) {
|
|
2029
|
+
orderWires.push({
|
|
1989
2030
|
a: assetIndex,
|
|
1990
2031
|
b: isBuy,
|
|
1991
2032
|
p: roundPrice(stopLossLimitPrice, szDecimals),
|
|
@@ -1994,12 +2035,126 @@ export class HyperliquidClient {
|
|
|
1994
2035
|
t: {
|
|
1995
2036
|
trigger: {
|
|
1996
2037
|
triggerPx: roundPrice(stopLossPrice, szDecimals),
|
|
1997
|
-
isMarket:
|
|
2038
|
+
isMarket: stopLossIsMarket,
|
|
1998
2039
|
tpsl: 'sl',
|
|
1999
2040
|
},
|
|
2000
2041
|
},
|
|
2042
|
+
});
|
|
2043
|
+
}
|
|
2044
|
+
const orderRequest = {
|
|
2045
|
+
orders: orderWires,
|
|
2046
|
+
grouping,
|
|
2047
|
+
};
|
|
2048
|
+
if (!this.isTestnet && this.config.builderAddress !== '0x0000000000000000000000000000000000000000') {
|
|
2049
|
+
orderRequest.builder = this.builderInfo;
|
|
2050
|
+
this.log('Including builder fee:', this.builderInfo);
|
|
2051
|
+
}
|
|
2052
|
+
try {
|
|
2053
|
+
const response = await this.exchange.order(orderRequest, this.vaultParam);
|
|
2054
|
+
this.log('TP/SL orders response:', JSON.stringify(response, null, 2));
|
|
2055
|
+
return response;
|
|
2056
|
+
}
|
|
2057
|
+
catch (error) {
|
|
2058
|
+
this.log('TP/SL orders error:', error);
|
|
2059
|
+
return {
|
|
2060
|
+
status: 'err',
|
|
2061
|
+
response: error instanceof Error ? error.message : String(error),
|
|
2062
|
+
};
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2065
|
+
/**
|
|
2066
|
+
* Place a paired TP/SL trigger set for an open position.
|
|
2067
|
+
*
|
|
2068
|
+
* Back-compat wrapper over `tpslOrders`. Since v1.10.0 this uses the
|
|
2069
|
+
* `positionTpsl` grouping (triggers track the open position and OCO-cancel)
|
|
2070
|
+
* instead of a standalone `normalTpsl` pair, and the SL fires as a market
|
|
2071
|
+
* trigger capped by the slippage band instead of a stop-limit.
|
|
2072
|
+
*/
|
|
2073
|
+
async tpslPair(coin, isBuy, size, takeProfitPrice, stopLossPrice, stopLossSlippageBps = 100, leverage) {
|
|
2074
|
+
return this.tpslOrders(coin, isBuy, size, {
|
|
2075
|
+
takeProfitPrice,
|
|
2076
|
+
stopLossPrice,
|
|
2077
|
+
stopLossSlippageBps,
|
|
2078
|
+
leverage,
|
|
2079
|
+
});
|
|
2080
|
+
}
|
|
2081
|
+
/**
|
|
2082
|
+
* Atomic bracket: a limit entry with TP/SL children in one `normalTpsl`
|
|
2083
|
+
* batch — exactly how the Hyperliquid frontend does order-attached TP/SL.
|
|
2084
|
+
* The children arm only when the entry fills and are sized to it; their
|
|
2085
|
+
* statuses come back as the plain strings "waitingForFill" /
|
|
2086
|
+
* "waitingForTrigger" (parse with `parseOrderStatus`).
|
|
2087
|
+
*
|
|
2088
|
+
* `isBuy` is the ENTRY side; exits are placed on the opposite side,
|
|
2089
|
+
* reduce-only. Statuses align with [entry, tp?, sl?].
|
|
2090
|
+
*/
|
|
2091
|
+
async bracketOrder(coin, isBuy, size, entryPrice, opts = {}) {
|
|
2092
|
+
const { takeProfitPrice, stopLossPrice, leverage } = opts;
|
|
2093
|
+
const entryTif = opts.entryTif ?? 'Gtc';
|
|
2094
|
+
const stopLossSlippageBps = opts.stopLossSlippageBps ?? 100;
|
|
2095
|
+
const stopLossIsMarket = opts.stopLossIsMarket ?? true;
|
|
2096
|
+
if (takeProfitPrice === undefined && stopLossPrice === undefined) {
|
|
2097
|
+
throw new Error('bracketOrder requires takeProfitPrice, stopLossPrice, or both');
|
|
2098
|
+
}
|
|
2099
|
+
await this.requireTrading();
|
|
2100
|
+
await this.getMetaAndAssetCtxs();
|
|
2101
|
+
if (leverage && !this.isHip3(coin)) {
|
|
2102
|
+
this.log(`Setting leverage for ${coin} to ${leverage}x cross`);
|
|
2103
|
+
await this.updateLeverage(coin, leverage, true);
|
|
2104
|
+
}
|
|
2105
|
+
await this.ensureHip3Ready(coin, size * entryPrice, leverage);
|
|
2106
|
+
const assetIndex = this.getAssetIndex(coin);
|
|
2107
|
+
const szDecimals = this.getSzDecimals(coin);
|
|
2108
|
+
const roundedSize = roundSize(size, szDecimals);
|
|
2109
|
+
const exitBuy = !isBuy;
|
|
2110
|
+
const slippageMult = stopLossSlippageBps / 10000;
|
|
2111
|
+
const stopLossLimitPrice = stopLossPrice === undefined
|
|
2112
|
+
? undefined
|
|
2113
|
+
: exitBuy
|
|
2114
|
+
? stopLossPrice * (1 + slippageMult)
|
|
2115
|
+
: stopLossPrice * (1 - slippageMult);
|
|
2116
|
+
const orderWires = [
|
|
2117
|
+
{
|
|
2118
|
+
a: assetIndex,
|
|
2119
|
+
b: isBuy,
|
|
2120
|
+
p: roundPrice(entryPrice, szDecimals),
|
|
2121
|
+
s: roundedSize,
|
|
2122
|
+
r: false,
|
|
2123
|
+
t: { limit: { tif: entryTif } },
|
|
2001
2124
|
},
|
|
2002
2125
|
];
|
|
2126
|
+
if (takeProfitPrice !== undefined) {
|
|
2127
|
+
orderWires.push({
|
|
2128
|
+
a: assetIndex,
|
|
2129
|
+
b: exitBuy,
|
|
2130
|
+
p: roundPrice(takeProfitPrice, szDecimals),
|
|
2131
|
+
s: roundedSize,
|
|
2132
|
+
r: true,
|
|
2133
|
+
t: {
|
|
2134
|
+
trigger: {
|
|
2135
|
+
triggerPx: roundPrice(takeProfitPrice, szDecimals),
|
|
2136
|
+
isMarket: false,
|
|
2137
|
+
tpsl: 'tp',
|
|
2138
|
+
},
|
|
2139
|
+
},
|
|
2140
|
+
});
|
|
2141
|
+
}
|
|
2142
|
+
if (stopLossPrice !== undefined) {
|
|
2143
|
+
orderWires.push({
|
|
2144
|
+
a: assetIndex,
|
|
2145
|
+
b: exitBuy,
|
|
2146
|
+
p: roundPrice(stopLossLimitPrice, szDecimals),
|
|
2147
|
+
s: roundedSize,
|
|
2148
|
+
r: true,
|
|
2149
|
+
t: {
|
|
2150
|
+
trigger: {
|
|
2151
|
+
triggerPx: roundPrice(stopLossPrice, szDecimals),
|
|
2152
|
+
isMarket: stopLossIsMarket,
|
|
2153
|
+
tpsl: 'sl',
|
|
2154
|
+
},
|
|
2155
|
+
},
|
|
2156
|
+
});
|
|
2157
|
+
}
|
|
2003
2158
|
const orderRequest = {
|
|
2004
2159
|
orders: orderWires,
|
|
2005
2160
|
grouping: 'normalTpsl',
|
|
@@ -2010,25 +2165,32 @@ export class HyperliquidClient {
|
|
|
2010
2165
|
}
|
|
2011
2166
|
try {
|
|
2012
2167
|
const response = await this.exchange.order(orderRequest, this.vaultParam);
|
|
2013
|
-
this.log('
|
|
2168
|
+
this.log('Bracket order response:', JSON.stringify(response, null, 2));
|
|
2014
2169
|
return response;
|
|
2015
2170
|
}
|
|
2016
2171
|
catch (error) {
|
|
2017
|
-
this.log('
|
|
2172
|
+
this.log('Bracket order error:', error);
|
|
2018
2173
|
return {
|
|
2019
2174
|
status: 'err',
|
|
2020
2175
|
response: error instanceof Error ? error.message : String(error),
|
|
2021
2176
|
};
|
|
2022
2177
|
}
|
|
2023
2178
|
}
|
|
2024
|
-
|
|
2179
|
+
/**
|
|
2180
|
+
* `fast: true` sets the action's `f` flag so the mempool prioritizes the cancel
|
|
2181
|
+
* (post-2026-07 upgrade, only fast cancels get prioritization). The API REJECTS
|
|
2182
|
+
* fast cancels for trigger orders (TP/SL), so only pass it when the oid is known
|
|
2183
|
+
* to be a plain resting limit — e.g. a quoting loop cancelling its own quotes.
|
|
2184
|
+
*/
|
|
2185
|
+
async cancel(coin, oid, opts) {
|
|
2025
2186
|
await this.requireTrading();
|
|
2026
2187
|
await this.getMetaAndAssetCtxs();
|
|
2027
2188
|
const assetIndex = this.getAssetIndex(coin);
|
|
2028
|
-
this.log(`Cancelling order: ${coin} (asset ${assetIndex}) oid ${oid}`);
|
|
2189
|
+
this.log(`Cancelling order: ${coin} (asset ${assetIndex}) oid ${oid}${opts?.fast ? ' (fast)' : ''}`);
|
|
2029
2190
|
try {
|
|
2030
2191
|
const response = await this.exchange.cancel({
|
|
2031
2192
|
cancels: [{ a: assetIndex, o: oid }],
|
|
2193
|
+
...(opts?.fast ? { f: true } : {}),
|
|
2032
2194
|
}, this.vaultParam);
|
|
2033
2195
|
this.log('Cancel response:', JSON.stringify(response, null, 2));
|
|
2034
2196
|
return response;
|
|
@@ -2044,8 +2206,9 @@ export class HyperliquidClient {
|
|
|
2044
2206
|
/**
|
|
2045
2207
|
* Cancel MANY resting orders in a SINGLE exchange request (one action-rate request for ≤40 cancels),
|
|
2046
2208
|
* the counterpart to `bulkOrder`. `response.data.statuses[i]` aligns with `cancels[i]`.
|
|
2209
|
+
* `fast` applies to the whole action and is rejected for trigger orders — see cancel().
|
|
2047
2210
|
*/
|
|
2048
|
-
async bulkCancel(cancels) {
|
|
2211
|
+
async bulkCancel(cancels, opts) {
|
|
2049
2212
|
await this.requireTrading();
|
|
2050
2213
|
await this.getMetaAndAssetCtxs();
|
|
2051
2214
|
if (cancels.length === 0)
|
|
@@ -2053,6 +2216,7 @@ export class HyperliquidClient {
|
|
|
2053
2216
|
try {
|
|
2054
2217
|
const response = await this.exchange.cancel({
|
|
2055
2218
|
cancels: cancels.map((c) => ({ a: this.getAssetIndex(c.coin), o: c.oid })),
|
|
2219
|
+
...(opts?.fast ? { f: true } : {}),
|
|
2056
2220
|
}, this.vaultParam);
|
|
2057
2221
|
this.log('Bulk cancel response:', JSON.stringify(response, null, 2));
|
|
2058
2222
|
return response;
|
|
@@ -2341,6 +2505,27 @@ export class HyperliquidClient {
|
|
|
2341
2505
|
*/
|
|
2342
2506
|
async twapOrder(coin, isBuy, size, durationMinutes, randomize = true, reduceOnly = false, leverage) {
|
|
2343
2507
|
await this.getMetaAndAssetCtxs();
|
|
2508
|
+
if (!Number.isFinite(durationMinutes) || durationMinutes < 5 || durationMinutes > 1440) {
|
|
2509
|
+
throw new Error('TWAP duration must be between 5 and 1440 minutes');
|
|
2510
|
+
}
|
|
2511
|
+
// Native TWAP fires a sub-order every 30s; each must clear the exchange
|
|
2512
|
+
// minimum notional or the venue silently skips slices.
|
|
2513
|
+
if (!reduceOnly) {
|
|
2514
|
+
try {
|
|
2515
|
+
const mid = parseFloat((await this.getAllMids())[coin]);
|
|
2516
|
+
if (Number.isFinite(mid) && mid > 0) {
|
|
2517
|
+
const perSlice = (size * mid) / Math.max(1, Math.round(durationMinutes) * 2);
|
|
2518
|
+
if (perSlice < MIN_ORDER_NOTIONAL_USD) {
|
|
2519
|
+
throw new Error(`TWAP slices of ~$${perSlice.toFixed(2)} fall below the $${MIN_ORDER_NOTIONAL_USD} exchange minimum — shorten the duration or increase the size`);
|
|
2520
|
+
}
|
|
2521
|
+
}
|
|
2522
|
+
}
|
|
2523
|
+
catch (error) {
|
|
2524
|
+
if (error instanceof Error && error.message.includes('exchange minimum'))
|
|
2525
|
+
throw error;
|
|
2526
|
+
this.log('TWAP min-notional pre-check skipped (no mid available):', error);
|
|
2527
|
+
}
|
|
2528
|
+
}
|
|
2344
2529
|
if (leverage) {
|
|
2345
2530
|
await this.updateLeverage(coin, leverage);
|
|
2346
2531
|
}
|
package/dist/core/types.d.ts
CHANGED
|
@@ -210,6 +210,28 @@ export interface OpenOrder {
|
|
|
210
210
|
origSz: string;
|
|
211
211
|
timestamp: number;
|
|
212
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Open order from the `frontendOpenOrders` info endpoint — same as OpenOrder
|
|
215
|
+
* plus the trigger/reduce-only display fields (needed to distinguish resting
|
|
216
|
+
* TP/SL protection from plain limit orders).
|
|
217
|
+
*/
|
|
218
|
+
export interface FrontendOpenOrder {
|
|
219
|
+
coin: string;
|
|
220
|
+
side: 'B' | 'A';
|
|
221
|
+
limitPx: string;
|
|
222
|
+
sz: string;
|
|
223
|
+
oid: number;
|
|
224
|
+
timestamp: number;
|
|
225
|
+
origSz: string;
|
|
226
|
+
triggerCondition: string;
|
|
227
|
+
isTrigger: boolean;
|
|
228
|
+
triggerPx: string;
|
|
229
|
+
isPositionTpsl: boolean;
|
|
230
|
+
reduceOnly: boolean;
|
|
231
|
+
orderType: string;
|
|
232
|
+
tif: string | null;
|
|
233
|
+
cloid: string | null;
|
|
234
|
+
}
|
|
213
235
|
export interface InfoRequest {
|
|
214
236
|
type: string;
|
|
215
237
|
user?: string;
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../scripts/core/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../scripts/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/utils.d.ts
CHANGED
|
@@ -45,6 +45,35 @@ export declare function normalizeCoin(coin: string): string;
|
|
|
45
45
|
* Sleep for specified milliseconds
|
|
46
46
|
*/
|
|
47
47
|
export declare function sleep(ms: number): Promise<void>;
|
|
48
|
+
/** Hyperliquid rejects orders below this notional (waived for reduce-only). */
|
|
49
|
+
export declare const MIN_ORDER_NOTIONAL_USD = 10;
|
|
50
|
+
export type ParsedOrderStatus = {
|
|
51
|
+
kind: 'resting';
|
|
52
|
+
oid: number;
|
|
53
|
+
} | {
|
|
54
|
+
kind: 'filled';
|
|
55
|
+
totalSz: number;
|
|
56
|
+
avgPx: number;
|
|
57
|
+
oid: number;
|
|
58
|
+
}
|
|
59
|
+
/** normalTpsl children behind an unfilled parent — success states, not errors. */
|
|
60
|
+
| {
|
|
61
|
+
kind: 'waiting';
|
|
62
|
+
state: 'waitingForFill' | 'waitingForTrigger';
|
|
63
|
+
} | {
|
|
64
|
+
kind: 'error';
|
|
65
|
+
error: string;
|
|
66
|
+
} | {
|
|
67
|
+
kind: 'unknown';
|
|
68
|
+
raw: unknown;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Parse a single entry of an order response's `statuses` array. Handles the
|
|
72
|
+
* plain-string success states ("waitingForFill" / "waitingForTrigger") that
|
|
73
|
+
* Hyperliquid returns for normalTpsl children armed behind an unfilled parent,
|
|
74
|
+
* alongside the usual resting/filled/error objects.
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseOrderStatus(status: unknown): ParsedOrderStatus;
|
|
48
77
|
/**
|
|
49
78
|
* Generate a random client order ID
|
|
50
79
|
*/
|
package/dist/core/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../scripts/core/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,MAAM,CAM7F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GAClB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,SAAS,CAeX;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAGlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGxE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAmB1E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACrG,OAAO,CAAC,OAAO,CAAC,CAYlB"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../scripts/core/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,MAAM,CAM7F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,GAClB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,SAAS,CAeX;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAGlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAGxE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAmB1E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,+EAA+E;AAC/E,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AACjE,kFAAkF;GAChF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,iBAAiB,CAkBnE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACrG,OAAO,CAAC,OAAO,CAAC,CAYlB"}
|
package/dist/core/utils.js
CHANGED
|
@@ -112,6 +112,33 @@ export function normalizeCoin(coin) {
|
|
|
112
112
|
export function sleep(ms) {
|
|
113
113
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
114
114
|
}
|
|
115
|
+
/** Hyperliquid rejects orders below this notional (waived for reduce-only). */
|
|
116
|
+
export const MIN_ORDER_NOTIONAL_USD = 10;
|
|
117
|
+
/**
|
|
118
|
+
* Parse a single entry of an order response's `statuses` array. Handles the
|
|
119
|
+
* plain-string success states ("waitingForFill" / "waitingForTrigger") that
|
|
120
|
+
* Hyperliquid returns for normalTpsl children armed behind an unfilled parent,
|
|
121
|
+
* alongside the usual resting/filled/error objects.
|
|
122
|
+
*/
|
|
123
|
+
export function parseOrderStatus(status) {
|
|
124
|
+
if (status === 'waitingForFill' || status === 'waitingForTrigger') {
|
|
125
|
+
return { kind: 'waiting', state: status };
|
|
126
|
+
}
|
|
127
|
+
if (status && typeof status === 'object') {
|
|
128
|
+
const data = status;
|
|
129
|
+
if (data.resting) {
|
|
130
|
+
return { kind: 'resting', oid: data.resting.oid };
|
|
131
|
+
}
|
|
132
|
+
if (data.filled) {
|
|
133
|
+
const f = data.filled;
|
|
134
|
+
return { kind: 'filled', totalSz: parseFloat(f.totalSz), avgPx: parseFloat(f.avgPx), oid: f.oid };
|
|
135
|
+
}
|
|
136
|
+
if (data.error) {
|
|
137
|
+
return { kind: 'error', error: String(data.error) };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return { kind: 'unknown', raw: status };
|
|
141
|
+
}
|
|
115
142
|
/**
|
|
116
143
|
* Generate a random client order ID
|
|
117
144
|
*/
|
package/dist/core/ws.d.ts
CHANGED
|
@@ -159,6 +159,11 @@ export declare class WebSocketManager {
|
|
|
159
159
|
subscribeAllMids(): Promise<ISubscription>;
|
|
160
160
|
/**
|
|
161
161
|
* Subscribe to L2 order book snapshots for a specific coin.
|
|
162
|
+
*
|
|
163
|
+
* `fast: true` = 5 levels every 0.5s; without it the API degrades to 20 levels
|
|
164
|
+
* every 5s (per the 2026-07 network-upgrade announcement). Every consumer here
|
|
165
|
+
* reads top-of-book only (chase / mm quoting / mid fallback), so fast wins;
|
|
166
|
+
* anything needing depth should use the REST l2Book, which stays full-depth.
|
|
162
167
|
*/
|
|
163
168
|
subscribeL2Book(coin: string): Promise<ISubscription>;
|
|
164
169
|
/**
|
package/dist/core/ws.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../scripts/core/ws.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../scripts/core/ws.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ws.js
CHANGED
|
@@ -114,13 +114,10 @@ export class WebSocketManager {
|
|
|
114
114
|
return this.client;
|
|
115
115
|
}
|
|
116
116
|
trackSub(sub) {
|
|
117
|
+
// SDK ≥0.33 dropped ISubscription.failureSignal, so a sub that dies after a
|
|
118
|
+
// failed resubscribe stays in this list; close() swallows unsubscribe errors,
|
|
119
|
+
// so a dead handle there is harmless.
|
|
117
120
|
this.subscriptions.push(sub);
|
|
118
|
-
sub.failureSignal.addEventListener('abort', () => {
|
|
119
|
-
this.log('Subscription failed, removing from tracked list');
|
|
120
|
-
const idx = this.subscriptions.indexOf(sub);
|
|
121
|
-
if (idx >= 0)
|
|
122
|
-
this.subscriptions.splice(idx, 1);
|
|
123
|
-
});
|
|
124
121
|
return sub;
|
|
125
122
|
}
|
|
126
123
|
// ── Market data subscriptions ──────────────────────────────────
|
|
@@ -136,10 +133,15 @@ export class WebSocketManager {
|
|
|
136
133
|
}
|
|
137
134
|
/**
|
|
138
135
|
* Subscribe to L2 order book snapshots for a specific coin.
|
|
136
|
+
*
|
|
137
|
+
* `fast: true` = 5 levels every 0.5s; without it the API degrades to 20 levels
|
|
138
|
+
* every 5s (per the 2026-07 network-upgrade announcement). Every consumer here
|
|
139
|
+
* reads top-of-book only (chase / mm quoting / mid fallback), so fast wins;
|
|
140
|
+
* anything needing depth should use the REST l2Book, which stays full-depth.
|
|
139
141
|
*/
|
|
140
142
|
async subscribeL2Book(coin) {
|
|
141
143
|
const client = this.ensureClient();
|
|
142
|
-
const sub = await client.l2Book({ coin }, (data) => {
|
|
144
|
+
const sub = await client.l2Book({ coin, fast: true }, (data) => {
|
|
143
145
|
this.emit('l2Book', {
|
|
144
146
|
coin: data.coin,
|
|
145
147
|
time: data.time,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../scripts/guardian/cli.ts"],"names":[],"mappings":""}
|