@drift-labs/common 1.0.12 → 1.0.13
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/lib/common-ui-utils/commonUiUtils.d.ts +1 -1
- package/lib/common-ui-utils/trading.d.ts +1 -1
- package/lib/common-ui-utils/trading.js +2 -1
- package/lib/common-ui-utils/trading.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.d.ts +20 -2
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js +32 -0
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/index.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.d.ts +31 -1
- package/lib/drift/Drift/clients/AuthorityDrift/DriftOperations/types.js.map +1 -1
- package/lib/drift/Drift/clients/AuthorityDrift/index.d.ts +10 -2
- package/lib/drift/Drift/clients/AuthorityDrift/index.js +12 -0
- package/lib/drift/Drift/clients/AuthorityDrift/index.js.map +1 -1
- package/lib/drift/base/actions/builder/createRevenueShareAccount.d.ts +62 -0
- package/lib/drift/base/actions/builder/createRevenueShareAccount.js +59 -0
- package/lib/drift/base/actions/builder/createRevenueShareAccount.js.map +1 -0
- package/lib/drift/base/actions/builder/createRevenueShareEscrow.d.ts +126 -0
- package/lib/drift/base/actions/builder/createRevenueShareEscrow.js +114 -0
- package/lib/drift/base/actions/builder/createRevenueShareEscrow.js.map +1 -0
- package/lib/drift/base/actions/builder/index.d.ts +3 -0
- package/lib/drift/base/actions/builder/index.js +20 -0
- package/lib/drift/base/actions/builder/index.js.map +1 -0
- package/lib/drift/base/actions/builder/manageBuilder.d.ts +157 -0
- package/lib/drift/base/actions/builder/manageBuilder.js +139 -0
- package/lib/drift/base/actions/builder/manageBuilder.js.map +1 -0
- package/lib/drift/base/actions/index.d.ts +1 -0
- package/lib/drift/base/actions/index.js +1 -0
- package/lib/drift/base/actions/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.d.ts +29 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js +2 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.d.ts +8 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js +1 -0
- package/lib/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.js.map +1 -1
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.d.ts +56 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js +7 -2
- package/lib/drift/base/actions/trade/openPerpOrder/openSwiftOrder/index.js.map +1 -1
- package/lib/drift/base/constants/index.d.ts +2 -0
- package/lib/drift/base/constants/index.js +19 -0
- package/lib/drift/base/constants/index.js.map +1 -0
- package/lib/drift/index.d.ts +1 -0
- package/lib/drift/index.js +1 -0
- package/lib/drift/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { DriftClient } from '@drift-labs/sdk';
|
|
2
|
+
import { Transaction, TransactionInstruction, VersionedTransaction, PublicKey } from '@solana/web3.js';
|
|
3
|
+
import { WithTxnParams } from '../../types';
|
|
4
|
+
interface ManageBuilderIxParams {
|
|
5
|
+
driftClient: DriftClient;
|
|
6
|
+
/**
|
|
7
|
+
* The public key of the builder to manage.
|
|
8
|
+
* This is the builder's authority address that owns their RevenueShare account.
|
|
9
|
+
*/
|
|
10
|
+
builderAuthority: PublicKey;
|
|
11
|
+
/**
|
|
12
|
+
* Maximum fee the builder can charge, in tenths of basis points.
|
|
13
|
+
*
|
|
14
|
+
* Examples:
|
|
15
|
+
* - 10 = 1 bps = 0.01%
|
|
16
|
+
* - 50 = 5 bps = 0.05%
|
|
17
|
+
* - 100 = 10 bps = 0.1%
|
|
18
|
+
* - 1000 = 100 bps = 1%
|
|
19
|
+
*
|
|
20
|
+
* Special values:
|
|
21
|
+
* - Set to 0 to revoke the builder (they remain in list but cannot be used)
|
|
22
|
+
*/
|
|
23
|
+
maxFeeTenthBps: number;
|
|
24
|
+
/**
|
|
25
|
+
* The public key of the authority to add the builder to the approved builders list.
|
|
26
|
+
*/
|
|
27
|
+
authority: PublicKey;
|
|
28
|
+
/**
|
|
29
|
+
* The public key of the wallet that will pay for the transaction.
|
|
30
|
+
* If not provided, the authority provided will be the payer.
|
|
31
|
+
*/
|
|
32
|
+
payer?: PublicKey;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a transaction instruction to manage a builder's approval status and fee cap.
|
|
36
|
+
*
|
|
37
|
+
* This unified function handles all builder management operations:
|
|
38
|
+
* - **Approve**: Add a new builder to the approved list
|
|
39
|
+
* - **Update**: Modify an existing builder's max fee cap
|
|
40
|
+
* - **Revoke**: Disable a builder by setting their max fee to 0
|
|
41
|
+
*
|
|
42
|
+
* ## Behavior:
|
|
43
|
+
*
|
|
44
|
+
* ### If builder NOT in list:
|
|
45
|
+
* - Adds builder with specified `maxFeeTenthBps`
|
|
46
|
+
*
|
|
47
|
+
* ### If builder already in list:
|
|
48
|
+
* - Updates builder's `maxFeeTenthBps` to new value
|
|
49
|
+
* - Set to 0 to revoke (builder stays in list but cannot be used)
|
|
50
|
+
*
|
|
51
|
+
* ## Revocation Constraints:
|
|
52
|
+
* When setting `maxFeeTenthBps = 0`, the builder cannot have active orders:
|
|
53
|
+
* - No Open orders using this builder
|
|
54
|
+
* - No Completed (unsettled) orders using this builder
|
|
55
|
+
* - Error: `CannotRevokeBuilderWithOpenOrders` if constraint violated
|
|
56
|
+
*
|
|
57
|
+
* **Prerequisites**:
|
|
58
|
+
* - User must have initialized a RevenueShareEscrow account
|
|
59
|
+
* - Builder must have initialized a RevenueShare account (for receiving fees)
|
|
60
|
+
*
|
|
61
|
+
* @param driftClient - The Drift client instance
|
|
62
|
+
* @param builderAuthority - The public key of the builder to manage
|
|
63
|
+
* @param maxFeeTenthBps - Maximum fee cap in tenths of basis points
|
|
64
|
+
*
|
|
65
|
+
* @returns Promise resolving to a TransactionInstruction
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* // Approve a new builder with 5 bps max fee
|
|
70
|
+
* const ix = await manageBuilderIx({
|
|
71
|
+
* driftClient,
|
|
72
|
+
* builderAuthority: new PublicKey('BuilderAddress...'),
|
|
73
|
+
* maxFeeTenthBps: 50 // 5 bps = 0.05%
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* // Update existing builder to 10 bps max fee
|
|
80
|
+
* const ix = await manageBuilderIx({
|
|
81
|
+
* driftClient,
|
|
82
|
+
* builderAuthority: builderPubkey,
|
|
83
|
+
* maxFeeTenthBps: 100 // 10 bps = 0.1%
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* // Revoke builder (set max fee to 0)
|
|
90
|
+
* // IMPORTANT: Must settle all builder's orders first!
|
|
91
|
+
* const ix = await manageBuilderIx({
|
|
92
|
+
* driftClient,
|
|
93
|
+
* builderAuthority: builderPubkey,
|
|
94
|
+
* maxFeeTenthBps: 0 // Revoked
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export declare const manageBuilderIx: (params: ManageBuilderIxParams) => Promise<TransactionInstruction>;
|
|
99
|
+
/**
|
|
100
|
+
* Creates a transaction to manage a builder's approval status and fee cap.
|
|
101
|
+
*
|
|
102
|
+
* This unified function handles all builder management operations:
|
|
103
|
+
* - **Approve**: Add a new builder to the approved list
|
|
104
|
+
* - **Update**: Modify an existing builder's max fee cap
|
|
105
|
+
* - **Revoke**: Disable a builder by setting their max fee to 0
|
|
106
|
+
*
|
|
107
|
+
* ## Behavior:
|
|
108
|
+
*
|
|
109
|
+
* ### If builder NOT in list:
|
|
110
|
+
* - Adds builder with specified `maxFeeTenthBps`
|
|
111
|
+
*
|
|
112
|
+
* ### If builder already in list:
|
|
113
|
+
* - Updates builder's `maxFeeTenthBps` to new value
|
|
114
|
+
* - Set to 0 to revoke (builder stays in list but cannot be used)
|
|
115
|
+
*
|
|
116
|
+
* ## Revocation Constraints:
|
|
117
|
+
* When setting `maxFeeTenthBps = 0`, the builder cannot have active orders:
|
|
118
|
+
* - No Open orders using this builder
|
|
119
|
+
* - No Completed (unsettled) orders using this builder
|
|
120
|
+
* - Error: `CannotRevokeBuilderWithOpenOrders` if constraint violated
|
|
121
|
+
*
|
|
122
|
+
* **Prerequisites**:
|
|
123
|
+
* - User must have initialized a RevenueShareEscrow account
|
|
124
|
+
* - Builder must have initialized a RevenueShare account (for receiving fees)
|
|
125
|
+
*
|
|
126
|
+
* @param driftClient - The Drift client instance
|
|
127
|
+
* @param builderAuthority - The public key of the builder to manage
|
|
128
|
+
* @param maxFeeTenthBps - Maximum fee cap in tenths of basis points
|
|
129
|
+
* @param txParams - Optional transaction parameters for customizing the transaction
|
|
130
|
+
*
|
|
131
|
+
* @returns Promise resolving to a Transaction or VersionedTransaction ready for signing
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```typescript
|
|
135
|
+
* // Approve a new builder with 2 bps max fee
|
|
136
|
+
* const tx = await manageBuilderTxn({
|
|
137
|
+
* driftClient,
|
|
138
|
+
* builderAuthority: new PublicKey('BuilderAddress...'),
|
|
139
|
+
* maxFeeTenthBps: 20,
|
|
140
|
+
* txParams: { computeUnits: 200000 }
|
|
141
|
+
* });
|
|
142
|
+
*
|
|
143
|
+
* const signature = await wallet.sendTransaction(tx, connection);
|
|
144
|
+
* ```
|
|
145
|
+
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* // Update existing builder's fee
|
|
149
|
+
* await manageBuilderTxn({
|
|
150
|
+
* driftClient,
|
|
151
|
+
* builderAuthority: builderPubkey,
|
|
152
|
+
* maxFeeTenthBps: 100 // Increase to 10 bps
|
|
153
|
+
* });
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare const manageBuilderTxn: (params: WithTxnParams<ManageBuilderIxParams>) => Promise<Transaction | VersionedTransaction>;
|
|
157
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.manageBuilderTxn = exports.manageBuilderIx = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Creates a transaction instruction to manage a builder's approval status and fee cap.
|
|
6
|
+
*
|
|
7
|
+
* This unified function handles all builder management operations:
|
|
8
|
+
* - **Approve**: Add a new builder to the approved list
|
|
9
|
+
* - **Update**: Modify an existing builder's max fee cap
|
|
10
|
+
* - **Revoke**: Disable a builder by setting their max fee to 0
|
|
11
|
+
*
|
|
12
|
+
* ## Behavior:
|
|
13
|
+
*
|
|
14
|
+
* ### If builder NOT in list:
|
|
15
|
+
* - Adds builder with specified `maxFeeTenthBps`
|
|
16
|
+
*
|
|
17
|
+
* ### If builder already in list:
|
|
18
|
+
* - Updates builder's `maxFeeTenthBps` to new value
|
|
19
|
+
* - Set to 0 to revoke (builder stays in list but cannot be used)
|
|
20
|
+
*
|
|
21
|
+
* ## Revocation Constraints:
|
|
22
|
+
* When setting `maxFeeTenthBps = 0`, the builder cannot have active orders:
|
|
23
|
+
* - No Open orders using this builder
|
|
24
|
+
* - No Completed (unsettled) orders using this builder
|
|
25
|
+
* - Error: `CannotRevokeBuilderWithOpenOrders` if constraint violated
|
|
26
|
+
*
|
|
27
|
+
* **Prerequisites**:
|
|
28
|
+
* - User must have initialized a RevenueShareEscrow account
|
|
29
|
+
* - Builder must have initialized a RevenueShare account (for receiving fees)
|
|
30
|
+
*
|
|
31
|
+
* @param driftClient - The Drift client instance
|
|
32
|
+
* @param builderAuthority - The public key of the builder to manage
|
|
33
|
+
* @param maxFeeTenthBps - Maximum fee cap in tenths of basis points
|
|
34
|
+
*
|
|
35
|
+
* @returns Promise resolving to a TransactionInstruction
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* // Approve a new builder with 5 bps max fee
|
|
40
|
+
* const ix = await manageBuilderIx({
|
|
41
|
+
* driftClient,
|
|
42
|
+
* builderAuthority: new PublicKey('BuilderAddress...'),
|
|
43
|
+
* maxFeeTenthBps: 50 // 5 bps = 0.05%
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* // Update existing builder to 10 bps max fee
|
|
50
|
+
* const ix = await manageBuilderIx({
|
|
51
|
+
* driftClient,
|
|
52
|
+
* builderAuthority: builderPubkey,
|
|
53
|
+
* maxFeeTenthBps: 100 // 10 bps = 0.1%
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* // Revoke builder (set max fee to 0)
|
|
60
|
+
* // IMPORTANT: Must settle all builder's orders first!
|
|
61
|
+
* const ix = await manageBuilderIx({
|
|
62
|
+
* driftClient,
|
|
63
|
+
* builderAuthority: builderPubkey,
|
|
64
|
+
* maxFeeTenthBps: 0 // Revoked
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
const manageBuilderIx = async (params) => {
|
|
69
|
+
const { driftClient, builderAuthority, maxFeeTenthBps, authority, payer } = params;
|
|
70
|
+
const isRevoke = maxFeeTenthBps === 0;
|
|
71
|
+
return driftClient.getChangeApprovedBuilderIx(builderAuthority, maxFeeTenthBps, !isRevoke, // add = true (approve/update), false (revoke)
|
|
72
|
+
{
|
|
73
|
+
authority,
|
|
74
|
+
payer: payer !== null && payer !== void 0 ? payer : authority,
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
exports.manageBuilderIx = manageBuilderIx;
|
|
78
|
+
/**
|
|
79
|
+
* Creates a transaction to manage a builder's approval status and fee cap.
|
|
80
|
+
*
|
|
81
|
+
* This unified function handles all builder management operations:
|
|
82
|
+
* - **Approve**: Add a new builder to the approved list
|
|
83
|
+
* - **Update**: Modify an existing builder's max fee cap
|
|
84
|
+
* - **Revoke**: Disable a builder by setting their max fee to 0
|
|
85
|
+
*
|
|
86
|
+
* ## Behavior:
|
|
87
|
+
*
|
|
88
|
+
* ### If builder NOT in list:
|
|
89
|
+
* - Adds builder with specified `maxFeeTenthBps`
|
|
90
|
+
*
|
|
91
|
+
* ### If builder already in list:
|
|
92
|
+
* - Updates builder's `maxFeeTenthBps` to new value
|
|
93
|
+
* - Set to 0 to revoke (builder stays in list but cannot be used)
|
|
94
|
+
*
|
|
95
|
+
* ## Revocation Constraints:
|
|
96
|
+
* When setting `maxFeeTenthBps = 0`, the builder cannot have active orders:
|
|
97
|
+
* - No Open orders using this builder
|
|
98
|
+
* - No Completed (unsettled) orders using this builder
|
|
99
|
+
* - Error: `CannotRevokeBuilderWithOpenOrders` if constraint violated
|
|
100
|
+
*
|
|
101
|
+
* **Prerequisites**:
|
|
102
|
+
* - User must have initialized a RevenueShareEscrow account
|
|
103
|
+
* - Builder must have initialized a RevenueShare account (for receiving fees)
|
|
104
|
+
*
|
|
105
|
+
* @param driftClient - The Drift client instance
|
|
106
|
+
* @param builderAuthority - The public key of the builder to manage
|
|
107
|
+
* @param maxFeeTenthBps - Maximum fee cap in tenths of basis points
|
|
108
|
+
* @param txParams - Optional transaction parameters for customizing the transaction
|
|
109
|
+
*
|
|
110
|
+
* @returns Promise resolving to a Transaction or VersionedTransaction ready for signing
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // Approve a new builder with 2 bps max fee
|
|
115
|
+
* const tx = await manageBuilderTxn({
|
|
116
|
+
* driftClient,
|
|
117
|
+
* builderAuthority: new PublicKey('BuilderAddress...'),
|
|
118
|
+
* maxFeeTenthBps: 20,
|
|
119
|
+
* txParams: { computeUnits: 200000 }
|
|
120
|
+
* });
|
|
121
|
+
*
|
|
122
|
+
* const signature = await wallet.sendTransaction(tx, connection);
|
|
123
|
+
* ```
|
|
124
|
+
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* // Update existing builder's fee
|
|
128
|
+
* await manageBuilderTxn({
|
|
129
|
+
* driftClient,
|
|
130
|
+
* builderAuthority: builderPubkey,
|
|
131
|
+
* maxFeeTenthBps: 100 // Increase to 10 bps
|
|
132
|
+
* });
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
const manageBuilderTxn = async (params) => {
|
|
136
|
+
return params.driftClient.buildTransaction(await (0, exports.manageBuilderIx)(params), params.txParams);
|
|
137
|
+
};
|
|
138
|
+
exports.manageBuilderTxn = manageBuilderTxn;
|
|
139
|
+
//# sourceMappingURL=manageBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manageBuilder.js","sourceRoot":"","sources":["../../../../../src/drift/base/actions/builder/manageBuilder.ts"],"names":[],"mappings":";;;AAwCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACI,MAAM,eAAe,GAAG,KAAK,EACnC,MAA6B,EACK,EAAE;IACpC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,GACxE,MAAM,CAAC;IAER,MAAM,QAAQ,GAAG,cAAc,KAAK,CAAC,CAAC;IAEtC,OAAO,WAAW,CAAC,0BAA0B,CAC5C,gBAAgB,EAChB,cAAc,EACd,CAAC,QAAQ,EAAE,8CAA8C;IACzD;QACC,SAAS;QACT,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,SAAS;KACzB,CACD,CAAC;AACH,CAAC,CAAC;AAjBW,QAAA,eAAe,mBAiB1B;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACI,MAAM,gBAAgB,GAAG,KAAK,EACpC,MAA4C,EACE,EAAE;IAChD,OAAO,MAAM,CAAC,WAAW,CAAC,gBAAgB,CACzC,MAAM,IAAA,uBAAe,EAAC,MAAM,CAAC,EAC7B,MAAM,CAAC,QAAQ,CACf,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,gBAAgB,oBAO3B","sourcesContent":["import { DriftClient } from '@drift-labs/sdk';\nimport {\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n\tPublicKey,\n} from '@solana/web3.js';\nimport { WithTxnParams } from '../../types';\n\ninterface ManageBuilderIxParams {\n\tdriftClient: DriftClient;\n\t/**\n\t * The public key of the builder to manage.\n\t * This is the builder's authority address that owns their RevenueShare account.\n\t */\n\tbuilderAuthority: PublicKey;\n\t/**\n\t * Maximum fee the builder can charge, in tenths of basis points.\n\t *\n\t * Examples:\n\t * - 10 = 1 bps = 0.01%\n\t * - 50 = 5 bps = 0.05%\n\t * - 100 = 10 bps = 0.1%\n\t * - 1000 = 100 bps = 1%\n\t *\n\t * Special values:\n\t * - Set to 0 to revoke the builder (they remain in list but cannot be used)\n\t */\n\tmaxFeeTenthBps: number;\n\t/**\n\t * The public key of the authority to add the builder to the approved builders list.\n\t */\n\tauthority: PublicKey;\n\t/**\n\t * The public key of the wallet that will pay for the transaction.\n\t * If not provided, the authority provided will be the payer.\n\t */\n\tpayer?: PublicKey;\n}\n\n/**\n * Creates a transaction instruction to manage a builder's approval status and fee cap.\n *\n * This unified function handles all builder management operations:\n * - **Approve**: Add a new builder to the approved list\n * - **Update**: Modify an existing builder's max fee cap\n * - **Revoke**: Disable a builder by setting their max fee to 0\n *\n * ## Behavior:\n *\n * ### If builder NOT in list:\n * - Adds builder with specified `maxFeeTenthBps`\n *\n * ### If builder already in list:\n * - Updates builder's `maxFeeTenthBps` to new value\n * - Set to 0 to revoke (builder stays in list but cannot be used)\n *\n * ## Revocation Constraints:\n * When setting `maxFeeTenthBps = 0`, the builder cannot have active orders:\n * - No Open orders using this builder\n * - No Completed (unsettled) orders using this builder\n * - Error: `CannotRevokeBuilderWithOpenOrders` if constraint violated\n *\n * **Prerequisites**:\n * - User must have initialized a RevenueShareEscrow account\n * - Builder must have initialized a RevenueShare account (for receiving fees)\n *\n * @param driftClient - The Drift client instance\n * @param builderAuthority - The public key of the builder to manage\n * @param maxFeeTenthBps - Maximum fee cap in tenths of basis points\n *\n * @returns Promise resolving to a TransactionInstruction\n *\n * @example\n * ```typescript\n * // Approve a new builder with 5 bps max fee\n * const ix = await manageBuilderIx({\n * driftClient,\n * builderAuthority: new PublicKey('BuilderAddress...'),\n * maxFeeTenthBps: 50 // 5 bps = 0.05%\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Update existing builder to 10 bps max fee\n * const ix = await manageBuilderIx({\n * driftClient,\n * builderAuthority: builderPubkey,\n * maxFeeTenthBps: 100 // 10 bps = 0.1%\n * });\n * ```\n *\n * @example\n * ```typescript\n * // Revoke builder (set max fee to 0)\n * // IMPORTANT: Must settle all builder's orders first!\n * const ix = await manageBuilderIx({\n * driftClient,\n * builderAuthority: builderPubkey,\n * maxFeeTenthBps: 0 // Revoked\n * });\n * ```\n */\nexport const manageBuilderIx = async (\n\tparams: ManageBuilderIxParams\n): Promise<TransactionInstruction> => {\n\tconst { driftClient, builderAuthority, maxFeeTenthBps, authority, payer } =\n\t\tparams;\n\n\tconst isRevoke = maxFeeTenthBps === 0;\n\n\treturn driftClient.getChangeApprovedBuilderIx(\n\t\tbuilderAuthority,\n\t\tmaxFeeTenthBps,\n\t\t!isRevoke, // add = true (approve/update), false (revoke)\n\t\t{\n\t\t\tauthority,\n\t\t\tpayer: payer ?? authority,\n\t\t}\n\t);\n};\n\n/**\n * Creates a transaction to manage a builder's approval status and fee cap.\n *\n * This unified function handles all builder management operations:\n * - **Approve**: Add a new builder to the approved list\n * - **Update**: Modify an existing builder's max fee cap\n * - **Revoke**: Disable a builder by setting their max fee to 0\n *\n * ## Behavior:\n *\n * ### If builder NOT in list:\n * - Adds builder with specified `maxFeeTenthBps`\n *\n * ### If builder already in list:\n * - Updates builder's `maxFeeTenthBps` to new value\n * - Set to 0 to revoke (builder stays in list but cannot be used)\n *\n * ## Revocation Constraints:\n * When setting `maxFeeTenthBps = 0`, the builder cannot have active orders:\n * - No Open orders using this builder\n * - No Completed (unsettled) orders using this builder\n * - Error: `CannotRevokeBuilderWithOpenOrders` if constraint violated\n *\n * **Prerequisites**:\n * - User must have initialized a RevenueShareEscrow account\n * - Builder must have initialized a RevenueShare account (for receiving fees)\n *\n * @param driftClient - The Drift client instance\n * @param builderAuthority - The public key of the builder to manage\n * @param maxFeeTenthBps - Maximum fee cap in tenths of basis points\n * @param txParams - Optional transaction parameters for customizing the transaction\n *\n * @returns Promise resolving to a Transaction or VersionedTransaction ready for signing\n *\n * @example\n * ```typescript\n * // Approve a new builder with 2 bps max fee\n * const tx = await manageBuilderTxn({\n * driftClient,\n * builderAuthority: new PublicKey('BuilderAddress...'),\n * maxFeeTenthBps: 20,\n * txParams: { computeUnits: 200000 }\n * });\n *\n * const signature = await wallet.sendTransaction(tx, connection);\n * ```\n\n * @example\n * ```typescript\n * // Update existing builder's fee\n * await manageBuilderTxn({\n * driftClient,\n * builderAuthority: builderPubkey,\n * maxFeeTenthBps: 100 // Increase to 10 bps\n * });\n * ```\n */\nexport const manageBuilderTxn = async (\n\tparams: WithTxnParams<ManageBuilderIxParams>\n): Promise<Transaction | VersionedTransaction> => {\n\treturn params.driftClient.buildTransaction(\n\t\tawait manageBuilderIx(params),\n\t\tparams.txParams\n\t);\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/drift/base/actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,0CAAwB;AACxB,yCAAuB;AACvB,yCAAuB","sourcesContent":["export * from './user';\nexport * from './trade';\nexport * from './perp';\nexport * from './spot';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/drift/base/actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,0CAAwB;AACxB,yCAAuB;AACvB,yCAAuB;AACvB,4CAA0B","sourcesContent":["export * from './user';\nexport * from './trade';\nexport * from './perp';\nexport * from './spot';\nexport * from './builder';\n"]}
|
|
@@ -32,6 +32,34 @@ export interface OpenPerpMarketOrderBaseParams {
|
|
|
32
32
|
* This is only applicable for non-SWIFT orders.
|
|
33
33
|
*/
|
|
34
34
|
mainSignerOverride?: PublicKey;
|
|
35
|
+
/**
|
|
36
|
+
* Optional builder code parameters for revenue sharing.
|
|
37
|
+
* Only applicable for Swift orders.
|
|
38
|
+
*
|
|
39
|
+
* Prerequisites:
|
|
40
|
+
* - User must have initialized a RevenueShareEscrow account
|
|
41
|
+
* - Builder must be in the user's approved_builders list
|
|
42
|
+
* - builderFeeTenthBps must not exceed the builder's max_fee_tenth_bps
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* builderParams: {
|
|
47
|
+
* builderIdx: 0, // First builder in approved list
|
|
48
|
+
* builderFeeTenthBps: 50 // 5 bps = 0.05%
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
builderParams?: {
|
|
53
|
+
/**
|
|
54
|
+
* Index of the builder in the user's approved_builders list.
|
|
55
|
+
*/
|
|
56
|
+
builderIdx: number;
|
|
57
|
+
/**
|
|
58
|
+
* Fee to charge for this order, in tenths of basis points.
|
|
59
|
+
* Must be <= the builder's max_fee_tenth_bps.
|
|
60
|
+
*/
|
|
61
|
+
builderFeeTenthBps: number;
|
|
62
|
+
};
|
|
35
63
|
}
|
|
36
64
|
export interface OpenPerpMarketOrderBaseParamsWithSwift extends Omit<OpenPerpMarketOrderBaseParams, 'placeAndTake'> {
|
|
37
65
|
swiftOptions: SwiftOrderOptions;
|
|
@@ -48,7 +76,7 @@ export type OpenPerpMarketOrderParams<T extends boolean = boolean, S extends Omi
|
|
|
48
76
|
/**
|
|
49
77
|
* Creates and submits a Swift (signed message) order. Only available for perp orders.
|
|
50
78
|
*/
|
|
51
|
-
export declare function createSwiftMarketOrder({ driftClient, user, assetType, marketIndex, direction, amount, bracketOrders, dlobServerHttpUrl, optionalAuctionParamsInputs, swiftOptions, userOrderId, positionMaxLeverage, }: OpenPerpMarketOrderBaseParamsWithSwift): Promise<void>;
|
|
79
|
+
export declare function createSwiftMarketOrder({ driftClient, user, assetType, marketIndex, direction, amount, bracketOrders, dlobServerHttpUrl, optionalAuctionParamsInputs, swiftOptions, userOrderId, positionMaxLeverage, builderParams, }: OpenPerpMarketOrderBaseParamsWithSwift): Promise<void>;
|
|
52
80
|
/**
|
|
53
81
|
* Creates a placeAndTake transaction instruction.
|
|
54
82
|
* Fallbacks to a regular market order if no top makers are found.
|
|
@@ -12,7 +12,7 @@ const positionMaxLeverage_1 = require("../positionMaxLeverage");
|
|
|
12
12
|
/**
|
|
13
13
|
* Creates and submits a Swift (signed message) order. Only available for perp orders.
|
|
14
14
|
*/
|
|
15
|
-
async function createSwiftMarketOrder({ driftClient, user, assetType, marketIndex, direction, amount, bracketOrders, dlobServerHttpUrl, optionalAuctionParamsInputs, swiftOptions, userOrderId = 0, positionMaxLeverage, }) {
|
|
15
|
+
async function createSwiftMarketOrder({ driftClient, user, assetType, marketIndex, direction, amount, bracketOrders, dlobServerHttpUrl, optionalAuctionParamsInputs, swiftOptions, userOrderId = 0, positionMaxLeverage, builderParams, }) {
|
|
16
16
|
if (amount.isZero()) {
|
|
17
17
|
throw new Error('Amount must be greater than zero');
|
|
18
18
|
}
|
|
@@ -51,6 +51,7 @@ async function createSwiftMarketOrder({ driftClient, user, assetType, marketInde
|
|
|
51
51
|
stopLoss: bracketOrders === null || bracketOrders === void 0 ? void 0 : bracketOrders.stopLoss,
|
|
52
52
|
positionMaxLeverage,
|
|
53
53
|
},
|
|
54
|
+
builderParams,
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
57
|
exports.createSwiftMarketOrder = createSwiftMarketOrder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tDriftClient,\n\tUser,\n\tBN,\n\tPositionDirection,\n\tOptionalOrderParams,\n\tMarketType,\n\tgetUserStatsAccountPublicKey,\n\tReferrerInfo,\n\tBASE_PRECISION,\n} from '@drift-labs/sdk';\nimport {\n\tPublicKey,\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n} from '@solana/web3.js';\nimport { ENUM_UTILS } from '../../../../../../utils';\nimport {\n\tprepSignAndSendSwiftOrder,\n\tSwiftOrderOptions,\n} from '../openSwiftOrder';\nimport { buildNonMarketOrderParams } from '../../../../../utils/orderParams';\nimport {\n\tfetchAuctionOrderParams,\n\tfetchTopMakers,\n\tOptionalAuctionParamsRequestInputs,\n} from '../dlobServer';\nimport { ORDER_COMMON_UTILS } from '../../../../../../common-ui-utils/order';\nimport { WithTxnParams } from '../../../../types';\nimport { TxnOrSwiftResult } from '../types';\nimport { NoTopMakersError } from '../../../../../Drift/constants/errors';\nimport { PlaceAndTakeParams, OptionalTriggerOrderParams } from '../types';\nimport { getPositionMaxLeverageIxIfNeeded } from '../positionMaxLeverage';\n\nexport interface OpenPerpMarketOrderBaseParams {\n\tdriftClient: DriftClient;\n\tuser: User;\n\tassetType: 'base' | 'quote';\n\tmarketIndex: number;\n\tdirection: PositionDirection;\n\tamount: BN;\n\tdlobServerHttpUrl: string;\n\t// mainly used for UI order identification\n\tuserOrderId?: number;\n\tplaceAndTake?: PlaceAndTakeParams;\n\toptionalAuctionParamsInputs?: OptionalAuctionParamsRequestInputs;\n\tbracketOrders?: {\n\t\ttakeProfit?: OptionalTriggerOrderParams;\n\t\tstopLoss?: OptionalTriggerOrderParams;\n\t};\n\t/**\n\t * Optional per-market leverage to set for this position.\n\t * If provided and different from current position's leverage, will add an instruction\n\t * to update the position's maxMarginRatio before placing the order.\n\t * Example: 5 for 5x leverage, 10 for 10x leverage\n\t */\n\tpositionMaxLeverage?: number;\n\t/**\n\t * If provided, will override the main signer for the order. Otherwise, the main signer will be the user's authority.\n\t * This is only applicable for non-SWIFT orders.\n\t */\n\tmainSignerOverride?: PublicKey;\n}\n\nexport interface OpenPerpMarketOrderBaseParamsWithSwift\n\textends Omit<OpenPerpMarketOrderBaseParams, 'placeAndTake'> {\n\tswiftOptions: SwiftOrderOptions;\n}\n\nexport type OpenPerpMarketOrderParams<\n\tT extends boolean = boolean,\n\tS extends Omit<SwiftOrderOptions, 'swiftServerUrl'> = Omit<\n\t\tSwiftOrderOptions,\n\t\t'swiftServerUrl'\n\t>\n> = T extends true\n\t? OpenPerpMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tswiftOptions: S;\n\t\t\tplaceAndTake?: never;\n\t }\n\t: OpenPerpMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tplaceAndTake?: PlaceAndTakeParams;\n\t\t\tswiftOptions?: never;\n\t };\n/**\n * Creates and submits a Swift (signed message) order. Only available for perp orders.\n */\nexport async function createSwiftMarketOrder({\n\tdriftClient,\n\tuser,\n\tassetType,\n\tmarketIndex,\n\tdirection,\n\tamount,\n\tbracketOrders,\n\tdlobServerHttpUrl,\n\toptionalAuctionParamsInputs,\n\tswiftOptions,\n\tuserOrderId = 0,\n\tpositionMaxLeverage,\n}: OpenPerpMarketOrderBaseParamsWithSwift): Promise<void> {\n\tif (amount.isZero()) {\n\t\tthrow new Error('Amount must be greater than zero');\n\t}\n\n\t// Get order parameters from server\n\tconst fetchedOrderParams = await fetchAuctionOrderParams({\n\t\tdriftClient,\n\t\tuser,\n\t\tassetType,\n\t\tmarketIndex,\n\t\tmarketType: MarketType.PERP,\n\t\tdirection,\n\t\tamount,\n\t\tdlobServerHttpUrl,\n\t\toptionalAuctionParamsInputs,\n\t});\n\n\tconst oraclePrice = driftClient.getOracleDataForPerpMarket(marketIndex).price;\n\tconst totalQuoteAmount = amount.mul(oraclePrice).div(BASE_PRECISION);\n\n\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\tmarketIndex,\n\t\tdriftClient,\n\t\tuser,\n\t\ttotalQuoteAmount,\n\t\tdirection\n\t);\n\n\tconst orderParams = {\n\t\t...fetchedOrderParams,\n\t\tuserOrderId,\n\t\tbitFlags,\n\t};\n\n\tconst userAccount = user.getUserAccount();\n\tconst slotBuffer = swiftOptions.signedMessageOrderSlotBuffer || 7;\n\n\tawait prepSignAndSendSwiftOrder({\n\t\tdriftClient,\n\t\tsubAccountId: userAccount.subAccountId,\n\t\tuserAccountPubKey: user.userAccountPublicKey,\n\t\tmarketIndex,\n\t\tslotBuffer,\n\t\tswiftOptions,\n\t\torderParams: {\n\t\t\tmain: orderParams,\n\t\t\ttakeProfit: bracketOrders?.takeProfit,\n\t\t\tstopLoss: bracketOrders?.stopLoss,\n\t\t\tpositionMaxLeverage,\n\t\t},\n\t});\n}\n\n/**\n * Creates a placeAndTake transaction instruction.\n * Fallbacks to a regular market order if no top makers are found.\n */\nexport const createPlaceAndTakePerpMarketOrderIx = async ({\n\tassetType,\n\tdirection,\n\tdlobServerHttpUrl,\n\tmarketIndex,\n\tdriftClient,\n\tuser,\n\tuserOrderId,\n\tamount,\n\treferrerInfo,\n\tauctionDurationPercentage,\n\toptionalAuctionParamsInputs,\n\tmainSignerOverride,\n}: OpenPerpMarketOrderBaseParams & {\n\tdirection: PositionDirection;\n\tdlobServerHttpUrl: string;\n\tmarketIndex: number;\n\tdriftClient: DriftClient;\n\tuser: User;\n\treferrerInfo?: ReferrerInfo;\n\tauctionDurationPercentage?: number;\n}) => {\n\tconst counterPartySide = ENUM_UTILS.match(direction, PositionDirection.LONG)\n\t\t? 'ask'\n\t\t: 'bid';\n\n\tconst [fetchedOrderParams, topMakersResult] = await Promise.all([\n\t\tfetchAuctionOrderParams({\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\tassetType,\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection,\n\t\t\tamount,\n\t\t\tdlobServerHttpUrl,\n\t\t\toptionalAuctionParamsInputs,\n\t\t}),\n\t\tfetchTopMakers({\n\t\t\tdlobServerHttpUrl,\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tside: counterPartySide,\n\t\t\tlimit: 4,\n\t\t}),\n\t]);\n\n\tconst oraclePrice = driftClient.getOracleDataForPerpMarket(marketIndex).price;\n\tconst totalQuoteAmount = amount.mul(oraclePrice).div(BASE_PRECISION);\n\n\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\tmarketIndex,\n\t\tdriftClient,\n\t\tuser,\n\t\ttotalQuoteAmount,\n\t\tdirection\n\t);\n\tfetchedOrderParams.bitFlags = bitFlags;\n\tfetchedOrderParams.userOrderId = userOrderId;\n\n\tif (!topMakersResult || topMakersResult.length === 0) {\n\t\tthrow new NoTopMakersError('No top makers found', fetchedOrderParams);\n\t}\n\n\tconst topMakersInfo = topMakersResult.map((maker) => ({\n\t\tmaker: maker.userAccountPubKey,\n\t\tmakerUserAccount: maker.userAccount,\n\t\tmakerStats: getUserStatsAccountPublicKey(\n\t\t\tdriftClient.program.programId,\n\t\t\tmaker.userAccount.authority\n\t\t),\n\t}));\n\n\tconst placeAndTakeIx = await driftClient.getPlaceAndTakePerpOrderIx(\n\t\tfetchedOrderParams,\n\t\ttopMakersInfo,\n\t\treferrerInfo,\n\t\tundefined,\n\t\tauctionDurationPercentage,\n\t\tuser.getUserAccount().subAccountId,\n\t\t{\n\t\t\tauthority: mainSignerOverride,\n\t\t}\n\t);\n\n\treturn placeAndTakeIx;\n};\n\n/**\n * Creates transaction instructions for opening a perp market order.\n * If swiftOptions is provided, it will create a Swift (signed message) order instead.\n *\n * @param driftClient - The Drift client instance for interacting with the protocol\n * @param user - The user account that will place the order\n * @param assetType - Whether the amount is in base or quote units\n * @param marketIndex - The perp market index to trade\n * @param direction - The direction of the trade (long/short)\n * @param amount - The amount to trade\n * @param dlobServerHttpUrl - Server URL for the auction params endpoint\n * @param optionalAuctionParamsInputs - Optional parameters for auction params endpoint and order configuration\n * @param positionMaxLeverage - Optional per-market leverage (e.g., 5 for 5x). If provided and different from current,\n * adds an instruction to update the position's maxMarginRatio before placing the order.\n *\n * @returns Promise resolving to an array of transaction instructions for regular orders\n */\nexport const createOpenPerpMarketOrderIxs = async ({\n\tdriftClient,\n\tuser,\n\tassetType,\n\tmarketIndex,\n\tdirection,\n\tamount,\n\tbracketOrders,\n\tdlobServerHttpUrl,\n\tplaceAndTake,\n\tuserOrderId,\n\toptionalAuctionParamsInputs = {},\n\tpositionMaxLeverage,\n\tmainSignerOverride,\n}: OpenPerpMarketOrderBaseParams): Promise<TransactionInstruction[]> => {\n\tif (!amount || amount.isZero()) {\n\t\tthrow new Error('Amount must be greater than zero');\n\t}\n\n\tconst allOrders: OptionalOrderParams[] = [];\n\tconst allIxs: TransactionInstruction[] = [];\n\n\tconst leverageIx = await getPositionMaxLeverageIxIfNeeded(\n\t\tdriftClient,\n\t\tuser,\n\t\tmarketIndex,\n\t\tpositionMaxLeverage\n\t);\n\tif (leverageIx) {\n\t\tallIxs.push(leverageIx);\n\t}\n\n\tif (placeAndTake?.enable) {\n\t\ttry {\n\t\t\tconst placeAndTakeIx = await createPlaceAndTakePerpMarketOrderIx({\n\t\t\t\tassetType,\n\t\t\t\tamount,\n\t\t\t\tdirection,\n\t\t\t\tdlobServerHttpUrl,\n\t\t\t\tmarketIndex,\n\t\t\t\tdriftClient,\n\t\t\t\tuser,\n\t\t\t\tuserOrderId,\n\t\t\t\treferrerInfo: placeAndTake.referrerInfo,\n\t\t\t\tauctionDurationPercentage: placeAndTake.auctionDurationPercentage,\n\t\t\t\toptionalAuctionParamsInputs,\n\t\t\t\tmainSignerOverride,\n\t\t\t});\n\t\t\tallIxs.push(placeAndTakeIx);\n\t\t} catch (e) {\n\t\t\tif (e instanceof NoTopMakersError) {\n\t\t\t\t// fallback to regular order\n\t\t\t\tallOrders.push(e.orderParams);\n\t\t\t} else {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst fetchedOrderParams = await fetchAuctionOrderParams({\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\tassetType,\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection,\n\t\t\tamount,\n\t\t\tdlobServerHttpUrl,\n\t\t\toptionalAuctionParamsInputs,\n\t\t});\n\n\t\tconst oraclePrice =\n\t\t\tdriftClient.getOracleDataForPerpMarket(marketIndex).price;\n\t\tconst totalQuoteAmount = amount.mul(oraclePrice).div(BASE_PRECISION);\n\n\t\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\t\tmarketIndex,\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\ttotalQuoteAmount,\n\t\t\tdirection\n\t\t);\n\n\t\tconst orderParams = {\n\t\t\t...fetchedOrderParams,\n\t\t\tuserOrderId,\n\t\t\tbitFlags,\n\t\t};\n\n\t\tallOrders.push(orderParams);\n\t}\n\n\tconst bracketOrdersDirection = ENUM_UTILS.match(\n\t\tdirection,\n\t\tPositionDirection.LONG\n\t)\n\t\t? PositionDirection.SHORT\n\t\t: PositionDirection.LONG;\n\n\tif (bracketOrders?.takeProfit) {\n\t\tconst takeProfitParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount: bracketOrders.takeProfit.baseAssetAmount ?? amount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'takeProfit',\n\t\t\t\ttriggerPrice: bracketOrders.takeProfit.triggerPrice,\n\t\t\t\tlimitPrice: bracketOrders.takeProfit.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: bracketOrders.takeProfit.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(takeProfitParams);\n\t}\n\n\tif (bracketOrders?.stopLoss) {\n\t\tconst stopLossParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount: bracketOrders.stopLoss.baseAssetAmount ?? amount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'stopLoss',\n\t\t\t\ttriggerPrice: bracketOrders.stopLoss.triggerPrice,\n\t\t\t\tlimitPrice: bracketOrders.stopLoss.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: bracketOrders.stopLoss.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(stopLossParams);\n\t}\n\n\t// Regular order flow - create transaction instruction\n\tif (allOrders.length > 0) {\n\t\tconst placeOrderIx = await driftClient.getPlaceOrdersIx(\n\t\t\tallOrders,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tauthority: mainSignerOverride,\n\t\t\t}\n\t\t);\n\t\tallIxs.push(placeOrderIx);\n\t}\n\n\treturn allIxs;\n};\n\n/**\n * Creates a complete transaction for opening a perp market order.\n *\n * @param driftClient - The Drift client instance for interacting with the protocol\n * @param user - The user account that will place the order\n * @param marketIndex - The perp market index to trade\n * @param direction - The direction of the trade (long/short)\n * @param amount - The amount to trade\n * @param optionalAuctionParamsInputs - Optional parameters for auction params endpoint and order configuration\n * @param dlobServerHttpUrl - Server URL for the auction params endpoint\n * @param positionMaxLeverage - Optional per-market leverage (e.g., 5 for 5x). If provided and different from current,\n * includes an instruction to update the position's maxMarginRatio.\n *\n * @returns Promise resolving to a built transaction ready for signing (Transaction or VersionedTransaction)\n */\nexport const createOpenPerpMarketOrderTxn = async (\n\tparams: WithTxnParams<OpenPerpMarketOrderBaseParams>\n): Promise<Transaction | VersionedTransaction> => {\n\tconst { driftClient } = params;\n\n\t// Regular order flow - create transaction instruction and build transaction\n\tconst placeOrderIxs = await createOpenPerpMarketOrderIxs(params);\n\tconst openPerpMarketOrderTxn = await driftClient.txHandler.buildTransaction({\n\t\tinstructions: placeOrderIxs,\n\t\ttxVersion: 0,\n\t\tconnection: driftClient.connection,\n\t\tpreFlightCommitment: 'confirmed',\n\t\tfetchAllMarketLookupTableAccounts:\n\t\t\tdriftClient.fetchAllLookupTableAccounts.bind(driftClient),\n\t\ttxParams: params.txParams,\n\t});\n\n\treturn openPerpMarketOrderTxn;\n};\n\n/**\n * Creates a transaction or swift order for a perp market order.\n *\n * @param driftClient - The Drift client instance for interacting with the protocol\n * @param user - The user account that will place the order\n * @param marketIndex - The perp market index to trade\n * @param direction - The direction of the trade (long/short)\n * @param amount - The amount to trade\n * @param optionalAuctionParamsInputs - Optional parameters for auction params endpoint and order configuration\n * @param dlobServerHttpUrl - Server URL for the auction params endpoint\n * @param useSwift - Whether to use Swift (signed message) orders instead of regular transactions\n * @param swiftOptions - Options for Swift (signed message) orders. Required if useSwift is true\n * @param userOrderId - The user order id for UI identification\n * @param positionMaxLeverage - Optional per-market leverage (e.g., 5 for 5x). Only supported for regular transactions (not Swift).\n *\n * @returns Promise resolving to a built transaction ready for signing (Transaction or VersionedTransaction)\n */\nexport const createOpenPerpMarketOrder = async <T extends boolean>(\n\tparams: WithTxnParams<OpenPerpMarketOrderParams<T, SwiftOrderOptions>>\n): Promise<TxnOrSwiftResult<T>> => {\n\tconst { useSwift, swiftOptions, ...rest } = params;\n\n\t// If useSwift is true, return the Swift result directly\n\tif (useSwift) {\n\t\tif (!swiftOptions) {\n\t\t\tthrow new Error('swiftOptions is required when useSwift is true');\n\t\t}\n\n\t\tconst swiftOrderResult = await createSwiftMarketOrder({\n\t\t\t...rest,\n\t\t\tswiftOptions,\n\t\t});\n\n\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t}\n\n\tconst openPerpMarketOrderTxn = await createOpenPerpMarketOrderTxn(rest);\n\n\treturn openPerpMarketOrderTxn as TxnOrSwiftResult<T>;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/drift/base/actions/trade/openPerpOrder/openPerpMarketOrder/index.ts"],"names":[],"mappings":";;;AAAA,yCAUyB;AAOzB,mDAAqD;AACrD,sDAG2B;AAC3B,kEAA6E;AAC7E,8CAIuB;AACvB,mEAA6E;AAG7E,kEAAyE;AAEzE,gEAA0E;AAkF1E;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAAC,EAC5C,WAAW,EACX,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,2BAA2B,EAC3B,YAAY,EACZ,WAAW,GAAG,CAAC,EACf,mBAAmB,EACnB,aAAa,GAC2B;IACxC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrD,CAAC;IAED,mCAAmC;IACnC,MAAM,kBAAkB,GAAG,MAAM,IAAA,oCAAuB,EAAC;QACxD,WAAW;QACX,IAAI;QACJ,SAAS;QACT,WAAW;QACX,UAAU,EAAE,gBAAU,CAAC,IAAI;QAC3B,SAAS;QACT,MAAM;QACN,iBAAiB;QACjB,2BAA2B;KAC3B,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;IAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,oBAAc,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,0BAAkB,CAAC,0BAA0B,CAC7D,WAAW,EACX,WAAW,EACX,IAAI,EACJ,gBAAgB,EAChB,SAAS,CACT,CAAC;IAEF,MAAM,WAAW,GAAG;QACnB,GAAG,kBAAkB;QACrB,WAAW;QACX,QAAQ;KACR,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,4BAA4B,IAAI,CAAC,CAAC;IAElE,MAAM,IAAA,0CAAyB,EAAC;QAC/B,WAAW;QACX,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,iBAAiB,EAAE,IAAI,CAAC,oBAAoB;QAC5C,WAAW;QACX,UAAU;QACV,YAAY;QACZ,WAAW,EAAE;YACZ,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAU;YACrC,QAAQ,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ;YACjC,mBAAmB;SACnB;QACD,aAAa;KACb,CAAC,CAAC;AACJ,CAAC;AAnED,wDAmEC;AAED;;;GAGG;AACI,MAAM,mCAAmC,GAAG,KAAK,EAAE,EACzD,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,IAAI,EACJ,WAAW,EACX,MAAM,EACN,YAAY,EACZ,yBAAyB,EACzB,2BAA2B,EAC3B,kBAAkB,GASlB,EAAE,EAAE;IACJ,MAAM,gBAAgB,GAAG,kBAAU,CAAC,KAAK,CAAC,SAAS,EAAE,uBAAiB,CAAC,IAAI,CAAC;QAC3E,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,CAAC;IAET,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/D,IAAA,oCAAuB,EAAC;YACvB,WAAW;YACX,IAAI;YACJ,SAAS;YACT,WAAW;YACX,UAAU,EAAE,gBAAU,CAAC,IAAI;YAC3B,SAAS;YACT,MAAM;YACN,iBAAiB;YACjB,2BAA2B;SAC3B,CAAC;QACF,IAAA,2BAAc,EAAC;YACd,iBAAiB;YACjB,WAAW;YACX,UAAU,EAAE,gBAAU,CAAC,IAAI;YAC3B,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,CAAC;SACR,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;IAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,oBAAc,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,0BAAkB,CAAC,0BAA0B,CAC7D,WAAW,EACX,WAAW,EACX,IAAI,EACJ,gBAAgB,EAChB,SAAS,CACT,CAAC;IACF,kBAAkB,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvC,kBAAkB,CAAC,WAAW,GAAG,WAAW,CAAC;IAE7C,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,yBAAgB,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,KAAK,EAAE,KAAK,CAAC,iBAAiB;QAC9B,gBAAgB,EAAE,KAAK,CAAC,WAAW;QACnC,UAAU,EAAE,IAAA,kCAA4B,EACvC,WAAW,CAAC,OAAO,CAAC,SAAS,EAC7B,KAAK,CAAC,WAAW,CAAC,SAAS,CAC3B;KACD,CAAC,CAAC,CAAC;IAEJ,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,0BAA0B,CAClE,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,yBAAyB,EACzB,IAAI,CAAC,cAAc,EAAE,CAAC,YAAY,EAClC;QACC,SAAS,EAAE,kBAAkB;KAC7B,CACD,CAAC;IAEF,OAAO,cAAc,CAAC;AACvB,CAAC,CAAC;AAtFW,QAAA,mCAAmC,uCAsF9C;AAEF;;;;;;;;;;;;;;;;GAgBG;AACI,MAAM,4BAA4B,GAAG,KAAK,EAAE,EAClD,WAAW,EACX,IAAI,EACJ,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,2BAA2B,GAAG,EAAE,EAChC,mBAAmB,EACnB,kBAAkB,GACa,EAAqC,EAAE;;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,MAAM,UAAU,GAAG,MAAM,IAAA,sDAAgC,EACxD,WAAW,EACX,IAAI,EACJ,WAAW,EACX,mBAAmB,CACnB,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC;YACJ,MAAM,cAAc,GAAG,MAAM,IAAA,2CAAmC,EAAC;gBAChE,SAAS;gBACT,MAAM;gBACN,SAAS;gBACT,iBAAiB;gBACjB,WAAW;gBACX,WAAW;gBACX,IAAI;gBACJ,WAAW;gBACX,YAAY,EAAE,YAAY,CAAC,YAAY;gBACvC,yBAAyB,EAAE,YAAY,CAAC,yBAAyB;gBACjE,2BAA2B;gBAC3B,kBAAkB;aAClB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,yBAAgB,EAAE,CAAC;gBACnC,4BAA4B;gBAC5B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,CAAC;YACT,CAAC;QACF,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,kBAAkB,GAAG,MAAM,IAAA,oCAAuB,EAAC;YACxD,WAAW;YACX,IAAI;YACJ,SAAS;YACT,WAAW;YACX,UAAU,EAAE,gBAAU,CAAC,IAAI;YAC3B,SAAS;YACT,MAAM;YACN,iBAAiB;YACjB,2BAA2B;SAC3B,CAAC,CAAC;QAEH,MAAM,WAAW,GAChB,WAAW,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC;QAC3D,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,oBAAc,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAG,0BAAkB,CAAC,0BAA0B,CAC7D,WAAW,EACX,WAAW,EACX,IAAI,EACJ,gBAAgB,EAChB,SAAS,CACT,CAAC;QAEF,MAAM,WAAW,GAAG;YACnB,GAAG,kBAAkB;YACrB,WAAW;YACX,QAAQ;SACR,CAAC;QAEF,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,sBAAsB,GAAG,kBAAU,CAAC,KAAK,CAC9C,SAAS,EACT,uBAAiB,CAAC,IAAI,CACtB;QACA,CAAC,CAAC,uBAAiB,CAAC,KAAK;QACzB,CAAC,CAAC,uBAAiB,CAAC,IAAI,CAAC;IAE1B,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAU,EAAE,CAAC;QAC/B,MAAM,gBAAgB,GAAG,IAAA,uCAAyB,EAAC;YAClD,WAAW;YACX,UAAU,EAAE,gBAAU,CAAC,IAAI;YAC3B,SAAS,EAAE,sBAAsB;YACjC,eAAe,EAAE,MAAA,aAAa,CAAC,UAAU,CAAC,eAAe,mCAAI,MAAM;YACnE,WAAW,EAAE;gBACZ,SAAS,EAAE,YAAY;gBACvB,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC,YAAY;gBACnD,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,UAAU;aAC/C;YACD,UAAU,EAAE,MAAA,aAAa,CAAC,UAAU,CAAC,UAAU,mCAAI,IAAI;SACvD,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,QAAQ,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,IAAA,uCAAyB,EAAC;YAChD,WAAW;YACX,UAAU,EAAE,gBAAU,CAAC,IAAI;YAC3B,SAAS,EAAE,sBAAsB;YACjC,eAAe,EAAE,MAAA,aAAa,CAAC,QAAQ,CAAC,eAAe,mCAAI,MAAM;YACjE,WAAW,EAAE;gBACZ,SAAS,EAAE,UAAU;gBACrB,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,YAAY;gBACjD,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,UAAU;aAC7C;YACD,UAAU,EAAE,MAAA,aAAa,CAAC,QAAQ,CAAC,UAAU,mCAAI,IAAI;SACrD,CAAC,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAED,sDAAsD;IACtD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,gBAAgB,CACtD,SAAS,EACT,SAAS,EACT;YACC,SAAS,EAAE,kBAAkB;SAC7B,CACD,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AA/IW,QAAA,4BAA4B,gCA+IvC;AAEF;;;;;;;;;;;;;;GAcG;AACI,MAAM,4BAA4B,GAAG,KAAK,EAChD,MAAoD,EACN,EAAE;IAChD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAE/B,4EAA4E;IAC5E,MAAM,aAAa,GAAG,MAAM,IAAA,oCAA4B,EAAC,MAAM,CAAC,CAAC;IACjE,MAAM,sBAAsB,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAC3E,YAAY,EAAE,aAAa;QAC3B,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,mBAAmB,EAAE,WAAW;QAChC,iCAAiC,EAChC,WAAW,CAAC,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,QAAQ,EAAE,MAAM,CAAC,QAAQ;KACzB,CAAC,CAAC;IAEH,OAAO,sBAAsB,CAAC;AAC/B,CAAC,CAAC;AAlBW,QAAA,4BAA4B,gCAkBvC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACI,MAAM,yBAAyB,GAAG,KAAK,EAC7C,MAAsE,EACvC,EAAE;IACjC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAEnD,wDAAwD;IACxD,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,sBAAsB,CAAC;YACrD,GAAG,IAAI;YACP,YAAY;SACZ,CAAC,CAAC;QAEH,OAAO,gBAAuC,CAAC;IAChD,CAAC;IAED,MAAM,sBAAsB,GAAG,MAAM,IAAA,oCAA4B,EAAC,IAAI,CAAC,CAAC;IAExE,OAAO,sBAA6C,CAAC;AACtD,CAAC,CAAC;AAtBW,QAAA,yBAAyB,6BAsBpC","sourcesContent":["import {\n\tDriftClient,\n\tUser,\n\tBN,\n\tPositionDirection,\n\tOptionalOrderParams,\n\tMarketType,\n\tgetUserStatsAccountPublicKey,\n\tReferrerInfo,\n\tBASE_PRECISION,\n} from '@drift-labs/sdk';\nimport {\n\tPublicKey,\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n} from '@solana/web3.js';\nimport { ENUM_UTILS } from '../../../../../../utils';\nimport {\n\tprepSignAndSendSwiftOrder,\n\tSwiftOrderOptions,\n} from '../openSwiftOrder';\nimport { buildNonMarketOrderParams } from '../../../../../utils/orderParams';\nimport {\n\tfetchAuctionOrderParams,\n\tfetchTopMakers,\n\tOptionalAuctionParamsRequestInputs,\n} from '../dlobServer';\nimport { ORDER_COMMON_UTILS } from '../../../../../../common-ui-utils/order';\nimport { WithTxnParams } from '../../../../types';\nimport { TxnOrSwiftResult } from '../types';\nimport { NoTopMakersError } from '../../../../../Drift/constants/errors';\nimport { PlaceAndTakeParams, OptionalTriggerOrderParams } from '../types';\nimport { getPositionMaxLeverageIxIfNeeded } from '../positionMaxLeverage';\n\nexport interface OpenPerpMarketOrderBaseParams {\n\tdriftClient: DriftClient;\n\tuser: User;\n\tassetType: 'base' | 'quote';\n\tmarketIndex: number;\n\tdirection: PositionDirection;\n\tamount: BN;\n\tdlobServerHttpUrl: string;\n\t// mainly used for UI order identification\n\tuserOrderId?: number;\n\tplaceAndTake?: PlaceAndTakeParams;\n\toptionalAuctionParamsInputs?: OptionalAuctionParamsRequestInputs;\n\tbracketOrders?: {\n\t\ttakeProfit?: OptionalTriggerOrderParams;\n\t\tstopLoss?: OptionalTriggerOrderParams;\n\t};\n\t/**\n\t * Optional per-market leverage to set for this position.\n\t * If provided and different from current position's leverage, will add an instruction\n\t * to update the position's maxMarginRatio before placing the order.\n\t * Example: 5 for 5x leverage, 10 for 10x leverage\n\t */\n\tpositionMaxLeverage?: number;\n\t/**\n\t * If provided, will override the main signer for the order. Otherwise, the main signer will be the user's authority.\n\t * This is only applicable for non-SWIFT orders.\n\t */\n\tmainSignerOverride?: PublicKey;\n\t/**\n\t * Optional builder code parameters for revenue sharing.\n\t * Only applicable for Swift orders.\n\t *\n\t * Prerequisites:\n\t * - User must have initialized a RevenueShareEscrow account\n\t * - Builder must be in the user's approved_builders list\n\t * - builderFeeTenthBps must not exceed the builder's max_fee_tenth_bps\n\t *\n\t * @example\n\t * ```typescript\n\t * builderParams: {\n\t * builderIdx: 0, // First builder in approved list\n\t * builderFeeTenthBps: 50 // 5 bps = 0.05%\n\t * }\n\t * ```\n\t */\n\tbuilderParams?: {\n\t\t/**\n\t\t * Index of the builder in the user's approved_builders list.\n\t\t */\n\t\tbuilderIdx: number;\n\t\t/**\n\t\t * Fee to charge for this order, in tenths of basis points.\n\t\t * Must be <= the builder's max_fee_tenth_bps.\n\t\t */\n\t\tbuilderFeeTenthBps: number;\n\t};\n}\n\nexport interface OpenPerpMarketOrderBaseParamsWithSwift\n\textends Omit<OpenPerpMarketOrderBaseParams, 'placeAndTake'> {\n\tswiftOptions: SwiftOrderOptions;\n}\n\nexport type OpenPerpMarketOrderParams<\n\tT extends boolean = boolean,\n\tS extends Omit<SwiftOrderOptions, 'swiftServerUrl'> = Omit<\n\t\tSwiftOrderOptions,\n\t\t'swiftServerUrl'\n\t>\n> = T extends true\n\t? OpenPerpMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tswiftOptions: S;\n\t\t\tplaceAndTake?: never;\n\t }\n\t: OpenPerpMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tplaceAndTake?: PlaceAndTakeParams;\n\t\t\tswiftOptions?: never;\n\t };\n/**\n * Creates and submits a Swift (signed message) order. Only available for perp orders.\n */\nexport async function createSwiftMarketOrder({\n\tdriftClient,\n\tuser,\n\tassetType,\n\tmarketIndex,\n\tdirection,\n\tamount,\n\tbracketOrders,\n\tdlobServerHttpUrl,\n\toptionalAuctionParamsInputs,\n\tswiftOptions,\n\tuserOrderId = 0,\n\tpositionMaxLeverage,\n\tbuilderParams,\n}: OpenPerpMarketOrderBaseParamsWithSwift): Promise<void> {\n\tif (amount.isZero()) {\n\t\tthrow new Error('Amount must be greater than zero');\n\t}\n\n\t// Get order parameters from server\n\tconst fetchedOrderParams = await fetchAuctionOrderParams({\n\t\tdriftClient,\n\t\tuser,\n\t\tassetType,\n\t\tmarketIndex,\n\t\tmarketType: MarketType.PERP,\n\t\tdirection,\n\t\tamount,\n\t\tdlobServerHttpUrl,\n\t\toptionalAuctionParamsInputs,\n\t});\n\n\tconst oraclePrice = driftClient.getOracleDataForPerpMarket(marketIndex).price;\n\tconst totalQuoteAmount = amount.mul(oraclePrice).div(BASE_PRECISION);\n\n\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\tmarketIndex,\n\t\tdriftClient,\n\t\tuser,\n\t\ttotalQuoteAmount,\n\t\tdirection\n\t);\n\n\tconst orderParams = {\n\t\t...fetchedOrderParams,\n\t\tuserOrderId,\n\t\tbitFlags,\n\t};\n\n\tconst userAccount = user.getUserAccount();\n\tconst slotBuffer = swiftOptions.signedMessageOrderSlotBuffer || 7;\n\n\tawait prepSignAndSendSwiftOrder({\n\t\tdriftClient,\n\t\tsubAccountId: userAccount.subAccountId,\n\t\tuserAccountPubKey: user.userAccountPublicKey,\n\t\tmarketIndex,\n\t\tslotBuffer,\n\t\tswiftOptions,\n\t\torderParams: {\n\t\t\tmain: orderParams,\n\t\t\ttakeProfit: bracketOrders?.takeProfit,\n\t\t\tstopLoss: bracketOrders?.stopLoss,\n\t\t\tpositionMaxLeverage,\n\t\t},\n\t\tbuilderParams,\n\t});\n}\n\n/**\n * Creates a placeAndTake transaction instruction.\n * Fallbacks to a regular market order if no top makers are found.\n */\nexport const createPlaceAndTakePerpMarketOrderIx = async ({\n\tassetType,\n\tdirection,\n\tdlobServerHttpUrl,\n\tmarketIndex,\n\tdriftClient,\n\tuser,\n\tuserOrderId,\n\tamount,\n\treferrerInfo,\n\tauctionDurationPercentage,\n\toptionalAuctionParamsInputs,\n\tmainSignerOverride,\n}: OpenPerpMarketOrderBaseParams & {\n\tdirection: PositionDirection;\n\tdlobServerHttpUrl: string;\n\tmarketIndex: number;\n\tdriftClient: DriftClient;\n\tuser: User;\n\treferrerInfo?: ReferrerInfo;\n\tauctionDurationPercentage?: number;\n}) => {\n\tconst counterPartySide = ENUM_UTILS.match(direction, PositionDirection.LONG)\n\t\t? 'ask'\n\t\t: 'bid';\n\n\tconst [fetchedOrderParams, topMakersResult] = await Promise.all([\n\t\tfetchAuctionOrderParams({\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\tassetType,\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection,\n\t\t\tamount,\n\t\t\tdlobServerHttpUrl,\n\t\t\toptionalAuctionParamsInputs,\n\t\t}),\n\t\tfetchTopMakers({\n\t\t\tdlobServerHttpUrl,\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tside: counterPartySide,\n\t\t\tlimit: 4,\n\t\t}),\n\t]);\n\n\tconst oraclePrice = driftClient.getOracleDataForPerpMarket(marketIndex).price;\n\tconst totalQuoteAmount = amount.mul(oraclePrice).div(BASE_PRECISION);\n\n\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\tmarketIndex,\n\t\tdriftClient,\n\t\tuser,\n\t\ttotalQuoteAmount,\n\t\tdirection\n\t);\n\tfetchedOrderParams.bitFlags = bitFlags;\n\tfetchedOrderParams.userOrderId = userOrderId;\n\n\tif (!topMakersResult || topMakersResult.length === 0) {\n\t\tthrow new NoTopMakersError('No top makers found', fetchedOrderParams);\n\t}\n\n\tconst topMakersInfo = topMakersResult.map((maker) => ({\n\t\tmaker: maker.userAccountPubKey,\n\t\tmakerUserAccount: maker.userAccount,\n\t\tmakerStats: getUserStatsAccountPublicKey(\n\t\t\tdriftClient.program.programId,\n\t\t\tmaker.userAccount.authority\n\t\t),\n\t}));\n\n\tconst placeAndTakeIx = await driftClient.getPlaceAndTakePerpOrderIx(\n\t\tfetchedOrderParams,\n\t\ttopMakersInfo,\n\t\treferrerInfo,\n\t\tundefined,\n\t\tauctionDurationPercentage,\n\t\tuser.getUserAccount().subAccountId,\n\t\t{\n\t\t\tauthority: mainSignerOverride,\n\t\t}\n\t);\n\n\treturn placeAndTakeIx;\n};\n\n/**\n * Creates transaction instructions for opening a perp market order.\n * If swiftOptions is provided, it will create a Swift (signed message) order instead.\n *\n * @param driftClient - The Drift client instance for interacting with the protocol\n * @param user - The user account that will place the order\n * @param assetType - Whether the amount is in base or quote units\n * @param marketIndex - The perp market index to trade\n * @param direction - The direction of the trade (long/short)\n * @param amount - The amount to trade\n * @param dlobServerHttpUrl - Server URL for the auction params endpoint\n * @param optionalAuctionParamsInputs - Optional parameters for auction params endpoint and order configuration\n * @param positionMaxLeverage - Optional per-market leverage (e.g., 5 for 5x). If provided and different from current,\n * adds an instruction to update the position's maxMarginRatio before placing the order.\n *\n * @returns Promise resolving to an array of transaction instructions for regular orders\n */\nexport const createOpenPerpMarketOrderIxs = async ({\n\tdriftClient,\n\tuser,\n\tassetType,\n\tmarketIndex,\n\tdirection,\n\tamount,\n\tbracketOrders,\n\tdlobServerHttpUrl,\n\tplaceAndTake,\n\tuserOrderId,\n\toptionalAuctionParamsInputs = {},\n\tpositionMaxLeverage,\n\tmainSignerOverride,\n}: OpenPerpMarketOrderBaseParams): Promise<TransactionInstruction[]> => {\n\tif (!amount || amount.isZero()) {\n\t\tthrow new Error('Amount must be greater than zero');\n\t}\n\n\tconst allOrders: OptionalOrderParams[] = [];\n\tconst allIxs: TransactionInstruction[] = [];\n\n\tconst leverageIx = await getPositionMaxLeverageIxIfNeeded(\n\t\tdriftClient,\n\t\tuser,\n\t\tmarketIndex,\n\t\tpositionMaxLeverage\n\t);\n\tif (leverageIx) {\n\t\tallIxs.push(leverageIx);\n\t}\n\n\tif (placeAndTake?.enable) {\n\t\ttry {\n\t\t\tconst placeAndTakeIx = await createPlaceAndTakePerpMarketOrderIx({\n\t\t\t\tassetType,\n\t\t\t\tamount,\n\t\t\t\tdirection,\n\t\t\t\tdlobServerHttpUrl,\n\t\t\t\tmarketIndex,\n\t\t\t\tdriftClient,\n\t\t\t\tuser,\n\t\t\t\tuserOrderId,\n\t\t\t\treferrerInfo: placeAndTake.referrerInfo,\n\t\t\t\tauctionDurationPercentage: placeAndTake.auctionDurationPercentage,\n\t\t\t\toptionalAuctionParamsInputs,\n\t\t\t\tmainSignerOverride,\n\t\t\t});\n\t\t\tallIxs.push(placeAndTakeIx);\n\t\t} catch (e) {\n\t\t\tif (e instanceof NoTopMakersError) {\n\t\t\t\t// fallback to regular order\n\t\t\t\tallOrders.push(e.orderParams);\n\t\t\t} else {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst fetchedOrderParams = await fetchAuctionOrderParams({\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\tassetType,\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection,\n\t\t\tamount,\n\t\t\tdlobServerHttpUrl,\n\t\t\toptionalAuctionParamsInputs,\n\t\t});\n\n\t\tconst oraclePrice =\n\t\t\tdriftClient.getOracleDataForPerpMarket(marketIndex).price;\n\t\tconst totalQuoteAmount = amount.mul(oraclePrice).div(BASE_PRECISION);\n\n\t\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\t\tmarketIndex,\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\ttotalQuoteAmount,\n\t\t\tdirection\n\t\t);\n\n\t\tconst orderParams = {\n\t\t\t...fetchedOrderParams,\n\t\t\tuserOrderId,\n\t\t\tbitFlags,\n\t\t};\n\n\t\tallOrders.push(orderParams);\n\t}\n\n\tconst bracketOrdersDirection = ENUM_UTILS.match(\n\t\tdirection,\n\t\tPositionDirection.LONG\n\t)\n\t\t? PositionDirection.SHORT\n\t\t: PositionDirection.LONG;\n\n\tif (bracketOrders?.takeProfit) {\n\t\tconst takeProfitParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount: bracketOrders.takeProfit.baseAssetAmount ?? amount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'takeProfit',\n\t\t\t\ttriggerPrice: bracketOrders.takeProfit.triggerPrice,\n\t\t\t\tlimitPrice: bracketOrders.takeProfit.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: bracketOrders.takeProfit.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(takeProfitParams);\n\t}\n\n\tif (bracketOrders?.stopLoss) {\n\t\tconst stopLossParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount: bracketOrders.stopLoss.baseAssetAmount ?? amount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'stopLoss',\n\t\t\t\ttriggerPrice: bracketOrders.stopLoss.triggerPrice,\n\t\t\t\tlimitPrice: bracketOrders.stopLoss.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: bracketOrders.stopLoss.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(stopLossParams);\n\t}\n\n\t// Regular order flow - create transaction instruction\n\tif (allOrders.length > 0) {\n\t\tconst placeOrderIx = await driftClient.getPlaceOrdersIx(\n\t\t\tallOrders,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tauthority: mainSignerOverride,\n\t\t\t}\n\t\t);\n\t\tallIxs.push(placeOrderIx);\n\t}\n\n\treturn allIxs;\n};\n\n/**\n * Creates a complete transaction for opening a perp market order.\n *\n * @param driftClient - The Drift client instance for interacting with the protocol\n * @param user - The user account that will place the order\n * @param marketIndex - The perp market index to trade\n * @param direction - The direction of the trade (long/short)\n * @param amount - The amount to trade\n * @param optionalAuctionParamsInputs - Optional parameters for auction params endpoint and order configuration\n * @param dlobServerHttpUrl - Server URL for the auction params endpoint\n * @param positionMaxLeverage - Optional per-market leverage (e.g., 5 for 5x). If provided and different from current,\n * includes an instruction to update the position's maxMarginRatio.\n *\n * @returns Promise resolving to a built transaction ready for signing (Transaction or VersionedTransaction)\n */\nexport const createOpenPerpMarketOrderTxn = async (\n\tparams: WithTxnParams<OpenPerpMarketOrderBaseParams>\n): Promise<Transaction | VersionedTransaction> => {\n\tconst { driftClient } = params;\n\n\t// Regular order flow - create transaction instruction and build transaction\n\tconst placeOrderIxs = await createOpenPerpMarketOrderIxs(params);\n\tconst openPerpMarketOrderTxn = await driftClient.txHandler.buildTransaction({\n\t\tinstructions: placeOrderIxs,\n\t\ttxVersion: 0,\n\t\tconnection: driftClient.connection,\n\t\tpreFlightCommitment: 'confirmed',\n\t\tfetchAllMarketLookupTableAccounts:\n\t\t\tdriftClient.fetchAllLookupTableAccounts.bind(driftClient),\n\t\ttxParams: params.txParams,\n\t});\n\n\treturn openPerpMarketOrderTxn;\n};\n\n/**\n * Creates a transaction or swift order for a perp market order.\n *\n * @param driftClient - The Drift client instance for interacting with the protocol\n * @param user - The user account that will place the order\n * @param marketIndex - The perp market index to trade\n * @param direction - The direction of the trade (long/short)\n * @param amount - The amount to trade\n * @param optionalAuctionParamsInputs - Optional parameters for auction params endpoint and order configuration\n * @param dlobServerHttpUrl - Server URL for the auction params endpoint\n * @param useSwift - Whether to use Swift (signed message) orders instead of regular transactions\n * @param swiftOptions - Options for Swift (signed message) orders. Required if useSwift is true\n * @param userOrderId - The user order id for UI identification\n * @param positionMaxLeverage - Optional per-market leverage (e.g., 5 for 5x). Only supported for regular transactions (not Swift).\n *\n * @returns Promise resolving to a built transaction ready for signing (Transaction or VersionedTransaction)\n */\nexport const createOpenPerpMarketOrder = async <T extends boolean>(\n\tparams: WithTxnParams<OpenPerpMarketOrderParams<T, SwiftOrderOptions>>\n): Promise<TxnOrSwiftResult<T>> => {\n\tconst { useSwift, swiftOptions, ...rest } = params;\n\n\t// If useSwift is true, return the Swift result directly\n\tif (useSwift) {\n\t\tif (!swiftOptions) {\n\t\t\tthrow new Error('swiftOptions is required when useSwift is true');\n\t\t}\n\n\t\tconst swiftOrderResult = await createSwiftMarketOrder({\n\t\t\t...rest,\n\t\t\tswiftOptions,\n\t\t});\n\n\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t}\n\n\tconst openPerpMarketOrderTxn = await createOpenPerpMarketOrderTxn(rest);\n\n\treturn openPerpMarketOrderTxn as TxnOrSwiftResult<T>;\n};\n"]}
|
|
@@ -18,6 +18,14 @@ export interface OpenPerpNonMarketOrderBaseParams extends Omit<NonMarketOrderPar
|
|
|
18
18
|
* This is only applicable for non-SWIFT orders.
|
|
19
19
|
*/
|
|
20
20
|
mainSignerOverride?: PublicKey;
|
|
21
|
+
/**
|
|
22
|
+
* Optional builder code parameters for revenue sharing.
|
|
23
|
+
* Only applicable for Swift orders for now.
|
|
24
|
+
*/
|
|
25
|
+
builderParams?: {
|
|
26
|
+
builderIdx: number;
|
|
27
|
+
builderFeeTenthBps: number;
|
|
28
|
+
};
|
|
21
29
|
}
|
|
22
30
|
export interface OpenPerpNonMarketOrderParamsWithSwift extends OpenPerpNonMarketOrderBaseParams {
|
|
23
31
|
swiftOptions: SwiftOrderOptions;
|
|
@@ -205,6 +205,7 @@ const createSwiftLimitOrder = async (params) => {
|
|
|
205
205
|
stopLoss: (_c = orderConfig.bracketOrders) === null || _c === void 0 ? void 0 : _c.stopLoss,
|
|
206
206
|
positionMaxLeverage: params.positionMaxLeverage,
|
|
207
207
|
},
|
|
208
|
+
builderParams: params.builderParams,
|
|
208
209
|
});
|
|
209
210
|
};
|
|
210
211
|
exports.createSwiftLimitOrder = createSwiftLimitOrder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tDriftClient,\n\tUser,\n\tBN,\n\tMarketType,\n\tPostOnlyParams,\n\tOptionalOrderParams,\n\tPositionDirection,\n\tOrderParamsBitFlag,\n\tBASE_PRECISION,\n} from '@drift-labs/sdk';\nimport {\n\tPublicKey,\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n} from '@solana/web3.js';\nimport {\n\tprepSignAndSendSwiftOrder,\n\tSwiftOrderOptions,\n} from '../openSwiftOrder';\nimport {\n\tbuildNonMarketOrderParams,\n\tresolveBaseAssetAmount,\n} from '../../../../../utils/orderParams';\nimport { ENUM_UTILS } from '../../../../../../utils';\nimport { ORDER_COMMON_UTILS } from '../../../../../../common-ui-utils';\nimport { createPlaceAndTakePerpMarketOrderIx } from '../openPerpMarketOrder';\nimport {\n\tTxnOrSwiftResult,\n\tLimitAuctionConfig,\n\tLimitOrderParamsOrderConfig,\n\tNonMarketOrderParamsConfig,\n} from '../types';\nimport { WithTxnParams } from '../../../../types';\nimport { getPositionMaxLeverageIxIfNeeded } from '../positionMaxLeverage';\nimport { getLimitAuctionOrderParams } from '../auction';\n\nexport interface OpenPerpNonMarketOrderBaseParams\n\textends Omit<NonMarketOrderParamsConfig, 'marketType' | 'baseAssetAmount'> {\n\tdriftClient: DriftClient;\n\tuser: User;\n\t// Either new approach\n\tamount?: BN;\n\tassetType?: 'base' | 'quote';\n\t// Or legacy approach\n\tbaseAssetAmount?: BN;\n\t// Common optional params\n\treduceOnly?: boolean;\n\tpostOnly?: PostOnlyParams;\n\tuserOrderId?: number;\n\tautoEnterHighLeverageModeBufferPct?: number;\n\t/**\n\t * If provided, will override the main signer for the order. Otherwise, the main signer will be the user's authority.\n\t * This is only applicable for non-SWIFT orders.\n\t */\n\tmainSignerOverride?: PublicKey;\n}\n\nexport interface OpenPerpNonMarketOrderParamsWithSwift\n\textends OpenPerpNonMarketOrderBaseParams {\n\tswiftOptions: SwiftOrderOptions;\n}\n\nexport type OpenPerpNonMarketOrderParams<\n\tT extends boolean = boolean,\n\tS extends Omit<SwiftOrderOptions, 'swiftServerUrl'> = Omit<\n\t\tSwiftOrderOptions,\n\t\t'swiftServerUrl'\n\t>\n> = T extends true\n\t? OpenPerpNonMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tswiftOptions: S;\n\t }\n\t: OpenPerpNonMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tswiftOptions?: never;\n\t };\n\n/**\n * Creates a transaction instruction to open multiple non-market orders.\n */\nexport const createMultipleOpenPerpNonMarketOrderIx = async (params: {\n\tdriftClient: DriftClient;\n\tuser: User;\n\tmarketIndex: number;\n\tdirection: PositionDirection;\n\torderParamsConfigs: NonMarketOrderParamsConfig[];\n\tenterHighLeverageMode?: boolean;\n\t/**\n\t * If provided, will override the main signer for the order. Otherwise, the main signer will be the user's authority.\n\t */\n\tmainSignerOverride?: PublicKey;\n}): Promise<TransactionInstruction> => {\n\tconst { driftClient, orderParamsConfigs, mainSignerOverride } = params;\n\n\tconst orderParams = orderParamsConfigs.map(buildNonMarketOrderParams);\n\n\tif (params.enterHighLeverageMode && orderParams.length > 0) {\n\t\torderParams[0].bitFlags = OrderParamsBitFlag.UpdateHighLeverageMode;\n\t}\n\n\tconst placeOrderIx = await driftClient.getPlaceOrdersIx(\n\t\torderParams,\n\t\tundefined,\n\t\t{\n\t\t\tauthority: mainSignerOverride,\n\t\t}\n\t);\n\treturn placeOrderIx;\n};\n\n/**\n * Creates a transaction instruction to open a non-market order.\n * Allows for bracket orders to be opened in the same transaction.\n *\n * If `limitAuction` is enabled, a placeAndTake order is created to simulate a market auction order,\n * with the end price being the limit price.\n */\nexport const createOpenPerpNonMarketOrderIxs = async (\n\tparams: OpenPerpNonMarketOrderBaseParams\n): Promise<TransactionInstruction[]> => {\n\tconst {\n\t\tdriftClient,\n\t\tuser,\n\t\tmarketIndex,\n\t\tdirection,\n\t\treduceOnly = false,\n\t\tpostOnly = PostOnlyParams.NONE,\n\t\torderConfig,\n\t\tuserOrderId = 0,\n\t\tpositionMaxLeverage,\n\t\tmainSignerOverride,\n\t} = params;\n\t// Support both new (amount + assetType) and legacy (baseAssetAmount) approaches\n\tconst finalBaseAssetAmount = resolveBaseAssetAmount({\n\t\tamount: 'amount' in params ? params.amount : undefined,\n\t\tassetType: 'assetType' in params ? params.assetType : undefined,\n\t\tbaseAssetAmount:\n\t\t\t'baseAssetAmount' in params ? params.baseAssetAmount : undefined,\n\t\tlimitPrice:\n\t\t\t'limitPrice' in params.orderConfig\n\t\t\t\t? params.orderConfig.limitPrice\n\t\t\t\t: undefined,\n\t});\n\n\tif (!finalBaseAssetAmount || finalBaseAssetAmount.isZero()) {\n\t\tthrow new Error('Final base asset amount must be greater than zero');\n\t}\n\n\tconst allOrders: OptionalOrderParams[] = [];\n\tconst allIxs: TransactionInstruction[] = [];\n\n\tconst leverageIx = await getPositionMaxLeverageIxIfNeeded(\n\t\tdriftClient,\n\t\tuser,\n\t\tmarketIndex,\n\t\tpositionMaxLeverage\n\t);\n\tif (leverageIx) {\n\t\tallIxs.push(leverageIx);\n\t}\n\n\t// handle limit auction\n\tif (\n\t\torderConfig.orderType === 'limit' &&\n\t\torderConfig.limitAuction?.enable &&\n\t\tENUM_UTILS.match(postOnly, PostOnlyParams.NONE)\n\t) {\n\t\tconst limitAuctionOrderParams = await getLimitAuctionOrderParams({\n\t\t\t...params,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\torderConfig: orderConfig as LimitOrderParamsOrderConfig & {\n\t\t\t\tlimitAuction: LimitAuctionConfig;\n\t\t\t},\n\t\t});\n\n\t\tlet createdPlaceAndTakeIx = false;\n\n\t\t// if it is a limit auction order, we create a placeAndTake order to simulate a market order.\n\t\t// this is useful when a limit order is crossing, and we want to achieve the best fill price through a placeAndTake.\n\t\t// falls back to limit order with auction params if the placeAndTake order creation fails\n\t\tif (\n\t\t\tlimitAuctionOrderParams.auctionDuration &&\n\t\t\tlimitAuctionOrderParams.auctionDuration > 0 &&\n\t\t\torderConfig.limitAuction?.usePlaceAndTake?.enable\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst placeAndTakeIx = await createPlaceAndTakePerpMarketOrderIx({\n\t\t\t\t\tassetType: 'base',\n\t\t\t\t\tamount: finalBaseAssetAmount,\n\t\t\t\t\tdirection,\n\t\t\t\t\tdlobServerHttpUrl: orderConfig.limitAuction.dlobServerHttpUrl,\n\t\t\t\t\tmarketIndex,\n\t\t\t\t\tdriftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tuserOrderId,\n\t\t\t\t\toptionalAuctionParamsInputs:\n\t\t\t\t\t\torderConfig.limitAuction.optionalLimitAuctionParams,\n\t\t\t\t\tauctionDurationPercentage:\n\t\t\t\t\t\torderConfig.limitAuction.usePlaceAndTake.auctionDurationPercentage,\n\t\t\t\t\treferrerInfo: orderConfig.limitAuction.usePlaceAndTake.referrerInfo,\n\t\t\t\t});\n\t\t\t\tallIxs.push(placeAndTakeIx);\n\t\t\t\tcreatedPlaceAndTakeIx = true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Failed to create placeAndTake order for limit auction order',\n\t\t\t\t\te\n\t\t\t\t);\n\t\t\t\tcreatedPlaceAndTakeIx = false;\n\t\t\t}\n\t\t}\n\n\t\t// fallback to normal limit order with auction params\n\t\tif (!createdPlaceAndTakeIx) {\n\t\t\tallOrders.push(limitAuctionOrderParams);\n\t\t}\n\t} else {\n\t\tconst orderParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection,\n\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\torderConfig,\n\t\t\treduceOnly,\n\t\t\tpostOnly,\n\t\t\tuserOrderId,\n\t\t});\n\n\t\tconst oraclePrice =\n\t\t\tdriftClient.getOracleDataForPerpMarket(marketIndex).price;\n\t\tconst totalQuoteAmount = finalBaseAssetAmount\n\t\t\t.mul(oraclePrice)\n\t\t\t.div(BASE_PRECISION);\n\n\t\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\t\tmarketIndex,\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\ttotalQuoteAmount,\n\t\t\tdirection\n\t\t);\n\t\torderParams.bitFlags = bitFlags;\n\n\t\tallOrders.push(orderParams);\n\t}\n\n\tconst bracketOrdersDirection = ENUM_UTILS.match(\n\t\tdirection,\n\t\tPositionDirection.LONG\n\t)\n\t\t? PositionDirection.SHORT\n\t\t: PositionDirection.LONG;\n\n\tif ('bracketOrders' in orderConfig && orderConfig.bracketOrders?.takeProfit) {\n\t\tconst takeProfitParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount:\n\t\t\t\torderConfig.bracketOrders.takeProfit.baseAssetAmount ??\n\t\t\t\tfinalBaseAssetAmount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'takeProfit',\n\t\t\t\ttriggerPrice: orderConfig.bracketOrders.takeProfit.triggerPrice,\n\t\t\t\tlimitPrice: orderConfig.bracketOrders.takeProfit.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: orderConfig.bracketOrders.takeProfit.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(takeProfitParams);\n\t}\n\n\tif ('bracketOrders' in orderConfig && orderConfig.bracketOrders?.stopLoss) {\n\t\tconst stopLossParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount:\n\t\t\t\torderConfig.bracketOrders.stopLoss.baseAssetAmount ??\n\t\t\t\tfinalBaseAssetAmount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'stopLoss',\n\t\t\t\ttriggerPrice: orderConfig.bracketOrders.stopLoss.triggerPrice,\n\t\t\t\tlimitPrice: orderConfig.bracketOrders.stopLoss.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: orderConfig.bracketOrders.stopLoss.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(stopLossParams);\n\t}\n\n\tif (allOrders.length > 0) {\n\t\tconst placeOrderIx = await driftClient.getPlaceOrdersIx(\n\t\t\tallOrders,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tauthority: mainSignerOverride,\n\t\t\t}\n\t\t);\n\t\tallIxs.push(placeOrderIx);\n\t}\n\n\treturn allIxs;\n};\n\nexport const MINIMUM_SWIFT_LIMIT_ORDER_SIGNING_EXPIRATION_BUFFER_SLOTS = 35;\n\nexport const createSwiftLimitOrder = async (\n\tparams: OpenPerpNonMarketOrderParamsWithSwift & {\n\t\torderConfig: LimitOrderParamsOrderConfig;\n\t}\n): Promise<void> => {\n\tconst { driftClient, user, marketIndex, swiftOptions, orderConfig } = params;\n\n\tconst limitPrice = orderConfig.limitPrice;\n\n\tif (limitPrice.isZero()) {\n\t\tthrow new Error('LIMIT orders require limitPrice');\n\t}\n\n\t// Support both new (amount + assetType) and legacy (baseAssetAmount) approaches\n\tconst finalBaseAssetAmount = resolveBaseAssetAmount({\n\t\tamount: 'amount' in params ? params.amount : undefined,\n\t\tassetType: 'assetType' in params ? params.assetType : undefined,\n\t\tbaseAssetAmount:\n\t\t\t'baseAssetAmount' in params ? params.baseAssetAmount : undefined,\n\t\tlimitPrice,\n\t});\n\n\tconst orderParams = orderConfig.limitAuction?.enable\n\t\t? await getLimitAuctionOrderParams({\n\t\t\t\t...params,\n\t\t\t\tmarketType: MarketType.PERP,\n\t\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\t\torderConfig: orderConfig as LimitOrderParamsOrderConfig & {\n\t\t\t\t\tlimitAuction: LimitAuctionConfig;\n\t\t\t\t},\n\t\t })\n\t\t: buildNonMarketOrderParams({\n\t\t\t\tmarketIndex,\n\t\t\t\tmarketType: MarketType.PERP,\n\t\t\t\tdirection: params.direction,\n\t\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\t\torderConfig,\n\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\tpostOnly: params.postOnly,\n\t\t\t\tuserOrderId: params.userOrderId,\n\t\t });\n\n\tconst userAccount = user.getUserAccount();\n\tconst slotBuffer = Math.max(\n\t\t(swiftOptions.signedMessageOrderSlotBuffer || 0) +\n\t\t\t(orderParams.auctionDuration || 0),\n\t\tMINIMUM_SWIFT_LIMIT_ORDER_SIGNING_EXPIRATION_BUFFER_SLOTS\n\t); // limit orders require a much larger buffer, to replace the auction duration usually found in market orders\n\n\tawait prepSignAndSendSwiftOrder({\n\t\tdriftClient,\n\t\tsubAccountId: userAccount.subAccountId,\n\t\tuserAccountPubKey: user.userAccountPublicKey,\n\t\tmarketIndex,\n\t\tslotBuffer,\n\t\tswiftOptions,\n\t\torderParams: {\n\t\t\tmain: orderParams,\n\t\t\ttakeProfit: orderConfig.bracketOrders?.takeProfit,\n\t\t\tstopLoss: orderConfig.bracketOrders?.stopLoss,\n\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t},\n\t});\n};\n\nexport const createOpenPerpNonMarketOrderTxn = async (\n\tparams: WithTxnParams<OpenPerpNonMarketOrderBaseParams>\n): Promise<Transaction | VersionedTransaction> => {\n\tconst { driftClient } = params;\n\n\tconst instructions = await createOpenPerpNonMarketOrderIxs(params);\n\n\tconst openPerpNonMarketOrderTxn = await driftClient.buildTransaction(\n\t\tinstructions,\n\t\tparams.txParams\n\t);\n\n\treturn openPerpNonMarketOrderTxn;\n};\n\nexport const createOpenPerpNonMarketOrder = async <T extends boolean>(\n\tparams: WithTxnParams<OpenPerpNonMarketOrderParams<T, SwiftOrderOptions>>\n): Promise<TxnOrSwiftResult<T>> => {\n\tconst { swiftOptions, useSwift, orderConfig } = params;\n\n\t// If useSwift is true, return the Swift result directly\n\tif (useSwift) {\n\t\tif (orderConfig.orderType !== 'limit') {\n\t\t\tthrow new Error('Only limit orders are supported with Swift');\n\t\t}\n\n\t\tif (!swiftOptions) {\n\t\t\tthrow new Error('swiftOptions is required when useSwift is true');\n\t\t}\n\n\t\tif (\n\t\t\tparams.postOnly &&\n\t\t\t!ENUM_UTILS.match(params.postOnly, PostOnlyParams.NONE)\n\t\t) {\n\t\t\tthrow new Error('Post only orders are not supported with Swift');\n\t\t}\n\n\t\tconst swiftOrderResult = await createSwiftLimitOrder({\n\t\t\t...params,\n\t\t\tswiftOptions,\n\t\t\torderConfig,\n\t\t});\n\n\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t}\n\n\tconst marketOrderTxn = await createOpenPerpNonMarketOrderTxn(params);\n\n\treturn marketOrderTxn as TxnOrSwiftResult<T>;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/drift/base/actions/trade/openPerpOrder/openPerpNonMarketOrder/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tDriftClient,\n\tUser,\n\tBN,\n\tMarketType,\n\tPostOnlyParams,\n\tOptionalOrderParams,\n\tPositionDirection,\n\tOrderParamsBitFlag,\n\tBASE_PRECISION,\n} from '@drift-labs/sdk';\nimport {\n\tPublicKey,\n\tTransaction,\n\tTransactionInstruction,\n\tVersionedTransaction,\n} from '@solana/web3.js';\nimport {\n\tprepSignAndSendSwiftOrder,\n\tSwiftOrderOptions,\n} from '../openSwiftOrder';\nimport {\n\tbuildNonMarketOrderParams,\n\tresolveBaseAssetAmount,\n} from '../../../../../utils/orderParams';\nimport { ENUM_UTILS } from '../../../../../../utils';\nimport { ORDER_COMMON_UTILS } from '../../../../../../common-ui-utils';\nimport { createPlaceAndTakePerpMarketOrderIx } from '../openPerpMarketOrder';\nimport {\n\tTxnOrSwiftResult,\n\tLimitAuctionConfig,\n\tLimitOrderParamsOrderConfig,\n\tNonMarketOrderParamsConfig,\n} from '../types';\nimport { WithTxnParams } from '../../../../types';\nimport { getPositionMaxLeverageIxIfNeeded } from '../positionMaxLeverage';\nimport { getLimitAuctionOrderParams } from '../auction';\n\nexport interface OpenPerpNonMarketOrderBaseParams\n\textends Omit<NonMarketOrderParamsConfig, 'marketType' | 'baseAssetAmount'> {\n\tdriftClient: DriftClient;\n\tuser: User;\n\t// Either new approach\n\tamount?: BN;\n\tassetType?: 'base' | 'quote';\n\t// Or legacy approach\n\tbaseAssetAmount?: BN;\n\t// Common optional params\n\treduceOnly?: boolean;\n\tpostOnly?: PostOnlyParams;\n\tuserOrderId?: number;\n\tautoEnterHighLeverageModeBufferPct?: number;\n\t/**\n\t * If provided, will override the main signer for the order. Otherwise, the main signer will be the user's authority.\n\t * This is only applicable for non-SWIFT orders.\n\t */\n\tmainSignerOverride?: PublicKey;\n\t/**\n\t * Optional builder code parameters for revenue sharing.\n\t * Only applicable for Swift orders for now.\n\t */\n\tbuilderParams?: {\n\t\tbuilderIdx: number;\n\t\tbuilderFeeTenthBps: number;\n\t};\n}\n\nexport interface OpenPerpNonMarketOrderParamsWithSwift\n\textends OpenPerpNonMarketOrderBaseParams {\n\tswiftOptions: SwiftOrderOptions;\n}\n\nexport type OpenPerpNonMarketOrderParams<\n\tT extends boolean = boolean,\n\tS extends Omit<SwiftOrderOptions, 'swiftServerUrl'> = Omit<\n\t\tSwiftOrderOptions,\n\t\t'swiftServerUrl'\n\t>\n> = T extends true\n\t? OpenPerpNonMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tswiftOptions: S;\n\t }\n\t: OpenPerpNonMarketOrderBaseParams & {\n\t\t\tuseSwift: T;\n\t\t\tswiftOptions?: never;\n\t };\n\n/**\n * Creates a transaction instruction to open multiple non-market orders.\n */\nexport const createMultipleOpenPerpNonMarketOrderIx = async (params: {\n\tdriftClient: DriftClient;\n\tuser: User;\n\tmarketIndex: number;\n\tdirection: PositionDirection;\n\torderParamsConfigs: NonMarketOrderParamsConfig[];\n\tenterHighLeverageMode?: boolean;\n\t/**\n\t * If provided, will override the main signer for the order. Otherwise, the main signer will be the user's authority.\n\t */\n\tmainSignerOverride?: PublicKey;\n}): Promise<TransactionInstruction> => {\n\tconst { driftClient, orderParamsConfigs, mainSignerOverride } = params;\n\n\tconst orderParams = orderParamsConfigs.map(buildNonMarketOrderParams);\n\n\tif (params.enterHighLeverageMode && orderParams.length > 0) {\n\t\torderParams[0].bitFlags = OrderParamsBitFlag.UpdateHighLeverageMode;\n\t}\n\n\tconst placeOrderIx = await driftClient.getPlaceOrdersIx(\n\t\torderParams,\n\t\tundefined,\n\t\t{\n\t\t\tauthority: mainSignerOverride,\n\t\t}\n\t);\n\treturn placeOrderIx;\n};\n\n/**\n * Creates a transaction instruction to open a non-market order.\n * Allows for bracket orders to be opened in the same transaction.\n *\n * If `limitAuction` is enabled, a placeAndTake order is created to simulate a market auction order,\n * with the end price being the limit price.\n */\nexport const createOpenPerpNonMarketOrderIxs = async (\n\tparams: OpenPerpNonMarketOrderBaseParams\n): Promise<TransactionInstruction[]> => {\n\tconst {\n\t\tdriftClient,\n\t\tuser,\n\t\tmarketIndex,\n\t\tdirection,\n\t\treduceOnly = false,\n\t\tpostOnly = PostOnlyParams.NONE,\n\t\torderConfig,\n\t\tuserOrderId = 0,\n\t\tpositionMaxLeverage,\n\t\tmainSignerOverride,\n\t} = params;\n\t// Support both new (amount + assetType) and legacy (baseAssetAmount) approaches\n\tconst finalBaseAssetAmount = resolveBaseAssetAmount({\n\t\tamount: 'amount' in params ? params.amount : undefined,\n\t\tassetType: 'assetType' in params ? params.assetType : undefined,\n\t\tbaseAssetAmount:\n\t\t\t'baseAssetAmount' in params ? params.baseAssetAmount : undefined,\n\t\tlimitPrice:\n\t\t\t'limitPrice' in params.orderConfig\n\t\t\t\t? params.orderConfig.limitPrice\n\t\t\t\t: undefined,\n\t});\n\n\tif (!finalBaseAssetAmount || finalBaseAssetAmount.isZero()) {\n\t\tthrow new Error('Final base asset amount must be greater than zero');\n\t}\n\n\tconst allOrders: OptionalOrderParams[] = [];\n\tconst allIxs: TransactionInstruction[] = [];\n\n\tconst leverageIx = await getPositionMaxLeverageIxIfNeeded(\n\t\tdriftClient,\n\t\tuser,\n\t\tmarketIndex,\n\t\tpositionMaxLeverage\n\t);\n\tif (leverageIx) {\n\t\tallIxs.push(leverageIx);\n\t}\n\n\t// handle limit auction\n\tif (\n\t\torderConfig.orderType === 'limit' &&\n\t\torderConfig.limitAuction?.enable &&\n\t\tENUM_UTILS.match(postOnly, PostOnlyParams.NONE)\n\t) {\n\t\tconst limitAuctionOrderParams = await getLimitAuctionOrderParams({\n\t\t\t...params,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\torderConfig: orderConfig as LimitOrderParamsOrderConfig & {\n\t\t\t\tlimitAuction: LimitAuctionConfig;\n\t\t\t},\n\t\t});\n\n\t\tlet createdPlaceAndTakeIx = false;\n\n\t\t// if it is a limit auction order, we create a placeAndTake order to simulate a market order.\n\t\t// this is useful when a limit order is crossing, and we want to achieve the best fill price through a placeAndTake.\n\t\t// falls back to limit order with auction params if the placeAndTake order creation fails\n\t\tif (\n\t\t\tlimitAuctionOrderParams.auctionDuration &&\n\t\t\tlimitAuctionOrderParams.auctionDuration > 0 &&\n\t\t\torderConfig.limitAuction?.usePlaceAndTake?.enable\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst placeAndTakeIx = await createPlaceAndTakePerpMarketOrderIx({\n\t\t\t\t\tassetType: 'base',\n\t\t\t\t\tamount: finalBaseAssetAmount,\n\t\t\t\t\tdirection,\n\t\t\t\t\tdlobServerHttpUrl: orderConfig.limitAuction.dlobServerHttpUrl,\n\t\t\t\t\tmarketIndex,\n\t\t\t\t\tdriftClient,\n\t\t\t\t\tuser,\n\t\t\t\t\tuserOrderId,\n\t\t\t\t\toptionalAuctionParamsInputs:\n\t\t\t\t\t\torderConfig.limitAuction.optionalLimitAuctionParams,\n\t\t\t\t\tauctionDurationPercentage:\n\t\t\t\t\t\torderConfig.limitAuction.usePlaceAndTake.auctionDurationPercentage,\n\t\t\t\t\treferrerInfo: orderConfig.limitAuction.usePlaceAndTake.referrerInfo,\n\t\t\t\t});\n\t\t\t\tallIxs.push(placeAndTakeIx);\n\t\t\t\tcreatedPlaceAndTakeIx = true;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'Failed to create placeAndTake order for limit auction order',\n\t\t\t\t\te\n\t\t\t\t);\n\t\t\t\tcreatedPlaceAndTakeIx = false;\n\t\t\t}\n\t\t}\n\n\t\t// fallback to normal limit order with auction params\n\t\tif (!createdPlaceAndTakeIx) {\n\t\t\tallOrders.push(limitAuctionOrderParams);\n\t\t}\n\t} else {\n\t\tconst orderParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection,\n\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\torderConfig,\n\t\t\treduceOnly,\n\t\t\tpostOnly,\n\t\t\tuserOrderId,\n\t\t});\n\n\t\tconst oraclePrice =\n\t\t\tdriftClient.getOracleDataForPerpMarket(marketIndex).price;\n\t\tconst totalQuoteAmount = finalBaseAssetAmount\n\t\t\t.mul(oraclePrice)\n\t\t\t.div(BASE_PRECISION);\n\n\t\tconst bitFlags = ORDER_COMMON_UTILS.getPerpOrderParamsBitFlags(\n\t\t\tmarketIndex,\n\t\t\tdriftClient,\n\t\t\tuser,\n\t\t\ttotalQuoteAmount,\n\t\t\tdirection\n\t\t);\n\t\torderParams.bitFlags = bitFlags;\n\n\t\tallOrders.push(orderParams);\n\t}\n\n\tconst bracketOrdersDirection = ENUM_UTILS.match(\n\t\tdirection,\n\t\tPositionDirection.LONG\n\t)\n\t\t? PositionDirection.SHORT\n\t\t: PositionDirection.LONG;\n\n\tif ('bracketOrders' in orderConfig && orderConfig.bracketOrders?.takeProfit) {\n\t\tconst takeProfitParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount:\n\t\t\t\torderConfig.bracketOrders.takeProfit.baseAssetAmount ??\n\t\t\t\tfinalBaseAssetAmount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'takeProfit',\n\t\t\t\ttriggerPrice: orderConfig.bracketOrders.takeProfit.triggerPrice,\n\t\t\t\tlimitPrice: orderConfig.bracketOrders.takeProfit.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: orderConfig.bracketOrders.takeProfit.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(takeProfitParams);\n\t}\n\n\tif ('bracketOrders' in orderConfig && orderConfig.bracketOrders?.stopLoss) {\n\t\tconst stopLossParams = buildNonMarketOrderParams({\n\t\t\tmarketIndex,\n\t\t\tmarketType: MarketType.PERP,\n\t\t\tdirection: bracketOrdersDirection,\n\t\t\tbaseAssetAmount:\n\t\t\t\torderConfig.bracketOrders.stopLoss.baseAssetAmount ??\n\t\t\t\tfinalBaseAssetAmount,\n\t\t\torderConfig: {\n\t\t\t\torderType: 'stopLoss',\n\t\t\t\ttriggerPrice: orderConfig.bracketOrders.stopLoss.triggerPrice,\n\t\t\t\tlimitPrice: orderConfig.bracketOrders.stopLoss.limitPrice,\n\t\t\t},\n\t\t\treduceOnly: orderConfig.bracketOrders.stopLoss.reduceOnly ?? true,\n\t\t});\n\t\tallOrders.push(stopLossParams);\n\t}\n\n\tif (allOrders.length > 0) {\n\t\tconst placeOrderIx = await driftClient.getPlaceOrdersIx(\n\t\t\tallOrders,\n\t\t\tundefined,\n\t\t\t{\n\t\t\t\tauthority: mainSignerOverride,\n\t\t\t}\n\t\t);\n\t\tallIxs.push(placeOrderIx);\n\t}\n\n\treturn allIxs;\n};\n\nexport const MINIMUM_SWIFT_LIMIT_ORDER_SIGNING_EXPIRATION_BUFFER_SLOTS = 35;\n\nexport const createSwiftLimitOrder = async (\n\tparams: OpenPerpNonMarketOrderParamsWithSwift & {\n\t\torderConfig: LimitOrderParamsOrderConfig;\n\t}\n): Promise<void> => {\n\tconst { driftClient, user, marketIndex, swiftOptions, orderConfig } = params;\n\n\tconst limitPrice = orderConfig.limitPrice;\n\n\tif (limitPrice.isZero()) {\n\t\tthrow new Error('LIMIT orders require limitPrice');\n\t}\n\n\t// Support both new (amount + assetType) and legacy (baseAssetAmount) approaches\n\tconst finalBaseAssetAmount = resolveBaseAssetAmount({\n\t\tamount: 'amount' in params ? params.amount : undefined,\n\t\tassetType: 'assetType' in params ? params.assetType : undefined,\n\t\tbaseAssetAmount:\n\t\t\t'baseAssetAmount' in params ? params.baseAssetAmount : undefined,\n\t\tlimitPrice,\n\t});\n\n\tconst orderParams = orderConfig.limitAuction?.enable\n\t\t? await getLimitAuctionOrderParams({\n\t\t\t\t...params,\n\t\t\t\tmarketType: MarketType.PERP,\n\t\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\t\torderConfig: orderConfig as LimitOrderParamsOrderConfig & {\n\t\t\t\t\tlimitAuction: LimitAuctionConfig;\n\t\t\t\t},\n\t\t })\n\t\t: buildNonMarketOrderParams({\n\t\t\t\tmarketIndex,\n\t\t\t\tmarketType: MarketType.PERP,\n\t\t\t\tdirection: params.direction,\n\t\t\t\tbaseAssetAmount: finalBaseAssetAmount,\n\t\t\t\torderConfig,\n\t\t\t\treduceOnly: params.reduceOnly,\n\t\t\t\tpostOnly: params.postOnly,\n\t\t\t\tuserOrderId: params.userOrderId,\n\t\t });\n\n\tconst userAccount = user.getUserAccount();\n\tconst slotBuffer = Math.max(\n\t\t(swiftOptions.signedMessageOrderSlotBuffer || 0) +\n\t\t\t(orderParams.auctionDuration || 0),\n\t\tMINIMUM_SWIFT_LIMIT_ORDER_SIGNING_EXPIRATION_BUFFER_SLOTS\n\t); // limit orders require a much larger buffer, to replace the auction duration usually found in market orders\n\n\tawait prepSignAndSendSwiftOrder({\n\t\tdriftClient,\n\t\tsubAccountId: userAccount.subAccountId,\n\t\tuserAccountPubKey: user.userAccountPublicKey,\n\t\tmarketIndex,\n\t\tslotBuffer,\n\t\tswiftOptions,\n\t\torderParams: {\n\t\t\tmain: orderParams,\n\t\t\ttakeProfit: orderConfig.bracketOrders?.takeProfit,\n\t\t\tstopLoss: orderConfig.bracketOrders?.stopLoss,\n\t\t\tpositionMaxLeverage: params.positionMaxLeverage,\n\t\t},\n\t\tbuilderParams: params.builderParams,\n\t});\n};\n\nexport const createOpenPerpNonMarketOrderTxn = async (\n\tparams: WithTxnParams<OpenPerpNonMarketOrderBaseParams>\n): Promise<Transaction | VersionedTransaction> => {\n\tconst { driftClient } = params;\n\n\tconst instructions = await createOpenPerpNonMarketOrderIxs(params);\n\n\tconst openPerpNonMarketOrderTxn = await driftClient.buildTransaction(\n\t\tinstructions,\n\t\tparams.txParams\n\t);\n\n\treturn openPerpNonMarketOrderTxn;\n};\n\nexport const createOpenPerpNonMarketOrder = async <T extends boolean>(\n\tparams: WithTxnParams<OpenPerpNonMarketOrderParams<T, SwiftOrderOptions>>\n): Promise<TxnOrSwiftResult<T>> => {\n\tconst { swiftOptions, useSwift, orderConfig } = params;\n\n\t// If useSwift is true, return the Swift result directly\n\tif (useSwift) {\n\t\tif (orderConfig.orderType !== 'limit') {\n\t\t\tthrow new Error('Only limit orders are supported with Swift');\n\t\t}\n\n\t\tif (!swiftOptions) {\n\t\t\tthrow new Error('swiftOptions is required when useSwift is true');\n\t\t}\n\n\t\tif (\n\t\t\tparams.postOnly &&\n\t\t\t!ENUM_UTILS.match(params.postOnly, PostOnlyParams.NONE)\n\t\t) {\n\t\t\tthrow new Error('Post only orders are not supported with Swift');\n\t\t}\n\n\t\tconst swiftOrderResult = await createSwiftLimitOrder({\n\t\t\t...params,\n\t\t\tswiftOptions,\n\t\t\torderConfig,\n\t\t});\n\n\t\treturn swiftOrderResult as TxnOrSwiftResult<T>;\n\t}\n\n\tconst marketOrderTxn = await createOpenPerpNonMarketOrderTxn(params);\n\n\treturn marketOrderTxn as TxnOrSwiftResult<T>;\n};\n"]}
|