@stableflow/hyperliquid 0.0.0-experimental-5a8afd7389-20260703
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 +37 -0
- package/dist/index.d.mts +75 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +119 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +36 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 StableFlow AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# @stableflow/hyperliquid
|
|
2
|
+
|
|
3
|
+
Hyperliquid deposit helpers for the StableFlow SDK: quote via OneClick, transfer on source chain, permit + deposit to Hyperliquid, and status polling.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @stableflow/hyperliquid @stableflow/core @stableflow/bridges
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Install wallet adapters for the source chain (e.g. `@stableflow/wallet-evm`, `@stableflow/wallet-solana`) and an EVM wallet on Arbitrum for USDC permit signing.
|
|
12
|
+
|
|
13
|
+
## Main exports
|
|
14
|
+
|
|
15
|
+
| Export | Description |
|
|
16
|
+
|--------|-------------|
|
|
17
|
+
| `Hyperliquid` | Service instance: `quote`, `transfer`, `deposit`, `getStatus` |
|
|
18
|
+
| `HyperliquidFromTokens` | Supported source tokens |
|
|
19
|
+
| `HyperliuquidToToken` | Destination token (USDC on Arbitrum) — note typo in export name |
|
|
20
|
+
| `HyperliuquidMinAmount` | Minimum `amountWei` for quotes — note typo in export name |
|
|
21
|
+
|
|
22
|
+
Types: `HyperliquidQuoteParams`, `HyperliquidTransferParams`, `HyperliquidDepositParams`, `HyperliquidGetStatusParams`, …
|
|
23
|
+
|
|
24
|
+
## Flow
|
|
25
|
+
|
|
26
|
+
1. `Hyperliquid.quote({ dry: true, ... })` — fast estimate (default `dry: true`)
|
|
27
|
+
2. `Hyperliquid.quote({ dry: false, ... })` — obtain deposit address before transfer
|
|
28
|
+
3. `Hyperliquid.transfer({ wallet, quote })` — source-chain deposit tx
|
|
29
|
+
4. `Hyperliquid.deposit({ evmWallet, evmWalletAddress, quote, txhash })` — Arbitrum USDC permit + API deposit
|
|
30
|
+
5. `Hyperliquid.getStatus({ depositId })` — poll deposit status
|
|
31
|
+
|
|
32
|
+
See [Developer Guide](../../DEVELOPER_GUIDE.md#hyperliquid) for details.
|
|
33
|
+
|
|
34
|
+
## See also
|
|
35
|
+
|
|
36
|
+
- [@stableflow/bridges](../bridges/README.md)
|
|
37
|
+
- [@stableflow/core](../core/README.md)
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { WalletConfig, TokenConfig } from '@stableflow/core';
|
|
2
|
+
|
|
3
|
+
declare class HyperliquidService {
|
|
4
|
+
quote(params: HyperliquidQuoteParams): Promise<{
|
|
5
|
+
quote: any;
|
|
6
|
+
error: string | null;
|
|
7
|
+
}>;
|
|
8
|
+
transfer(params: HyperliquidTransferParams): Promise<string>;
|
|
9
|
+
deposit(params: HyperliquidDepositParams): Promise<HyperliquidDepositResponse>;
|
|
10
|
+
getStatus(params: HyperliquidGetStatusParams): Promise<HyperliquidDepositStatusResponse>;
|
|
11
|
+
protected generatePermit(params: HyperliquidGeneratePermitParams): Promise<{
|
|
12
|
+
amount: any;
|
|
13
|
+
deadline: any;
|
|
14
|
+
owner: any;
|
|
15
|
+
r: any;
|
|
16
|
+
s: any;
|
|
17
|
+
spender: string;
|
|
18
|
+
token: string;
|
|
19
|
+
v: any;
|
|
20
|
+
nonce: any;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
declare const Hyperliquid: HyperliquidService;
|
|
24
|
+
declare const HyperliquidFromTokens: TokenConfig[];
|
|
25
|
+
declare const HyperliuquidToToken: TokenConfig;
|
|
26
|
+
declare const HyperliuquidMinAmount: string;
|
|
27
|
+
interface HyperliquidQuoteParams {
|
|
28
|
+
slippageTolerance: number;
|
|
29
|
+
refundTo: string;
|
|
30
|
+
recipient: string;
|
|
31
|
+
wallet: WalletConfig;
|
|
32
|
+
fromToken: TokenConfig;
|
|
33
|
+
prices: Record<string, string>;
|
|
34
|
+
amountWei: string;
|
|
35
|
+
dry?: boolean;
|
|
36
|
+
oneclickParams?: {
|
|
37
|
+
appFees?: {
|
|
38
|
+
recipient: string;
|
|
39
|
+
fee: number;
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
interface HyperliquidTransferParams {
|
|
44
|
+
wallet: WalletConfig;
|
|
45
|
+
evmWallet: WalletConfig;
|
|
46
|
+
evmWalletAddress: string;
|
|
47
|
+
quote: any;
|
|
48
|
+
}
|
|
49
|
+
interface HyperliquidGeneratePermitParams {
|
|
50
|
+
evmWalletAddress: string;
|
|
51
|
+
evmWallet: WalletConfig;
|
|
52
|
+
amountWei: string;
|
|
53
|
+
}
|
|
54
|
+
interface HyperliquidDepositParams extends HyperliquidTransferParams {
|
|
55
|
+
txhash: string;
|
|
56
|
+
}
|
|
57
|
+
interface HyperliquidGetStatusParams {
|
|
58
|
+
depositId: string;
|
|
59
|
+
}
|
|
60
|
+
interface HyperliquidResponse<T> {
|
|
61
|
+
code: number;
|
|
62
|
+
data: T;
|
|
63
|
+
}
|
|
64
|
+
interface HyperliquidDepositResponseData {
|
|
65
|
+
depositId: number;
|
|
66
|
+
}
|
|
67
|
+
type HyperliquidDepositResponse = HyperliquidResponse<HyperliquidDepositResponseData>;
|
|
68
|
+
type HyperliquidDepositStatus = "PROCESSING" | "SUCCESS" | "REFUNDED" | "FAILED";
|
|
69
|
+
interface HyperliquidDepositStatusResponseData {
|
|
70
|
+
status: HyperliquidDepositStatus;
|
|
71
|
+
txHash: string;
|
|
72
|
+
}
|
|
73
|
+
type HyperliquidDepositStatusResponse = HyperliquidResponse<HyperliquidDepositStatusResponseData>;
|
|
74
|
+
|
|
75
|
+
export { Hyperliquid, type HyperliquidDepositParams, type HyperliquidDepositResponse, type HyperliquidDepositResponseData, type HyperliquidDepositStatus, type HyperliquidDepositStatusResponse, type HyperliquidDepositStatusResponseData, HyperliquidFromTokens, type HyperliquidGeneratePermitParams, type HyperliquidGetStatusParams, type HyperliquidQuoteParams, type HyperliquidResponse, type HyperliquidTransferParams, HyperliuquidMinAmount, HyperliuquidToToken };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { WalletConfig, TokenConfig } from '@stableflow/core';
|
|
2
|
+
|
|
3
|
+
declare class HyperliquidService {
|
|
4
|
+
quote(params: HyperliquidQuoteParams): Promise<{
|
|
5
|
+
quote: any;
|
|
6
|
+
error: string | null;
|
|
7
|
+
}>;
|
|
8
|
+
transfer(params: HyperliquidTransferParams): Promise<string>;
|
|
9
|
+
deposit(params: HyperliquidDepositParams): Promise<HyperliquidDepositResponse>;
|
|
10
|
+
getStatus(params: HyperliquidGetStatusParams): Promise<HyperliquidDepositStatusResponse>;
|
|
11
|
+
protected generatePermit(params: HyperliquidGeneratePermitParams): Promise<{
|
|
12
|
+
amount: any;
|
|
13
|
+
deadline: any;
|
|
14
|
+
owner: any;
|
|
15
|
+
r: any;
|
|
16
|
+
s: any;
|
|
17
|
+
spender: string;
|
|
18
|
+
token: string;
|
|
19
|
+
v: any;
|
|
20
|
+
nonce: any;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
declare const Hyperliquid: HyperliquidService;
|
|
24
|
+
declare const HyperliquidFromTokens: TokenConfig[];
|
|
25
|
+
declare const HyperliuquidToToken: TokenConfig;
|
|
26
|
+
declare const HyperliuquidMinAmount: string;
|
|
27
|
+
interface HyperliquidQuoteParams {
|
|
28
|
+
slippageTolerance: number;
|
|
29
|
+
refundTo: string;
|
|
30
|
+
recipient: string;
|
|
31
|
+
wallet: WalletConfig;
|
|
32
|
+
fromToken: TokenConfig;
|
|
33
|
+
prices: Record<string, string>;
|
|
34
|
+
amountWei: string;
|
|
35
|
+
dry?: boolean;
|
|
36
|
+
oneclickParams?: {
|
|
37
|
+
appFees?: {
|
|
38
|
+
recipient: string;
|
|
39
|
+
fee: number;
|
|
40
|
+
}[];
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
interface HyperliquidTransferParams {
|
|
44
|
+
wallet: WalletConfig;
|
|
45
|
+
evmWallet: WalletConfig;
|
|
46
|
+
evmWalletAddress: string;
|
|
47
|
+
quote: any;
|
|
48
|
+
}
|
|
49
|
+
interface HyperliquidGeneratePermitParams {
|
|
50
|
+
evmWalletAddress: string;
|
|
51
|
+
evmWallet: WalletConfig;
|
|
52
|
+
amountWei: string;
|
|
53
|
+
}
|
|
54
|
+
interface HyperliquidDepositParams extends HyperliquidTransferParams {
|
|
55
|
+
txhash: string;
|
|
56
|
+
}
|
|
57
|
+
interface HyperliquidGetStatusParams {
|
|
58
|
+
depositId: string;
|
|
59
|
+
}
|
|
60
|
+
interface HyperliquidResponse<T> {
|
|
61
|
+
code: number;
|
|
62
|
+
data: T;
|
|
63
|
+
}
|
|
64
|
+
interface HyperliquidDepositResponseData {
|
|
65
|
+
depositId: number;
|
|
66
|
+
}
|
|
67
|
+
type HyperliquidDepositResponse = HyperliquidResponse<HyperliquidDepositResponseData>;
|
|
68
|
+
type HyperliquidDepositStatus = "PROCESSING" | "SUCCESS" | "REFUNDED" | "FAILED";
|
|
69
|
+
interface HyperliquidDepositStatusResponseData {
|
|
70
|
+
status: HyperliquidDepositStatus;
|
|
71
|
+
txHash: string;
|
|
72
|
+
}
|
|
73
|
+
type HyperliquidDepositStatusResponse = HyperliquidResponse<HyperliquidDepositStatusResponseData>;
|
|
74
|
+
|
|
75
|
+
export { Hyperliquid, type HyperliquidDepositParams, type HyperliquidDepositResponse, type HyperliquidDepositResponseData, type HyperliquidDepositStatus, type HyperliquidDepositStatusResponse, type HyperliquidDepositStatusResponseData, HyperliquidFromTokens, type HyperliquidGeneratePermitParams, type HyperliquidGetStatusParams, type HyperliquidQuoteParams, type HyperliquidResponse, type HyperliquidTransferParams, HyperliuquidMinAmount, HyperliuquidToToken };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@stableflow/core');
|
|
4
|
+
var bridges = require('@stableflow/bridges');
|
|
5
|
+
|
|
6
|
+
// src/index.ts
|
|
7
|
+
var SPENDER = "0x2df1c51e09aecf9cacb7bc98cb1742757f163df7";
|
|
8
|
+
var DESTINATION_TOKEN = core.usdcChains["arb"];
|
|
9
|
+
var MIN_AMOUNT = 5 * 10 ** DESTINATION_TOKEN.decimals;
|
|
10
|
+
var HyperliquidService = class {
|
|
11
|
+
async quote(params) {
|
|
12
|
+
const result = { quote: null, error: null };
|
|
13
|
+
if (BigInt(params.amountWei || 0) < BigInt(MIN_AMOUNT)) {
|
|
14
|
+
result.error = `Amount is too low, at least ${MIN_AMOUNT}`;
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
const quoteParams = {
|
|
18
|
+
...params,
|
|
19
|
+
dry: params.dry ?? true,
|
|
20
|
+
slippageTolerance: params.slippageTolerance * 100,
|
|
21
|
+
originAsset: params.fromToken.assetId,
|
|
22
|
+
toToken: DESTINATION_TOKEN,
|
|
23
|
+
destinationAsset: DESTINATION_TOKEN.assetId,
|
|
24
|
+
amount: params.amountWei,
|
|
25
|
+
refundType: "ORIGIN_CHAIN",
|
|
26
|
+
appFees: params.oneclickParams?.appFees,
|
|
27
|
+
swapType: "EXACT_OUTPUT",
|
|
28
|
+
isProxy: false
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
const quoteRes = await bridges.ServiceMap[core.Service.OneClick].quote(quoteParams);
|
|
32
|
+
result.quote = quoteRes;
|
|
33
|
+
} catch (error) {
|
|
34
|
+
const _err = bridges.formatQuoteError(error, { service: core.Service.OneClick, fromToken: params.fromToken });
|
|
35
|
+
result.error = _err.error;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
async transfer(params) {
|
|
40
|
+
const {
|
|
41
|
+
quote,
|
|
42
|
+
wallet
|
|
43
|
+
} = params;
|
|
44
|
+
const sendParams = {
|
|
45
|
+
wallet,
|
|
46
|
+
sendParam: quote?.sendParam,
|
|
47
|
+
fromToken: quote?.quoteParam.fromToken,
|
|
48
|
+
depositAddress: quote?.quote?.depositAddress,
|
|
49
|
+
amountWei: quote?.quote?.amountIn
|
|
50
|
+
};
|
|
51
|
+
const txhash = await bridges.ServiceMap[core.Service.OneClick].send(sendParams);
|
|
52
|
+
return txhash;
|
|
53
|
+
}
|
|
54
|
+
async deposit(params) {
|
|
55
|
+
const {
|
|
56
|
+
evmWallet,
|
|
57
|
+
evmWalletAddress,
|
|
58
|
+
quote,
|
|
59
|
+
txhash
|
|
60
|
+
} = params;
|
|
61
|
+
const permitParams = await this.generatePermit({
|
|
62
|
+
evmWalletAddress,
|
|
63
|
+
evmWallet,
|
|
64
|
+
amountWei: quote?.quote?.amountOut
|
|
65
|
+
});
|
|
66
|
+
const depositParams = {
|
|
67
|
+
deposit_address: quote?.quote?.depositAddress,
|
|
68
|
+
from_addr: quote?.quoteParam?.refundTo,
|
|
69
|
+
from_amount: quote?.quote?.amountIn,
|
|
70
|
+
from_chain: quote?.quoteParam?.fromToken?.blockchain,
|
|
71
|
+
from_hash: txhash,
|
|
72
|
+
from_token: quote?.quoteParam?.fromToken?.contractAddress,
|
|
73
|
+
sender: quote?.quoteParam?.recipient,
|
|
74
|
+
to_amount: quote?.quote?.amountOut,
|
|
75
|
+
to_chain: quote?.quoteParam?.toToken?.blockchain,
|
|
76
|
+
to_token: quote?.quoteParam?.toToken?.contractAddress,
|
|
77
|
+
type: core.Service.OneClick,
|
|
78
|
+
permit: permitParams
|
|
79
|
+
};
|
|
80
|
+
const depositRes = await core.postRequest("/v0/deposit", depositParams);
|
|
81
|
+
return depositRes;
|
|
82
|
+
}
|
|
83
|
+
getStatus(params) {
|
|
84
|
+
return core.getRequest("/v0/deposit/status", {
|
|
85
|
+
depositId: params.depositId
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async generatePermit(params) {
|
|
89
|
+
const {
|
|
90
|
+
evmWalletAddress,
|
|
91
|
+
evmWallet,
|
|
92
|
+
amountWei
|
|
93
|
+
} = params;
|
|
94
|
+
const tokenAddress = DESTINATION_TOKEN.contractAddress;
|
|
95
|
+
const signature = await evmWallet.signTypedData({
|
|
96
|
+
fromToken: DESTINATION_TOKEN,
|
|
97
|
+
amountWei,
|
|
98
|
+
spender: SPENDER
|
|
99
|
+
});
|
|
100
|
+
const permitParams = {
|
|
101
|
+
amount: signature.value,
|
|
102
|
+
deadline: signature.deadline,
|
|
103
|
+
owner: signature.owner,
|
|
104
|
+
r: signature.r,
|
|
105
|
+
s: signature.s,
|
|
106
|
+
spender: SPENDER,
|
|
107
|
+
token: tokenAddress,
|
|
108
|
+
v: signature.v,
|
|
109
|
+
nonce: signature.nonce
|
|
110
|
+
};
|
|
111
|
+
return permitParams;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
var Hyperliquid = new HyperliquidService();
|
|
115
|
+
var HyperliquidFromTokens = core.tokens.filter((token) => token.services.includes(core.Service.OneClick)).filter((token) => !(token.chainName === "Arbitrum" && token.symbol === "USDC"));
|
|
116
|
+
var HyperliuquidToToken = DESTINATION_TOKEN;
|
|
117
|
+
var HyperliuquidMinAmount = MIN_AMOUNT + "";
|
|
118
|
+
|
|
119
|
+
exports.Hyperliquid = Hyperliquid;
|
|
120
|
+
exports.HyperliquidFromTokens = HyperliquidFromTokens;
|
|
121
|
+
exports.HyperliuquidMinAmount = HyperliuquidMinAmount;
|
|
122
|
+
exports.HyperliuquidToToken = HyperliuquidToToken;
|
|
123
|
+
//# sourceMappingURL=index.js.map
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["usdcChains","ServiceMap","Service","formatQuoteError","postRequest","getRequest","tokens"],"mappings":";;;;;;AAUA,IAAM,OAAA,GAAU,4CAAA;AAChB,IAAM,iBAAA,GAAoBA,gBAAW,KAAK,CAAA;AAC1C,IAAM,UAAA,GAAa,CAAA,GAAK,EAAA,IAAM,iBAAA,CAAkB,QAAA;AAEhD,IAAM,qBAAN,MAAyB;AAAA,EACvB,MAAa,MAAM,MAAA,EAAgF;AAEjG,IAAA,MAAM,MAAA,GAAgD,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAK;AAEjF,IAAA,IAAI,OAAO,MAAA,CAAO,SAAA,IAAa,CAAC,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtD,MAAA,MAAA,CAAO,KAAA,GAAQ,+BAA+B,UAAU,CAAA,CAAA;AACxD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,MAAA;AAAA,MACH,GAAA,EAAK,OAAO,GAAA,IAAO,IAAA;AAAA,MACnB,iBAAA,EAAmB,OAAO,iBAAA,GAAoB,GAAA;AAAA,MAC9C,WAAA,EAAa,OAAO,SAAA,CAAU,OAAA;AAAA,MAC9B,OAAA,EAAS,iBAAA;AAAA,MACT,kBAAkB,iBAAA,CAAkB,OAAA;AAAA,MACpC,QAAQ,MAAA,CAAO,SAAA;AAAA,MACf,UAAA,EAAY,cAAA;AAAA,MACZ,OAAA,EAAS,OAAO,cAAA,EAAgB,OAAA;AAAA,MAChC,QAAA,EAAU,cAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAMC,kBAAA,CAAWC,aAAQ,QAAQ,CAAA,CAAE,MAAM,WAAW,CAAA;AACrE,MAAA,MAAA,CAAO,KAAA,GAAQ,QAAA;AAAA,IACjB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,GAAOC,wBAAA,CAAiB,KAAA,EAAO,EAAE,OAAA,EAASD,aAAQ,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA;AAC/F,MAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,IACtB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,MAAA,EAAoD;AACxE,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,MAAA;AAAA,MACA,WAAW,KAAA,EAAO,SAAA;AAAA,MAClB,SAAA,EAAW,OAAO,UAAA,CAAW,SAAA;AAAA,MAC7B,cAAA,EAAgB,OAAO,KAAA,EAAO,cAAA;AAAA,MAC9B,SAAA,EAAW,OAAO,KAAA,EAAO;AAAA,KAC3B;AAEA,IAAA,MAAM,SAAS,MAAMD,kBAAA,CAAWC,aAAQ,QAAQ,CAAA,CAAE,KAAK,UAAU,CAAA;AAEjE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,QAAQ,MAAA,EAAuE;AAC1F,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,cAAA,CAAe;AAAA,MAC7C,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,OAAO,KAAA,EAAO;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,eAAA,EAAiB,OAAO,KAAA,EAAO,cAAA;AAAA,MAC/B,SAAA,EAAW,OAAO,UAAA,EAAY,QAAA;AAAA,MAC9B,WAAA,EAAa,OAAO,KAAA,EAAO,QAAA;AAAA,MAC3B,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,UAAA;AAAA,MAC1C,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,SAAA,EAAW,eAAA;AAAA,MAC1C,MAAA,EAAQ,OAAO,UAAA,EAAY,SAAA;AAAA,MAC3B,SAAA,EAAW,OAAO,KAAA,EAAO,SAAA;AAAA,MACzB,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,UAAA;AAAA,MACtC,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,eAAA;AAAA,MACtC,MAAMA,YAAA,CAAQ,QAAA;AAAA,MAEd,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,UAAA,GAAa,MAAME,gBAAA,CAAY,aAAA,EAAe,aAAa,CAAA;AAEjE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEO,UAAU,MAAA,EAA+E;AAC9F,IAAA,OAAOC,gBAAW,oBAAA,EAAsB;AAAA,MACtC,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAgB,eAAe,MAAA,EAAyC;AACtE,IAAA,MAAM;AAAA,MACJ,gBAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAA;AAEJ,IAAA,MAAM,eAAe,iBAAA,CAAkB,eAAA;AAEvC,IAAA,MAAM,SAAA,GAAY,MAAO,SAAA,CAAkB,aAAA,CAAc;AAAA,MACvD,SAAA,EAAW,iBAAA;AAAA,MACX,SAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,QAAQ,SAAA,CAAU,KAAA;AAAA,MAClB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,GAAG,SAAA,CAAU,CAAA;AAAA,MACb,GAAG,SAAA,CAAU,CAAA;AAAA,MACb,OAAA,EAAS,OAAA;AAAA,MACT,KAAA,EAAO,YAAA;AAAA,MACP,GAAG,SAAA,CAAU,CAAA;AAAA,MACb,OAAO,SAAA,CAAU;AAAA,KACnB;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AACF,CAAA;AAEO,IAAM,WAAA,GAAc,IAAI,kBAAA;AAExB,IAAM,qBAAA,GAAwBC,YAClC,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,QAAA,CAAS,SAASJ,YAAA,CAAQ,QAAQ,CAAC,CAAA,CAC3D,MAAA,CAAO,CAAC,KAAA,KAAU,EAAE,MAAM,SAAA,KAAc,UAAA,IAAc,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO;AAC1E,IAAM,mBAAA,GAAsB;AAC5B,IAAM,wBAAwB,UAAA,GAAa","file":"index.js","sourcesContent":["import {\n usdcChains,\n Service,\n tokens,\n postRequest,\n getRequest,\n} from '@stableflow/core';\nimport { formatQuoteError, ServiceMap } from '@stableflow/bridges';\nimport type { WalletConfig, TokenConfig } from '@stableflow/core';\n\nconst SPENDER = \"0x2df1c51e09aecf9cacb7bc98cb1742757f163df7\";\nconst DESTINATION_TOKEN = usdcChains[\"arb\"];\nconst MIN_AMOUNT = 5 * (10 ** DESTINATION_TOKEN.decimals);\n\nclass HyperliquidService {\n public async quote(params: HyperliquidQuoteParams): Promise<{ quote: any; error: string | null; }> {\n\n const result: { quote: any; error: string | null; } = { quote: null, error: null };\n\n if (BigInt(params.amountWei || 0) < BigInt(MIN_AMOUNT)) {\n result.error = `Amount is too low, at least ${MIN_AMOUNT}`;\n return result;\n }\n\n const quoteParams = {\n ...params,\n dry: params.dry ?? true,\n slippageTolerance: params.slippageTolerance * 100,\n originAsset: params.fromToken.assetId,\n toToken: DESTINATION_TOKEN,\n destinationAsset: DESTINATION_TOKEN.assetId,\n amount: params.amountWei,\n refundType: \"ORIGIN_CHAIN\",\n appFees: params.oneclickParams?.appFees,\n swapType: \"EXACT_OUTPUT\",\n isProxy: false,\n };\n\n try {\n const quoteRes = await ServiceMap[Service.OneClick].quote(quoteParams);\n result.quote = quoteRes;\n } catch (error) {\n const _err = formatQuoteError(error, { service: Service.OneClick, fromToken: params.fromToken });\n result.error = _err.error;\n }\n\n return result;\n }\n\n public async transfer(params: HyperliquidTransferParams): Promise<string> {\n const {\n quote,\n wallet,\n } = params;\n\n const sendParams = {\n wallet,\n sendParam: quote?.sendParam,\n fromToken: quote?.quoteParam.fromToken,\n depositAddress: quote?.quote?.depositAddress,\n amountWei: quote?.quote?.amountIn,\n };\n\n const txhash = await ServiceMap[Service.OneClick].send(sendParams);\n\n return txhash;\n }\n\n public async deposit(params: HyperliquidDepositParams): Promise<HyperliquidDepositResponse> {\n const {\n evmWallet,\n evmWalletAddress,\n quote,\n txhash,\n } = params;\n\n const permitParams = await this.generatePermit({\n evmWalletAddress,\n evmWallet,\n amountWei: quote?.quote?.amountOut,\n });\n\n const depositParams = {\n deposit_address: quote?.quote?.depositAddress,\n from_addr: quote?.quoteParam?.refundTo,\n from_amount: quote?.quote?.amountIn,\n from_chain: quote?.quoteParam?.fromToken?.blockchain,\n from_hash: txhash,\n from_token: quote?.quoteParam?.fromToken?.contractAddress,\n sender: quote?.quoteParam?.recipient,\n to_amount: quote?.quote?.amountOut,\n to_chain: quote?.quoteParam?.toToken?.blockchain,\n to_token: quote?.quoteParam?.toToken?.contractAddress,\n type: Service.OneClick,\n\n permit: permitParams,\n };\n\n const depositRes = await postRequest(\"/v0/deposit\", depositParams);\n\n return depositRes as HyperliquidDepositResponse;\n }\n\n public getStatus(params: HyperliquidGetStatusParams): Promise<HyperliquidDepositStatusResponse> {\n return getRequest(\"/v0/deposit/status\", {\n depositId: params.depositId,\n });\n }\n\n protected async generatePermit(params: HyperliquidGeneratePermitParams) {\n const {\n evmWalletAddress,\n evmWallet,\n amountWei,\n } = params;\n\n const tokenAddress = DESTINATION_TOKEN.contractAddress;\n\n const signature = await (evmWallet as any).signTypedData({\n fromToken: DESTINATION_TOKEN,\n amountWei: amountWei,\n spender: SPENDER,\n });\n\n const permitParams = {\n amount: signature.value,\n deadline: signature.deadline,\n owner: signature.owner,\n r: signature.r,\n s: signature.s,\n spender: SPENDER,\n token: tokenAddress,\n v: signature.v,\n nonce: signature.nonce,\n };\n\n return permitParams;\n }\n}\n\nexport const Hyperliquid = new HyperliquidService();\n\nexport const HyperliquidFromTokens = tokens\n .filter((token) => token.services.includes(Service.OneClick))\n .filter((token) => !(token.chainName === \"Arbitrum\" && token.symbol === \"USDC\"));\nexport const HyperliuquidToToken = DESTINATION_TOKEN;\nexport const HyperliuquidMinAmount = MIN_AMOUNT + \"\";\n\nexport interface HyperliquidQuoteParams {\n slippageTolerance: number;\n refundTo: string;\n recipient: string;\n wallet: WalletConfig;\n fromToken: TokenConfig;\n prices: Record<string, string>;\n amountWei: string;\n // Whether to generate deposit address\n // false will generate a deposit address\n dry?: boolean;\n oneclickParams?: {\n appFees?: { recipient: string; fee: number; }[];\n };\n}\n\nexport interface HyperliquidTransferParams {\n // bridge wallet\n wallet: WalletConfig;\n // deposit wallet (evm wallet)\n evmWallet: WalletConfig;\n // deposit wallet address\n evmWalletAddress: string;\n // quote result with deposit address\n quote: any;\n}\n\nexport interface HyperliquidGeneratePermitParams {\n evmWalletAddress: string;\n evmWallet: WalletConfig;\n amountWei: string;\n}\n\nexport interface HyperliquidDepositParams extends HyperliquidTransferParams {\n txhash: string;\n}\n\nexport interface HyperliquidGetStatusParams {\n depositId: string;\n}\n\nexport interface HyperliquidResponse<T> {\n code: number;\n data: T;\n}\n\nexport interface HyperliquidDepositResponseData {\n depositId: number;\n}\n\nexport type HyperliquidDepositResponse = HyperliquidResponse<HyperliquidDepositResponseData>;\n\nexport type HyperliquidDepositStatus = \"PROCESSING\" | \"SUCCESS\" | \"REFUNDED\" | \"FAILED\";\n\nexport interface HyperliquidDepositStatusResponseData {\n status: HyperliquidDepositStatus;\n txHash: string;\n}\n\nexport type HyperliquidDepositStatusResponse = HyperliquidResponse<HyperliquidDepositStatusResponseData>;\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { usdcChains, tokens, Service, postRequest, getRequest } from '@stableflow/core';
|
|
2
|
+
import { ServiceMap, formatQuoteError } from '@stableflow/bridges';
|
|
3
|
+
|
|
4
|
+
// src/index.ts
|
|
5
|
+
var SPENDER = "0x2df1c51e09aecf9cacb7bc98cb1742757f163df7";
|
|
6
|
+
var DESTINATION_TOKEN = usdcChains["arb"];
|
|
7
|
+
var MIN_AMOUNT = 5 * 10 ** DESTINATION_TOKEN.decimals;
|
|
8
|
+
var HyperliquidService = class {
|
|
9
|
+
async quote(params) {
|
|
10
|
+
const result = { quote: null, error: null };
|
|
11
|
+
if (BigInt(params.amountWei || 0) < BigInt(MIN_AMOUNT)) {
|
|
12
|
+
result.error = `Amount is too low, at least ${MIN_AMOUNT}`;
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
const quoteParams = {
|
|
16
|
+
...params,
|
|
17
|
+
dry: params.dry ?? true,
|
|
18
|
+
slippageTolerance: params.slippageTolerance * 100,
|
|
19
|
+
originAsset: params.fromToken.assetId,
|
|
20
|
+
toToken: DESTINATION_TOKEN,
|
|
21
|
+
destinationAsset: DESTINATION_TOKEN.assetId,
|
|
22
|
+
amount: params.amountWei,
|
|
23
|
+
refundType: "ORIGIN_CHAIN",
|
|
24
|
+
appFees: params.oneclickParams?.appFees,
|
|
25
|
+
swapType: "EXACT_OUTPUT",
|
|
26
|
+
isProxy: false
|
|
27
|
+
};
|
|
28
|
+
try {
|
|
29
|
+
const quoteRes = await ServiceMap[Service.OneClick].quote(quoteParams);
|
|
30
|
+
result.quote = quoteRes;
|
|
31
|
+
} catch (error) {
|
|
32
|
+
const _err = formatQuoteError(error, { service: Service.OneClick, fromToken: params.fromToken });
|
|
33
|
+
result.error = _err.error;
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
async transfer(params) {
|
|
38
|
+
const {
|
|
39
|
+
quote,
|
|
40
|
+
wallet
|
|
41
|
+
} = params;
|
|
42
|
+
const sendParams = {
|
|
43
|
+
wallet,
|
|
44
|
+
sendParam: quote?.sendParam,
|
|
45
|
+
fromToken: quote?.quoteParam.fromToken,
|
|
46
|
+
depositAddress: quote?.quote?.depositAddress,
|
|
47
|
+
amountWei: quote?.quote?.amountIn
|
|
48
|
+
};
|
|
49
|
+
const txhash = await ServiceMap[Service.OneClick].send(sendParams);
|
|
50
|
+
return txhash;
|
|
51
|
+
}
|
|
52
|
+
async deposit(params) {
|
|
53
|
+
const {
|
|
54
|
+
evmWallet,
|
|
55
|
+
evmWalletAddress,
|
|
56
|
+
quote,
|
|
57
|
+
txhash
|
|
58
|
+
} = params;
|
|
59
|
+
const permitParams = await this.generatePermit({
|
|
60
|
+
evmWalletAddress,
|
|
61
|
+
evmWallet,
|
|
62
|
+
amountWei: quote?.quote?.amountOut
|
|
63
|
+
});
|
|
64
|
+
const depositParams = {
|
|
65
|
+
deposit_address: quote?.quote?.depositAddress,
|
|
66
|
+
from_addr: quote?.quoteParam?.refundTo,
|
|
67
|
+
from_amount: quote?.quote?.amountIn,
|
|
68
|
+
from_chain: quote?.quoteParam?.fromToken?.blockchain,
|
|
69
|
+
from_hash: txhash,
|
|
70
|
+
from_token: quote?.quoteParam?.fromToken?.contractAddress,
|
|
71
|
+
sender: quote?.quoteParam?.recipient,
|
|
72
|
+
to_amount: quote?.quote?.amountOut,
|
|
73
|
+
to_chain: quote?.quoteParam?.toToken?.blockchain,
|
|
74
|
+
to_token: quote?.quoteParam?.toToken?.contractAddress,
|
|
75
|
+
type: Service.OneClick,
|
|
76
|
+
permit: permitParams
|
|
77
|
+
};
|
|
78
|
+
const depositRes = await postRequest("/v0/deposit", depositParams);
|
|
79
|
+
return depositRes;
|
|
80
|
+
}
|
|
81
|
+
getStatus(params) {
|
|
82
|
+
return getRequest("/v0/deposit/status", {
|
|
83
|
+
depositId: params.depositId
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async generatePermit(params) {
|
|
87
|
+
const {
|
|
88
|
+
evmWalletAddress,
|
|
89
|
+
evmWallet,
|
|
90
|
+
amountWei
|
|
91
|
+
} = params;
|
|
92
|
+
const tokenAddress = DESTINATION_TOKEN.contractAddress;
|
|
93
|
+
const signature = await evmWallet.signTypedData({
|
|
94
|
+
fromToken: DESTINATION_TOKEN,
|
|
95
|
+
amountWei,
|
|
96
|
+
spender: SPENDER
|
|
97
|
+
});
|
|
98
|
+
const permitParams = {
|
|
99
|
+
amount: signature.value,
|
|
100
|
+
deadline: signature.deadline,
|
|
101
|
+
owner: signature.owner,
|
|
102
|
+
r: signature.r,
|
|
103
|
+
s: signature.s,
|
|
104
|
+
spender: SPENDER,
|
|
105
|
+
token: tokenAddress,
|
|
106
|
+
v: signature.v,
|
|
107
|
+
nonce: signature.nonce
|
|
108
|
+
};
|
|
109
|
+
return permitParams;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var Hyperliquid = new HyperliquidService();
|
|
113
|
+
var HyperliquidFromTokens = tokens.filter((token) => token.services.includes(Service.OneClick)).filter((token) => !(token.chainName === "Arbitrum" && token.symbol === "USDC"));
|
|
114
|
+
var HyperliuquidToToken = DESTINATION_TOKEN;
|
|
115
|
+
var HyperliuquidMinAmount = MIN_AMOUNT + "";
|
|
116
|
+
|
|
117
|
+
export { Hyperliquid, HyperliquidFromTokens, HyperliuquidMinAmount, HyperliuquidToToken };
|
|
118
|
+
//# sourceMappingURL=index.mjs.map
|
|
119
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n usdcChains,\n Service,\n tokens,\n postRequest,\n getRequest,\n} from '@stableflow/core';\nimport { formatQuoteError, ServiceMap } from '@stableflow/bridges';\nimport type { WalletConfig, TokenConfig } from '@stableflow/core';\n\nconst SPENDER = \"0x2df1c51e09aecf9cacb7bc98cb1742757f163df7\";\nconst DESTINATION_TOKEN = usdcChains[\"arb\"];\nconst MIN_AMOUNT = 5 * (10 ** DESTINATION_TOKEN.decimals);\n\nclass HyperliquidService {\n public async quote(params: HyperliquidQuoteParams): Promise<{ quote: any; error: string | null; }> {\n\n const result: { quote: any; error: string | null; } = { quote: null, error: null };\n\n if (BigInt(params.amountWei || 0) < BigInt(MIN_AMOUNT)) {\n result.error = `Amount is too low, at least ${MIN_AMOUNT}`;\n return result;\n }\n\n const quoteParams = {\n ...params,\n dry: params.dry ?? true,\n slippageTolerance: params.slippageTolerance * 100,\n originAsset: params.fromToken.assetId,\n toToken: DESTINATION_TOKEN,\n destinationAsset: DESTINATION_TOKEN.assetId,\n amount: params.amountWei,\n refundType: \"ORIGIN_CHAIN\",\n appFees: params.oneclickParams?.appFees,\n swapType: \"EXACT_OUTPUT\",\n isProxy: false,\n };\n\n try {\n const quoteRes = await ServiceMap[Service.OneClick].quote(quoteParams);\n result.quote = quoteRes;\n } catch (error) {\n const _err = formatQuoteError(error, { service: Service.OneClick, fromToken: params.fromToken });\n result.error = _err.error;\n }\n\n return result;\n }\n\n public async transfer(params: HyperliquidTransferParams): Promise<string> {\n const {\n quote,\n wallet,\n } = params;\n\n const sendParams = {\n wallet,\n sendParam: quote?.sendParam,\n fromToken: quote?.quoteParam.fromToken,\n depositAddress: quote?.quote?.depositAddress,\n amountWei: quote?.quote?.amountIn,\n };\n\n const txhash = await ServiceMap[Service.OneClick].send(sendParams);\n\n return txhash;\n }\n\n public async deposit(params: HyperliquidDepositParams): Promise<HyperliquidDepositResponse> {\n const {\n evmWallet,\n evmWalletAddress,\n quote,\n txhash,\n } = params;\n\n const permitParams = await this.generatePermit({\n evmWalletAddress,\n evmWallet,\n amountWei: quote?.quote?.amountOut,\n });\n\n const depositParams = {\n deposit_address: quote?.quote?.depositAddress,\n from_addr: quote?.quoteParam?.refundTo,\n from_amount: quote?.quote?.amountIn,\n from_chain: quote?.quoteParam?.fromToken?.blockchain,\n from_hash: txhash,\n from_token: quote?.quoteParam?.fromToken?.contractAddress,\n sender: quote?.quoteParam?.recipient,\n to_amount: quote?.quote?.amountOut,\n to_chain: quote?.quoteParam?.toToken?.blockchain,\n to_token: quote?.quoteParam?.toToken?.contractAddress,\n type: Service.OneClick,\n\n permit: permitParams,\n };\n\n const depositRes = await postRequest(\"/v0/deposit\", depositParams);\n\n return depositRes as HyperliquidDepositResponse;\n }\n\n public getStatus(params: HyperliquidGetStatusParams): Promise<HyperliquidDepositStatusResponse> {\n return getRequest(\"/v0/deposit/status\", {\n depositId: params.depositId,\n });\n }\n\n protected async generatePermit(params: HyperliquidGeneratePermitParams) {\n const {\n evmWalletAddress,\n evmWallet,\n amountWei,\n } = params;\n\n const tokenAddress = DESTINATION_TOKEN.contractAddress;\n\n const signature = await (evmWallet as any).signTypedData({\n fromToken: DESTINATION_TOKEN,\n amountWei: amountWei,\n spender: SPENDER,\n });\n\n const permitParams = {\n amount: signature.value,\n deadline: signature.deadline,\n owner: signature.owner,\n r: signature.r,\n s: signature.s,\n spender: SPENDER,\n token: tokenAddress,\n v: signature.v,\n nonce: signature.nonce,\n };\n\n return permitParams;\n }\n}\n\nexport const Hyperliquid = new HyperliquidService();\n\nexport const HyperliquidFromTokens = tokens\n .filter((token) => token.services.includes(Service.OneClick))\n .filter((token) => !(token.chainName === \"Arbitrum\" && token.symbol === \"USDC\"));\nexport const HyperliuquidToToken = DESTINATION_TOKEN;\nexport const HyperliuquidMinAmount = MIN_AMOUNT + \"\";\n\nexport interface HyperliquidQuoteParams {\n slippageTolerance: number;\n refundTo: string;\n recipient: string;\n wallet: WalletConfig;\n fromToken: TokenConfig;\n prices: Record<string, string>;\n amountWei: string;\n // Whether to generate deposit address\n // false will generate a deposit address\n dry?: boolean;\n oneclickParams?: {\n appFees?: { recipient: string; fee: number; }[];\n };\n}\n\nexport interface HyperliquidTransferParams {\n // bridge wallet\n wallet: WalletConfig;\n // deposit wallet (evm wallet)\n evmWallet: WalletConfig;\n // deposit wallet address\n evmWalletAddress: string;\n // quote result with deposit address\n quote: any;\n}\n\nexport interface HyperliquidGeneratePermitParams {\n evmWalletAddress: string;\n evmWallet: WalletConfig;\n amountWei: string;\n}\n\nexport interface HyperliquidDepositParams extends HyperliquidTransferParams {\n txhash: string;\n}\n\nexport interface HyperliquidGetStatusParams {\n depositId: string;\n}\n\nexport interface HyperliquidResponse<T> {\n code: number;\n data: T;\n}\n\nexport interface HyperliquidDepositResponseData {\n depositId: number;\n}\n\nexport type HyperliquidDepositResponse = HyperliquidResponse<HyperliquidDepositResponseData>;\n\nexport type HyperliquidDepositStatus = \"PROCESSING\" | \"SUCCESS\" | \"REFUNDED\" | \"FAILED\";\n\nexport interface HyperliquidDepositStatusResponseData {\n status: HyperliquidDepositStatus;\n txHash: string;\n}\n\nexport type HyperliquidDepositStatusResponse = HyperliquidResponse<HyperliquidDepositStatusResponseData>;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stableflow/hyperliquid",
|
|
3
|
+
"version": "0.0.0-experimental-5a8afd7389-20260703",
|
|
4
|
+
"description": "Hyperliquid helpers for StableFlow SDK",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/stableflow-ai/stableflow-sdk.git",
|
|
9
|
+
"directory": "packages/hyperliquid"
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"module": "./dist/index.mjs",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.mjs",
|
|
18
|
+
"require": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@stableflow/core": "0.0.0-experimental-5a8afd7389-20260703",
|
|
26
|
+
"@stableflow/bridges": "0.0.0-experimental-5a8afd7389-20260703"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"tsup": "^8.5.1",
|
|
30
|
+
"typescript": "^5.9.3"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"clean": "rm -rf dist"
|
|
35
|
+
}
|
|
36
|
+
}
|