@nktkas/hyperliquid 0.22.1 → 0.23.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/README.md +125 -70
- package/esm/mod.d.ts +1 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/src/base.d.ts +4 -1
- package/esm/src/base.d.ts.map +1 -1
- package/esm/src/base.js +2 -2
- package/esm/src/clients/exchange.d.ts +420 -368
- package/esm/src/clients/exchange.d.ts.map +1 -1
- package/esm/src/clients/exchange.js +721 -551
- package/esm/src/clients/info.d.ts +137 -41
- package/esm/src/clients/info.d.ts.map +1 -1
- package/esm/src/clients/info.js +124 -28
- package/esm/src/clients/multiSign.d.ts +406 -484
- package/esm/src/clients/multiSign.d.ts.map +1 -1
- package/esm/src/clients/multiSign.js +639 -734
- package/esm/src/clients/subscription.d.ts +38 -3
- package/esm/src/clients/subscription.d.ts.map +1 -1
- package/esm/src/clients/subscription.js +36 -3
- package/esm/src/signing/_signTypedData/ethers.d.ts +33 -0
- package/esm/src/signing/_signTypedData/ethers.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/ethers.js +12 -0
- package/esm/src/signing/_signTypedData/mod.d.ts +35 -0
- package/esm/src/signing/_signTypedData/mod.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/mod.js +59 -0
- package/esm/src/signing/_signTypedData/private_key.d.ts +26 -0
- package/esm/src/signing/_signTypedData/private_key.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/private_key.js +144 -0
- package/esm/src/signing/_signTypedData/viem.d.ts +23 -0
- package/esm/src/signing/_signTypedData/viem.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/viem.js +6 -0
- package/esm/src/signing/_signTypedData/window.d.ts +29 -0
- package/esm/src/signing/_signTypedData/window.d.ts.map +1 -0
- package/esm/src/signing/_signTypedData/window.js +30 -0
- package/esm/src/signing/_sorter.d.ts +128 -0
- package/esm/src/signing/_sorter.d.ts.map +1 -0
- package/esm/src/{signing.js → signing/_sorter.js} +36 -449
- package/esm/src/signing/mod.d.ts +272 -0
- package/esm/src/signing/mod.d.ts.map +1 -0
- package/esm/src/signing/mod.js +306 -0
- package/esm/src/transports/base.d.ts +1 -1
- package/esm/src/transports/base.d.ts.map +1 -1
- package/esm/src/transports/base.js +2 -2
- package/esm/src/transports/http/http_transport.d.ts +9 -15
- package/esm/src/transports/http/http_transport.d.ts.map +1 -1
- package/esm/src/transports/http/http_transport.js +64 -59
- package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts +1 -1
- package/esm/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -1
- package/esm/src/transports/websocket/_hyperliquid_event_target.js +1 -1
- package/esm/src/transports/websocket/_reconnecting_websocket.d.ts.map +1 -1
- package/esm/src/transports/websocket/_reconnecting_websocket.js +17 -4
- package/esm/src/transports/websocket/_websocket_async_request.d.ts +0 -9
- package/esm/src/transports/websocket/_websocket_async_request.d.ts.map +1 -1
- package/esm/src/transports/websocket/_websocket_async_request.js +14 -20
- package/esm/src/transports/websocket/websocket_transport.d.ts +8 -4
- package/esm/src/transports/websocket/websocket_transport.d.ts.map +1 -1
- package/esm/src/transports/websocket/websocket_transport.js +83 -54
- package/esm/src/types/exchange/requests.d.ts +27 -51
- package/esm/src/types/exchange/requests.d.ts.map +1 -1
- package/esm/src/types/explorer/requests.d.ts +5 -8
- package/esm/src/types/explorer/requests.d.ts.map +1 -1
- package/esm/src/types/info/accounts.d.ts +5 -5
- package/esm/src/types/info/accounts.d.ts.map +1 -1
- package/esm/src/types/info/delegations.d.ts +1 -1
- package/esm/src/types/info/delegations.d.ts.map +1 -1
- package/esm/src/types/info/orders.d.ts +1 -1
- package/esm/src/types/info/orders.d.ts.map +1 -1
- package/esm/src/types/info/requests.d.ts +49 -96
- package/esm/src/types/info/requests.d.ts.map +1 -1
- package/esm/src/types/subscriptions/requests.d.ts +72 -18
- package/esm/src/types/subscriptions/requests.d.ts.map +1 -1
- package/esm/src/types/subscriptions/responses.d.ts +2 -0
- package/esm/src/types/subscriptions/responses.d.ts.map +1 -1
- package/package.json +12 -8
- package/script/mod.d.ts +1 -1
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +13 -23
- package/script/src/base.d.ts +4 -1
- package/script/src/base.d.ts.map +1 -1
- package/script/src/base.js +10 -20
- package/script/src/clients/exchange.d.ts +420 -368
- package/script/src/clients/exchange.d.ts.map +1 -1
- package/script/src/clients/exchange.js +2000 -1840
- package/script/src/clients/info.d.ts +137 -41
- package/script/src/clients/info.d.ts.map +1 -1
- package/script/src/clients/info.js +1296 -1210
- package/script/src/clients/multiSign.d.ts +406 -484
- package/script/src/clients/multiSign.d.ts.map +1 -1
- package/script/src/clients/multiSign.js +2043 -2148
- package/script/src/clients/subscription.d.ts +38 -3
- package/script/src/clients/subscription.d.ts.map +1 -1
- package/script/src/clients/subscription.js +568 -545
- package/script/src/signing/_signTypedData/ethers.d.ts +33 -0
- package/script/src/signing/_signTypedData/ethers.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/ethers.js +16 -0
- package/script/src/signing/_signTypedData/mod.d.ts +35 -0
- package/script/src/signing/_signTypedData/mod.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/mod.js +67 -0
- package/script/src/signing/_signTypedData/private_key.d.ts +26 -0
- package/script/src/signing/_signTypedData/private_key.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/private_key.js +148 -0
- package/script/src/signing/_signTypedData/viem.d.ts +23 -0
- package/script/src/signing/_signTypedData/viem.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/viem.js +9 -0
- package/script/src/signing/_signTypedData/window.d.ts +29 -0
- package/script/src/signing/_signTypedData/window.d.ts.map +1 -0
- package/script/src/signing/_signTypedData/window.js +34 -0
- package/script/src/signing/_sorter.d.ts +128 -0
- package/script/src/signing/_sorter.d.ts.map +1 -0
- package/script/src/signing/_sorter.js +698 -0
- package/script/src/signing/mod.d.ts +272 -0
- package/script/src/signing/mod.d.ts.map +1 -0
- package/script/src/signing/mod.js +331 -0
- package/script/src/transports/base.d.ts +1 -1
- package/script/src/transports/base.d.ts.map +1 -1
- package/script/src/transports/base.js +11 -21
- package/script/src/transports/http/http_transport.d.ts +9 -15
- package/script/src/transports/http/http_transport.d.ts.map +1 -1
- package/script/src/transports/http/http_transport.js +97 -102
- package/script/src/transports/websocket/_hyperliquid_event_target.d.ts +1 -1
- package/script/src/transports/websocket/_hyperliquid_event_target.d.ts.map +1 -1
- package/script/src/transports/websocket/_hyperliquid_event_target.js +51 -61
- package/script/src/transports/websocket/_reconnecting_websocket.d.ts.map +1 -1
- package/script/src/transports/websocket/_reconnecting_websocket.js +271 -268
- package/script/src/transports/websocket/_websocket_async_request.d.ts +0 -9
- package/script/src/transports/websocket/_websocket_async_request.d.ts.map +1 -1
- package/script/src/transports/websocket/_websocket_async_request.js +157 -174
- package/script/src/transports/websocket/websocket_transport.d.ts +8 -4
- package/script/src/transports/websocket/websocket_transport.d.ts.map +1 -1
- package/script/src/transports/websocket/websocket_transport.js +209 -189
- package/script/src/types/exchange/requests.d.ts +27 -51
- package/script/src/types/exchange/requests.d.ts.map +1 -1
- package/script/src/types/exchange/requests.js +2 -12
- package/script/src/types/exchange/responses.js +2 -12
- package/script/src/types/explorer/requests.d.ts +5 -8
- package/script/src/types/explorer/requests.d.ts.map +1 -1
- package/script/src/types/explorer/requests.js +2 -12
- package/script/src/types/explorer/responses.js +2 -12
- package/script/src/types/info/accounts.d.ts +5 -5
- package/script/src/types/info/accounts.d.ts.map +1 -1
- package/script/src/types/info/accounts.js +2 -12
- package/script/src/types/info/assets.js +2 -12
- package/script/src/types/info/delegations.d.ts +1 -1
- package/script/src/types/info/delegations.d.ts.map +1 -1
- package/script/src/types/info/delegations.js +2 -12
- package/script/src/types/info/markets.js +2 -12
- package/script/src/types/info/orders.d.ts +1 -1
- package/script/src/types/info/orders.d.ts.map +1 -1
- package/script/src/types/info/orders.js +2 -12
- package/script/src/types/info/requests.d.ts +49 -96
- package/script/src/types/info/requests.d.ts.map +1 -1
- package/script/src/types/info/requests.js +2 -12
- package/script/src/types/info/vaults.js +2 -12
- package/script/src/types/mod.js +2 -12
- package/script/src/types/subscriptions/requests.d.ts +72 -18
- package/script/src/types/subscriptions/requests.d.ts.map +1 -1
- package/script/src/types/subscriptions/requests.js +2 -12
- package/script/src/types/subscriptions/responses.d.ts +2 -0
- package/script/src/types/subscriptions/responses.d.ts.map +1 -1
- package/script/src/types/subscriptions/responses.js +2 -12
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts +0 -2
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts.map +0 -1
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.js +0 -1
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts +0 -95
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts.map +0 -1
- package/esm/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.js +0 -10
- package/esm/deps/jsr.io/@std/async/1.0.13/delay.d.ts +0 -43
- package/esm/deps/jsr.io/@std/async/1.0.13/delay.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/async/1.0.13/delay.js +0 -63
- package/esm/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/bytes/1.0.6/_types.js +0 -2
- package/esm/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts +0 -21
- package/esm/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/bytes/1.0.6/concat.js +0 -32
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -51
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -13
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -2
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -87
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts +0 -9
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/_types.js +0 -2
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts +0 -39
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts.map +0 -1
- package/esm/deps/jsr.io/@std/msgpack/1.0.3/encode.js +0 -237
- package/esm/src/signing.d.ts +0 -463
- package/esm/src/signing.d.ts.map +0 -1
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts +0 -2
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.d.ts.map +0 -1
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/mod.js +0 -27
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts +0 -95
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.d.ts.map +0 -1
- package/script/deps/jsr.io/@derzade/typescript-event-target/1.1.1/src/TypedEventTarget.js +0 -24
- package/script/deps/jsr.io/@std/async/1.0.13/delay.d.ts +0 -43
- package/script/deps/jsr.io/@std/async/1.0.13/delay.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/async/1.0.13/delay.js +0 -76
- package/script/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/bytes/1.0.6/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/bytes/1.0.6/_types.js +0 -13
- package/script/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts +0 -21
- package/script/deps/jsr.io/@std/bytes/1.0.6/concat.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/bytes/1.0.6/concat.js +0 -45
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -67
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -26
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -13
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -101
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts +0 -9
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/msgpack/1.0.3/_types.js +0 -13
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts +0 -39
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.d.ts.map +0 -1
- package/script/deps/jsr.io/@std/msgpack/1.0.3/encode.js +0 -250
- package/script/src/signing.d.ts +0 -463
- package/script/src/signing.d.ts.map +0 -1
- package/script/src/signing.js +0 -1129
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module contains functions for generating Hyperliquid transaction signatures
|
|
3
|
+
* and interfaces to various wallet implementations.
|
|
4
|
+
*
|
|
5
|
+
* @example Signing an L1 action
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { actionSorter, signL1Action } from "@nktkas/hyperliquid/signing";
|
|
8
|
+
*
|
|
9
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
10
|
+
*
|
|
11
|
+
* const nonce = Date.now();
|
|
12
|
+
* const action = {
|
|
13
|
+
* type: "cancel",
|
|
14
|
+
* cancels: [
|
|
15
|
+
* { a: 0, o: 12345 },
|
|
16
|
+
* ],
|
|
17
|
+
* } as const;
|
|
18
|
+
*
|
|
19
|
+
* const signature = await signL1Action({
|
|
20
|
+
* wallet: privateKey,
|
|
21
|
+
* action: actionSorter[action.type](action),
|
|
22
|
+
* nonce,
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @example Signing a user-signed action
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { signUserSignedAction, userSignedActionEip712Types } from "@nktkas/hyperliquid/signing";
|
|
29
|
+
*
|
|
30
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
31
|
+
*
|
|
32
|
+
* const action = {
|
|
33
|
+
* type: "approveAgent",
|
|
34
|
+
* signatureChainId: "0x66eee",
|
|
35
|
+
* hyperliquidChain: "Mainnet",
|
|
36
|
+
* agentAddress: "0x...",
|
|
37
|
+
* agentName: "Agent",
|
|
38
|
+
* nonce: Date.now(),
|
|
39
|
+
* } as const;
|
|
40
|
+
*
|
|
41
|
+
* const signature = await signUserSignedAction({
|
|
42
|
+
* wallet: privateKey,
|
|
43
|
+
* action,
|
|
44
|
+
* types: userSignedActionEip712Types[action.type],
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example Signing a multi-signature action
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { actionSorter, signL1Action, signMultiSigAction } from "@nktkas/hyperliquid/signing";
|
|
51
|
+
* import { privateKeyToAccount } from "viem/accounts";
|
|
52
|
+
*
|
|
53
|
+
* const wallet = privateKeyToAccount("0x..."); // or `ethers`, private key with address
|
|
54
|
+
* const multiSigUser = "0x...";
|
|
55
|
+
*
|
|
56
|
+
* const nonce = Date.now();
|
|
57
|
+
* const action = {
|
|
58
|
+
* type: "scheduleCancel",
|
|
59
|
+
* time: Date.now() + 10000,
|
|
60
|
+
* } as const;
|
|
61
|
+
*
|
|
62
|
+
* // First, create the required number of signatures
|
|
63
|
+
* const signature = await signL1Action({
|
|
64
|
+
* wallet,
|
|
65
|
+
* action: [multiSigUser.toLowerCase(), wallet.address.toLowerCase(), actionSorter[action.type](action)],
|
|
66
|
+
* nonce,
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* // Then use signatures in the multi-sig action
|
|
70
|
+
* const multiSigSignature = await signMultiSigAction({
|
|
71
|
+
* wallet,
|
|
72
|
+
* action: {
|
|
73
|
+
* signatureChainId: "0x66eee",
|
|
74
|
+
* signatures: [signature],
|
|
75
|
+
* payload: {
|
|
76
|
+
* multiSigUser,
|
|
77
|
+
* outerSigner: wallet.address,
|
|
78
|
+
* action,
|
|
79
|
+
* },
|
|
80
|
+
* },
|
|
81
|
+
* nonce,
|
|
82
|
+
* });
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @module
|
|
86
|
+
*/
|
|
87
|
+
import type { Hex } from "../base.js";
|
|
88
|
+
import { type AbstractEthersSigner, type AbstractEthersV5Signer, type AbstractViemWalletClient, type AbstractWallet, type AbstractWindowEthereum, isAbstractEthersSigner, isAbstractEthersV5Signer, isAbstractViemWalletClient, isAbstractWindowEthereum, isValidPrivateKey, type Signature } from "./_signTypedData/mod.js";
|
|
89
|
+
export { type AbstractEthersSigner, type AbstractEthersV5Signer, type AbstractViemWalletClient, type AbstractWallet, type AbstractWindowEthereum, type Hex, isAbstractEthersSigner, isAbstractEthersV5Signer, isAbstractViemWalletClient, isAbstractWindowEthereum, isValidPrivateKey, type Signature, };
|
|
90
|
+
export * from "./_sorter.js";
|
|
91
|
+
/**
|
|
92
|
+
* Create a hash of the L1 action.
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* import { actionSorter, createL1ActionHash } from "@nktkas/hyperliquid/signing";
|
|
96
|
+
*
|
|
97
|
+
* const action = {
|
|
98
|
+
* type: "cancel",
|
|
99
|
+
* cancels: [
|
|
100
|
+
* { a: 0, o: 12345 },
|
|
101
|
+
* ],
|
|
102
|
+
* } as const;
|
|
103
|
+
* const nonce = Date.now();
|
|
104
|
+
*
|
|
105
|
+
* const actionHash = createL1ActionHash({
|
|
106
|
+
* action: actionSorter[action.type](action),
|
|
107
|
+
* nonce,
|
|
108
|
+
* vaultAddress: "0x...", // optional
|
|
109
|
+
* expiresAfter: Date.now() + 10_000, // optional
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function createL1ActionHash(args: {
|
|
114
|
+
/** The action to be hashed (hash depends on key order). */
|
|
115
|
+
action: Record<string, unknown> | unknown[];
|
|
116
|
+
/** The current timestamp in ms. */
|
|
117
|
+
nonce: number;
|
|
118
|
+
/** Optional vault address used in the action. */
|
|
119
|
+
vaultAddress?: Hex;
|
|
120
|
+
/** Optional expiration time of the action in ms since the epoch. */
|
|
121
|
+
expiresAfter?: number;
|
|
122
|
+
}): Hex;
|
|
123
|
+
/**
|
|
124
|
+
* Sign an L1 action.
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* import { actionSorter, signL1Action } from "@nktkas/hyperliquid/signing";
|
|
128
|
+
*
|
|
129
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
130
|
+
*
|
|
131
|
+
* const nonce = Date.now();
|
|
132
|
+
* const action = {
|
|
133
|
+
* type: "cancel",
|
|
134
|
+
* cancels: [
|
|
135
|
+
* { a: 0, o: 12345 },
|
|
136
|
+
* ],
|
|
137
|
+
* } as const;
|
|
138
|
+
*
|
|
139
|
+
* const signature = await signL1Action({
|
|
140
|
+
* wallet: privateKey,
|
|
141
|
+
* action: actionSorter[action.type](action),
|
|
142
|
+
* nonce,
|
|
143
|
+
* });
|
|
144
|
+
*
|
|
145
|
+
* // Send the signed action to the Hyperliquid API
|
|
146
|
+
* const response = await fetch("https://api.hyperliquid.xyz/exchange", {
|
|
147
|
+
* method: "POST",
|
|
148
|
+
* headers: { "Content-Type": "application/json" },
|
|
149
|
+
* body: JSON.stringify({ action, signature, nonce }),
|
|
150
|
+
* });
|
|
151
|
+
* const body = await response.json();
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
export declare function signL1Action(args: {
|
|
155
|
+
/** Wallet to sign the action. */
|
|
156
|
+
wallet: AbstractWallet;
|
|
157
|
+
/** The action to be signed (hash depends on key order). */
|
|
158
|
+
action: Record<string, unknown> | unknown[];
|
|
159
|
+
/** The current timestamp in ms. */
|
|
160
|
+
nonce: number;
|
|
161
|
+
/** Indicates if the action is for the testnet. (default: false) */
|
|
162
|
+
isTestnet?: boolean;
|
|
163
|
+
/** Optional vault address used in the action. */
|
|
164
|
+
vaultAddress?: Hex;
|
|
165
|
+
/** Optional expiration time of the action in ms since the epoch. */
|
|
166
|
+
expiresAfter?: number;
|
|
167
|
+
}): Promise<Signature>;
|
|
168
|
+
/**
|
|
169
|
+
* Sign a user-signed action.
|
|
170
|
+
* @example
|
|
171
|
+
* ```ts
|
|
172
|
+
* import { signUserSignedAction, userSignedActionEip712Types } from "@nktkas/hyperliquid/signing";
|
|
173
|
+
*
|
|
174
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
175
|
+
*
|
|
176
|
+
* const action = {
|
|
177
|
+
* type: "approveAgent",
|
|
178
|
+
* signatureChainId: "0x66eee",
|
|
179
|
+
* hyperliquidChain: "Mainnet",
|
|
180
|
+
* agentAddress: "0x...",
|
|
181
|
+
* agentName: "Agent",
|
|
182
|
+
* nonce: Date.now(),
|
|
183
|
+
* } as const;
|
|
184
|
+
*
|
|
185
|
+
* const signature = await signUserSignedAction({
|
|
186
|
+
* wallet: privateKey,
|
|
187
|
+
* action,
|
|
188
|
+
* types: userSignedActionEip712Types[action.type],
|
|
189
|
+
* });
|
|
190
|
+
*
|
|
191
|
+
* // Send the signed action to the Hyperliquid API
|
|
192
|
+
* const response = await fetch("https://api.hyperliquid.xyz/exchange", {
|
|
193
|
+
* method: "POST",
|
|
194
|
+
* headers: { "Content-Type": "application/json" },
|
|
195
|
+
* body: JSON.stringify({ action, signature, nonce: action.nonce }),
|
|
196
|
+
* });
|
|
197
|
+
* const body = await response.json();
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
export declare function signUserSignedAction(args: {
|
|
201
|
+
/** Wallet to sign the action. */
|
|
202
|
+
wallet: AbstractWallet;
|
|
203
|
+
/** The action to be signed. */
|
|
204
|
+
action: {
|
|
205
|
+
signatureChainId: Hex;
|
|
206
|
+
[key: string]: unknown;
|
|
207
|
+
};
|
|
208
|
+
/** The types of the action (hash depends on key order). */
|
|
209
|
+
types: {
|
|
210
|
+
[key: string]: {
|
|
211
|
+
name: string;
|
|
212
|
+
type: string;
|
|
213
|
+
}[];
|
|
214
|
+
};
|
|
215
|
+
}): Promise<Signature>;
|
|
216
|
+
/**
|
|
217
|
+
* Sign a multi-signature action.
|
|
218
|
+
* @example
|
|
219
|
+
* ```ts
|
|
220
|
+
* import { actionSorter, signL1Action, signMultiSigAction } from "@nktkas/hyperliquid/signing";
|
|
221
|
+
* import { privateKeyToAccount } from "viem/accounts";
|
|
222
|
+
*
|
|
223
|
+
* const wallet = privateKeyToAccount("0x..."); // or `ethers`, private key with address
|
|
224
|
+
* const multiSigUser = "0x...";
|
|
225
|
+
*
|
|
226
|
+
* const nonce = Date.now();
|
|
227
|
+
* const action = {
|
|
228
|
+
* type: "scheduleCancel",
|
|
229
|
+
* time: Date.now() + 10000,
|
|
230
|
+
* } as const;
|
|
231
|
+
*
|
|
232
|
+
* // First, create the required number of signatures
|
|
233
|
+
* const signature = await signL1Action({
|
|
234
|
+
* wallet,
|
|
235
|
+
* action: [multiSigUser.toLowerCase(), wallet.address.toLowerCase(), actionSorter[action.type](action)],
|
|
236
|
+
* nonce,
|
|
237
|
+
* });
|
|
238
|
+
*
|
|
239
|
+
* // Then use signatures in the multi-sig action
|
|
240
|
+
* const multiSigSignature = await signMultiSigAction({
|
|
241
|
+
* wallet,
|
|
242
|
+
* action: {
|
|
243
|
+
* signatureChainId: "0x66eee",
|
|
244
|
+
* signatures: [signature],
|
|
245
|
+
* payload: {
|
|
246
|
+
* multiSigUser,
|
|
247
|
+
* outerSigner: wallet.address,
|
|
248
|
+
* action,
|
|
249
|
+
* },
|
|
250
|
+
* },
|
|
251
|
+
* nonce,
|
|
252
|
+
* });
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
export declare function signMultiSigAction(args: {
|
|
256
|
+
/** Wallet to sign the action. */
|
|
257
|
+
wallet: AbstractWallet;
|
|
258
|
+
/** The action to be signed (hash depends on key order). */
|
|
259
|
+
action: {
|
|
260
|
+
signatureChainId: Hex;
|
|
261
|
+
[key: string]: unknown;
|
|
262
|
+
};
|
|
263
|
+
/** The current timestamp in ms. */
|
|
264
|
+
nonce: number;
|
|
265
|
+
/** Indicates if the action is for the testnet. (default: false) */
|
|
266
|
+
isTestnet?: boolean;
|
|
267
|
+
/** Optional vault address used in the action. */
|
|
268
|
+
vaultAddress?: Hex;
|
|
269
|
+
/** Optional expiration time of the action in ms since the epoch. */
|
|
270
|
+
expiresAfter?: number;
|
|
271
|
+
}): Promise<Signature>;
|
|
272
|
+
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/src/signing/mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,SAAS,EAEjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,GAAG,EACR,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,SAAS,GACjB,CAAC;AACF,cAAc,cAAc,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACrC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;IAC5C,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,GAAG,CA4BN;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACrC,iCAAiC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;IAC5C,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,SAAS,CAAC,CAiCrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC7C,iCAAiC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,+BAA+B;IAC/B,MAAM,EAAE;QACJ,gBAAgB,EAAE,GAAG,CAAC;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAC1B,CAAC;IACF,2DAA2D;IAC3D,KAAK,EAAE;QACH,CAAC,GAAG,EAAE,MAAM,GAAG;YACX,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;SAChB,EAAE,CAAC;KACP,CAAC;CACL,GAAG,OAAO,CAAC,SAAS,CAAC,CAcrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC3C,iCAAiC;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,2DAA2D;IAC3D,MAAM,EAAE;QACJ,gBAAgB,EAAE,GAAG,CAAC;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KAC1B,CAAC;IACF,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,SAAS,CAAC,CAoCrB"}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module contains functions for generating Hyperliquid transaction signatures
|
|
3
|
+
* and interfaces to various wallet implementations.
|
|
4
|
+
*
|
|
5
|
+
* @example Signing an L1 action
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { actionSorter, signL1Action } from "@nktkas/hyperliquid/signing";
|
|
8
|
+
*
|
|
9
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
10
|
+
*
|
|
11
|
+
* const nonce = Date.now();
|
|
12
|
+
* const action = {
|
|
13
|
+
* type: "cancel",
|
|
14
|
+
* cancels: [
|
|
15
|
+
* { a: 0, o: 12345 },
|
|
16
|
+
* ],
|
|
17
|
+
* } as const;
|
|
18
|
+
*
|
|
19
|
+
* const signature = await signL1Action({
|
|
20
|
+
* wallet: privateKey,
|
|
21
|
+
* action: actionSorter[action.type](action),
|
|
22
|
+
* nonce,
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @example Signing a user-signed action
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { signUserSignedAction, userSignedActionEip712Types } from "@nktkas/hyperliquid/signing";
|
|
29
|
+
*
|
|
30
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
31
|
+
*
|
|
32
|
+
* const action = {
|
|
33
|
+
* type: "approveAgent",
|
|
34
|
+
* signatureChainId: "0x66eee",
|
|
35
|
+
* hyperliquidChain: "Mainnet",
|
|
36
|
+
* agentAddress: "0x...",
|
|
37
|
+
* agentName: "Agent",
|
|
38
|
+
* nonce: Date.now(),
|
|
39
|
+
* } as const;
|
|
40
|
+
*
|
|
41
|
+
* const signature = await signUserSignedAction({
|
|
42
|
+
* wallet: privateKey,
|
|
43
|
+
* action,
|
|
44
|
+
* types: userSignedActionEip712Types[action.type],
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example Signing a multi-signature action
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { actionSorter, signL1Action, signMultiSigAction } from "@nktkas/hyperliquid/signing";
|
|
51
|
+
* import { privateKeyToAccount } from "viem/accounts";
|
|
52
|
+
*
|
|
53
|
+
* const wallet = privateKeyToAccount("0x..."); // or `ethers`, private key with address
|
|
54
|
+
* const multiSigUser = "0x...";
|
|
55
|
+
*
|
|
56
|
+
* const nonce = Date.now();
|
|
57
|
+
* const action = {
|
|
58
|
+
* type: "scheduleCancel",
|
|
59
|
+
* time: Date.now() + 10000,
|
|
60
|
+
* } as const;
|
|
61
|
+
*
|
|
62
|
+
* // First, create the required number of signatures
|
|
63
|
+
* const signature = await signL1Action({
|
|
64
|
+
* wallet,
|
|
65
|
+
* action: [multiSigUser.toLowerCase(), wallet.address.toLowerCase(), actionSorter[action.type](action)],
|
|
66
|
+
* nonce,
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* // Then use signatures in the multi-sig action
|
|
70
|
+
* const multiSigSignature = await signMultiSigAction({
|
|
71
|
+
* wallet,
|
|
72
|
+
* action: {
|
|
73
|
+
* signatureChainId: "0x66eee",
|
|
74
|
+
* signatures: [signature],
|
|
75
|
+
* payload: {
|
|
76
|
+
* multiSigUser,
|
|
77
|
+
* outerSigner: wallet.address,
|
|
78
|
+
* action,
|
|
79
|
+
* },
|
|
80
|
+
* },
|
|
81
|
+
* nonce,
|
|
82
|
+
* });
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @module
|
|
86
|
+
*/
|
|
87
|
+
import { keccak_256 } from "@noble/hashes/sha3";
|
|
88
|
+
import { etc } from "@noble/secp256k1";
|
|
89
|
+
import { encode as encodeMsgpack } from "@msgpack/msgpack";
|
|
90
|
+
import { isAbstractEthersSigner, isAbstractEthersV5Signer, isAbstractViemWalletClient, isAbstractWindowEthereum, isValidPrivateKey, signTypedData, } from "./_signTypedData/mod.js";
|
|
91
|
+
export { isAbstractEthersSigner, isAbstractEthersV5Signer, isAbstractViemWalletClient, isAbstractWindowEthereum, isValidPrivateKey, };
|
|
92
|
+
export * from "./_sorter.js";
|
|
93
|
+
/**
|
|
94
|
+
* Create a hash of the L1 action.
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* import { actionSorter, createL1ActionHash } from "@nktkas/hyperliquid/signing";
|
|
98
|
+
*
|
|
99
|
+
* const action = {
|
|
100
|
+
* type: "cancel",
|
|
101
|
+
* cancels: [
|
|
102
|
+
* { a: 0, o: 12345 },
|
|
103
|
+
* ],
|
|
104
|
+
* } as const;
|
|
105
|
+
* const nonce = Date.now();
|
|
106
|
+
*
|
|
107
|
+
* const actionHash = createL1ActionHash({
|
|
108
|
+
* action: actionSorter[action.type](action),
|
|
109
|
+
* nonce,
|
|
110
|
+
* vaultAddress: "0x...", // optional
|
|
111
|
+
* expiresAfter: Date.now() + 10_000, // optional
|
|
112
|
+
* });
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export function createL1ActionHash(args) {
|
|
116
|
+
const { action, nonce, vaultAddress, expiresAfter } = args;
|
|
117
|
+
// 1. Action
|
|
118
|
+
const actionBytes = encodeMsgpack(action);
|
|
119
|
+
// 2. Nonce
|
|
120
|
+
const nonceBytes = toUint64Bytes(nonce);
|
|
121
|
+
// 3. Vault address
|
|
122
|
+
const vaultMarker = vaultAddress ? new Uint8Array([1]) : new Uint8Array([0]);
|
|
123
|
+
const vaultBytes = vaultAddress ? etc.hexToBytes(vaultAddress.slice(2)) : new Uint8Array();
|
|
124
|
+
// 4. Expires after
|
|
125
|
+
const expiresMarker = expiresAfter !== undefined ? new Uint8Array([0]) : new Uint8Array();
|
|
126
|
+
const expiresBytes = expiresAfter !== undefined ? toUint64Bytes(expiresAfter) : new Uint8Array();
|
|
127
|
+
// Create a hash
|
|
128
|
+
const bytes = etc.concatBytes(actionBytes, nonceBytes, vaultMarker, vaultBytes, expiresMarker, expiresBytes);
|
|
129
|
+
const hash = keccak_256(bytes);
|
|
130
|
+
return `0x${etc.bytesToHex(hash)}`;
|
|
131
|
+
}
|
|
132
|
+
function toUint64Bytes(n) {
|
|
133
|
+
const bytes = new Uint8Array(8);
|
|
134
|
+
new DataView(bytes.buffer).setBigUint64(0, BigInt(n));
|
|
135
|
+
return bytes;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Sign an L1 action.
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* import { actionSorter, signL1Action } from "@nktkas/hyperliquid/signing";
|
|
142
|
+
*
|
|
143
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
144
|
+
*
|
|
145
|
+
* const nonce = Date.now();
|
|
146
|
+
* const action = {
|
|
147
|
+
* type: "cancel",
|
|
148
|
+
* cancels: [
|
|
149
|
+
* { a: 0, o: 12345 },
|
|
150
|
+
* ],
|
|
151
|
+
* } as const;
|
|
152
|
+
*
|
|
153
|
+
* const signature = await signL1Action({
|
|
154
|
+
* wallet: privateKey,
|
|
155
|
+
* action: actionSorter[action.type](action),
|
|
156
|
+
* nonce,
|
|
157
|
+
* });
|
|
158
|
+
*
|
|
159
|
+
* // Send the signed action to the Hyperliquid API
|
|
160
|
+
* const response = await fetch("https://api.hyperliquid.xyz/exchange", {
|
|
161
|
+
* method: "POST",
|
|
162
|
+
* headers: { "Content-Type": "application/json" },
|
|
163
|
+
* body: JSON.stringify({ action, signature, nonce }),
|
|
164
|
+
* });
|
|
165
|
+
* const body = await response.json();
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
export async function signL1Action(args) {
|
|
169
|
+
const { wallet, action, nonce, isTestnet = false, vaultAddress, expiresAfter, } = args;
|
|
170
|
+
const actionHash = createL1ActionHash({ action, nonce, vaultAddress, expiresAfter });
|
|
171
|
+
const message = {
|
|
172
|
+
source: isTestnet ? "b" : "a",
|
|
173
|
+
connectionId: actionHash,
|
|
174
|
+
};
|
|
175
|
+
return await signTypedData({
|
|
176
|
+
wallet,
|
|
177
|
+
domain: {
|
|
178
|
+
name: "Exchange",
|
|
179
|
+
version: "1",
|
|
180
|
+
chainId: 1337, // hyperliquid requires chainId to be 1337
|
|
181
|
+
verifyingContract: "0x0000000000000000000000000000000000000000",
|
|
182
|
+
},
|
|
183
|
+
types: {
|
|
184
|
+
Agent: [
|
|
185
|
+
{ name: "source", type: "string" },
|
|
186
|
+
{ name: "connectionId", type: "bytes32" },
|
|
187
|
+
],
|
|
188
|
+
},
|
|
189
|
+
primaryType: "Agent",
|
|
190
|
+
message,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Sign a user-signed action.
|
|
195
|
+
* @example
|
|
196
|
+
* ```ts
|
|
197
|
+
* import { signUserSignedAction, userSignedActionEip712Types } from "@nktkas/hyperliquid/signing";
|
|
198
|
+
*
|
|
199
|
+
* const privateKey = "0x..."; // or `viem`, `ethers`
|
|
200
|
+
*
|
|
201
|
+
* const action = {
|
|
202
|
+
* type: "approveAgent",
|
|
203
|
+
* signatureChainId: "0x66eee",
|
|
204
|
+
* hyperliquidChain: "Mainnet",
|
|
205
|
+
* agentAddress: "0x...",
|
|
206
|
+
* agentName: "Agent",
|
|
207
|
+
* nonce: Date.now(),
|
|
208
|
+
* } as const;
|
|
209
|
+
*
|
|
210
|
+
* const signature = await signUserSignedAction({
|
|
211
|
+
* wallet: privateKey,
|
|
212
|
+
* action,
|
|
213
|
+
* types: userSignedActionEip712Types[action.type],
|
|
214
|
+
* });
|
|
215
|
+
*
|
|
216
|
+
* // Send the signed action to the Hyperliquid API
|
|
217
|
+
* const response = await fetch("https://api.hyperliquid.xyz/exchange", {
|
|
218
|
+
* method: "POST",
|
|
219
|
+
* headers: { "Content-Type": "application/json" },
|
|
220
|
+
* body: JSON.stringify({ action, signature, nonce: action.nonce }),
|
|
221
|
+
* });
|
|
222
|
+
* const body = await response.json();
|
|
223
|
+
* ```
|
|
224
|
+
*/
|
|
225
|
+
export async function signUserSignedAction(args) {
|
|
226
|
+
const { wallet, action, types } = args;
|
|
227
|
+
return await signTypedData({
|
|
228
|
+
wallet,
|
|
229
|
+
domain: {
|
|
230
|
+
name: "HyperliquidSignTransaction",
|
|
231
|
+
version: "1",
|
|
232
|
+
chainId: parseInt(action.signatureChainId),
|
|
233
|
+
verifyingContract: "0x0000000000000000000000000000000000000000",
|
|
234
|
+
},
|
|
235
|
+
types,
|
|
236
|
+
primaryType: Object.keys(types)[0],
|
|
237
|
+
message: action,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Sign a multi-signature action.
|
|
242
|
+
* @example
|
|
243
|
+
* ```ts
|
|
244
|
+
* import { actionSorter, signL1Action, signMultiSigAction } from "@nktkas/hyperliquid/signing";
|
|
245
|
+
* import { privateKeyToAccount } from "viem/accounts";
|
|
246
|
+
*
|
|
247
|
+
* const wallet = privateKeyToAccount("0x..."); // or `ethers`, private key with address
|
|
248
|
+
* const multiSigUser = "0x...";
|
|
249
|
+
*
|
|
250
|
+
* const nonce = Date.now();
|
|
251
|
+
* const action = {
|
|
252
|
+
* type: "scheduleCancel",
|
|
253
|
+
* time: Date.now() + 10000,
|
|
254
|
+
* } as const;
|
|
255
|
+
*
|
|
256
|
+
* // First, create the required number of signatures
|
|
257
|
+
* const signature = await signL1Action({
|
|
258
|
+
* wallet,
|
|
259
|
+
* action: [multiSigUser.toLowerCase(), wallet.address.toLowerCase(), actionSorter[action.type](action)],
|
|
260
|
+
* nonce,
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* // Then use signatures in the multi-sig action
|
|
264
|
+
* const multiSigSignature = await signMultiSigAction({
|
|
265
|
+
* wallet,
|
|
266
|
+
* action: {
|
|
267
|
+
* signatureChainId: "0x66eee",
|
|
268
|
+
* signatures: [signature],
|
|
269
|
+
* payload: {
|
|
270
|
+
* multiSigUser,
|
|
271
|
+
* outerSigner: wallet.address,
|
|
272
|
+
* action,
|
|
273
|
+
* },
|
|
274
|
+
* },
|
|
275
|
+
* nonce,
|
|
276
|
+
* });
|
|
277
|
+
* ```
|
|
278
|
+
*/
|
|
279
|
+
export async function signMultiSigAction(args) {
|
|
280
|
+
const { wallet, action, nonce, isTestnet = false, vaultAddress, expiresAfter, } = args;
|
|
281
|
+
const multiSigActionHash = createL1ActionHash({ action, nonce, vaultAddress, expiresAfter });
|
|
282
|
+
const message = {
|
|
283
|
+
signatureChainId: action.signatureChainId,
|
|
284
|
+
hyperliquidChain: isTestnet ? "Testnet" : "Mainnet",
|
|
285
|
+
multiSigActionHash,
|
|
286
|
+
nonce,
|
|
287
|
+
};
|
|
288
|
+
return await signTypedData({
|
|
289
|
+
wallet,
|
|
290
|
+
domain: {
|
|
291
|
+
name: "HyperliquidSignTransaction",
|
|
292
|
+
version: "1",
|
|
293
|
+
chainId: parseInt(message.signatureChainId),
|
|
294
|
+
verifyingContract: "0x0000000000000000000000000000000000000000",
|
|
295
|
+
},
|
|
296
|
+
types: {
|
|
297
|
+
"HyperliquidTransaction:SendMultiSig": [
|
|
298
|
+
{ name: "hyperliquidChain", type: "string" },
|
|
299
|
+
{ name: "multiSigActionHash", type: "bytes32" },
|
|
300
|
+
{ name: "nonce", type: "uint64" },
|
|
301
|
+
],
|
|
302
|
+
},
|
|
303
|
+
primaryType: "HyperliquidTransaction:SendMultiSig",
|
|
304
|
+
message,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
@@ -42,6 +42,6 @@ export interface Subscription {
|
|
|
42
42
|
}
|
|
43
43
|
/** Base class for all transport-related errors. */
|
|
44
44
|
export declare class TransportError extends HyperliquidError {
|
|
45
|
-
constructor(message?: string);
|
|
45
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
46
46
|
}
|
|
47
47
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/src/transports/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAkB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC/D;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9G;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAuB,SAAQ,OAAO,CAAC,eAAe,CAAC;IACpE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACpH;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IACzB,kFAAkF;IAClF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,WAAW,CAAC;CACnC;AAED,mDAAmD;AACnD,qBAAa,cAAe,SAAQ,gBAAgB;gBACpC,OAAO,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/src/transports/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAkB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC/D;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC9G;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAuB,SAAQ,OAAO,CAAC,eAAe,CAAC;IACpE;;;;;;OAMG;IACH,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACpH;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IACzB,kFAAkF;IAClF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,WAAW,CAAC;CACnC;AAED,mDAAmD;AACnD,qBAAa,cAAe,SAAQ,gBAAgB;gBACpC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIvD"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { HyperliquidError } from "../base.js";
|
|
2
2
|
/** Base class for all transport-related errors. */
|
|
3
3
|
export class TransportError extends HyperliquidError {
|
|
4
|
-
constructor(message) {
|
|
5
|
-
super(message);
|
|
4
|
+
constructor(message, options) {
|
|
5
|
+
super(message, options);
|
|
6
6
|
this.name = "TransportError";
|
|
7
7
|
}
|
|
8
8
|
}
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import type { MaybePromise } from "../../base.js";
|
|
2
2
|
import { type IRequestTransport, TransportError } from "../base.js";
|
|
3
|
-
/**
|
|
4
|
-
* Error thrown when an HTTP response is deemed invalid:
|
|
5
|
-
* - Non-200 status code
|
|
6
|
-
* - Unexpected content type
|
|
7
|
-
*/
|
|
3
|
+
/** Error thrown when an HTTP request fails. */
|
|
8
4
|
export declare class HttpRequestError extends TransportError {
|
|
9
|
-
response
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
*/
|
|
16
|
-
constructor(response: Response, responseBody?: string | undefined);
|
|
5
|
+
response?: Response;
|
|
6
|
+
body?: string;
|
|
7
|
+
constructor(args?: {
|
|
8
|
+
response?: Response;
|
|
9
|
+
body?: string;
|
|
10
|
+
}, options?: ErrorOptions);
|
|
17
11
|
}
|
|
18
12
|
/** Configuration options for the HTTP transport layer. */
|
|
19
13
|
export interface HttpTransportOptions {
|
|
@@ -84,8 +78,8 @@ export declare class HttpTransport implements IRequestTransport, HttpTransportOp
|
|
|
84
78
|
* @param payload - The payload to send with the request.
|
|
85
79
|
* @param signal - An optional abort signal.
|
|
86
80
|
* @returns A promise that resolves with parsed JSON response body.
|
|
87
|
-
*
|
|
88
|
-
* @throws
|
|
81
|
+
*
|
|
82
|
+
* @throws {HttpRequestError} Thrown when the HTTP request fails.
|
|
89
83
|
*/
|
|
90
84
|
request<T>(endpoint: "info" | "exchange" | "explorer", payload: unknown, signal?: AbortSignal): Promise<T>;
|
|
91
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http_transport.d.ts","sourceRoot":"","sources":["../../../../src/src/transports/http/http_transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE
|
|
1
|
+
{"version":3,"file":"http_transport.d.ts","sourceRoot":"","sources":["../../../../src/src/transports/http/http_transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,KAAK,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,+CAA+C;AAC/C,qBAAa,gBAAiB,SAAQ,cAAc;IAChD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEF,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE,YAAY;CAgBpF;AAED,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB;;;OAGG;IACH,MAAM,CAAC,EAAE;QACL,OAAO,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;QACrD,OAAO,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;KACxD,CAAC;IAEF,2IAA2I;IAC3I,YAAY,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IAEpD;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAElF;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,YAAY,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACzF;AAED,2DAA2D;AAC3D,qBAAa,aAAc,YAAW,iBAAiB,EAAE,oBAAoB;IACzE,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE;QACJ,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;YAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;QAClD,OAAO,EAAE;YAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;YAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;SAAE,CAAC;KACrD,CAAC;IACF,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAClF,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,YAAY,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAEtF;;;OAGG;gBACS,OAAO,CAAC,EAAE,oBAAoB;IAkB1C;;;;;;;;OAQG;IACG,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;CA4DnH"}
|