@drift-labs/sdk 0.2.0-master.1 → 0.2.0-master.10

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.
Files changed (112) hide show
  1. package/lib/accounts/types.d.ts +1 -0
  2. package/lib/admin.d.ts +6 -3
  3. package/lib/admin.js +39 -7
  4. package/lib/clearingHouse.d.ts +13 -14
  5. package/lib/clearingHouse.js +166 -106
  6. package/lib/config.js +1 -1
  7. package/lib/constants/banks.js +8 -1
  8. package/lib/constants/numericConstants.d.ts +1 -0
  9. package/lib/constants/numericConstants.js +2 -1
  10. package/lib/factory/bigNum.d.ts +8 -2
  11. package/lib/factory/bigNum.js +14 -6
  12. package/lib/idl/clearing_house.json +277 -55
  13. package/lib/index.d.ts +2 -1
  14. package/lib/index.js +6 -1
  15. package/lib/math/amm.d.ts +6 -1
  16. package/lib/math/amm.js +124 -41
  17. package/lib/math/auction.js +4 -1
  18. package/lib/math/orders.d.ts +2 -2
  19. package/lib/math/orders.js +18 -11
  20. package/lib/math/position.js +3 -1
  21. package/lib/math/repeg.js +1 -1
  22. package/lib/math/trade.d.ts +1 -1
  23. package/lib/math/trade.js +7 -10
  24. package/lib/orderParams.d.ts +14 -5
  25. package/lib/orderParams.js +8 -96
  26. package/lib/orders.d.ts +1 -2
  27. package/lib/orders.js +6 -85
  28. package/lib/slot/SlotSubscriber.d.ts +7 -0
  29. package/lib/slot/SlotSubscriber.js +3 -0
  30. package/lib/tx/utils.js +1 -1
  31. package/lib/types.d.ts +75 -1
  32. package/lib/types.js +42 -1
  33. package/package.json +3 -3
  34. package/src/accounts/bulkAccountLoader.js +197 -0
  35. package/src/accounts/bulkUserSubscription.js +33 -0
  36. package/src/accounts/fetch.js +29 -0
  37. package/src/accounts/pollingClearingHouseAccountSubscriber.js +311 -0
  38. package/src/accounts/pollingOracleSubscriber.js +93 -0
  39. package/src/accounts/pollingTokenAccountSubscriber.js +90 -0
  40. package/src/accounts/pollingUserAccountSubscriber.js +132 -0
  41. package/src/accounts/types.js +10 -0
  42. package/src/accounts/utils.js +7 -0
  43. package/src/accounts/webSocketAccountSubscriber.js +93 -0
  44. package/src/accounts/webSocketClearingHouseAccountSubscriber.js +233 -0
  45. package/src/accounts/webSocketUserAccountSubscriber.js +62 -0
  46. package/src/addresses/marketAddresses.js +26 -0
  47. package/src/addresses/pda.js +104 -0
  48. package/src/admin.ts +60 -8
  49. package/src/assert/assert.js +9 -0
  50. package/src/clearingHouse.ts +223 -183
  51. package/src/config.ts +1 -1
  52. package/src/constants/banks.ts +8 -1
  53. package/src/constants/numericConstants.ts +1 -0
  54. package/src/events/eventList.js +77 -0
  55. package/src/events/eventSubscriber.js +139 -0
  56. package/src/events/fetchLogs.js +50 -0
  57. package/src/events/pollingLogProvider.js +64 -0
  58. package/src/events/sort.js +44 -0
  59. package/src/events/txEventCache.js +71 -0
  60. package/src/events/types.js +20 -0
  61. package/src/events/webSocketLogProvider.js +41 -0
  62. package/src/examples/makeTradeExample.js +80 -0
  63. package/src/factory/bigNum.js +364 -0
  64. package/src/factory/bigNum.ts +26 -9
  65. package/src/factory/oracleClient.js +20 -0
  66. package/src/idl/clearing_house.json +277 -55
  67. package/src/index.js +69 -0
  68. package/src/index.ts +2 -1
  69. package/src/math/amm.js +369 -0
  70. package/src/math/amm.ts +207 -52
  71. package/src/math/auction.js +42 -0
  72. package/src/math/auction.ts +5 -1
  73. package/src/math/bankBalance.js +75 -0
  74. package/src/math/conversion.js +11 -0
  75. package/src/math/funding.js +248 -0
  76. package/src/math/market.js +57 -0
  77. package/src/math/oracles.js +26 -0
  78. package/src/math/orders.js +110 -0
  79. package/src/math/orders.ts +17 -13
  80. package/src/math/position.js +140 -0
  81. package/src/math/position.ts +5 -1
  82. package/src/math/repeg.js +128 -0
  83. package/src/math/repeg.ts +2 -1
  84. package/src/math/state.js +15 -0
  85. package/src/math/trade.js +253 -0
  86. package/src/math/trade.ts +23 -25
  87. package/src/math/utils.js +0 -1
  88. package/src/mockUSDCFaucet.js +171 -0
  89. package/src/oracles/oracleClientCache.js +19 -0
  90. package/src/oracles/pythClient.js +46 -0
  91. package/src/oracles/quoteAssetOracleClient.js +32 -0
  92. package/src/oracles/switchboardClient.js +69 -0
  93. package/src/oracles/types.js +2 -0
  94. package/src/orderParams.js +20 -0
  95. package/src/orderParams.ts +20 -141
  96. package/src/orders.js +134 -0
  97. package/src/orders.ts +7 -131
  98. package/src/slot/SlotSubscriber.js +39 -0
  99. package/src/slot/SlotSubscriber.ts +11 -1
  100. package/src/token/index.js +38 -0
  101. package/src/tx/retryTxSender.js +188 -0
  102. package/src/tx/types.js +2 -0
  103. package/src/tx/utils.js +17 -0
  104. package/src/tx/utils.ts +1 -1
  105. package/src/types.js +114 -0
  106. package/src/types.ts +69 -3
  107. package/src/userName.js +20 -0
  108. package/src/util/promiseTimeout.js +14 -0
  109. package/src/util/tps.js +27 -0
  110. package/src/wallet.js +35 -0
  111. package/src/util/computeUnits.js +0 -17
  112. package/src/util/computeUnits.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="bn.js" />
3
+ /// <reference types="node" />
3
4
  import { BankAccount, MarketAccount, OracleSource, StateAccount, UserAccount } from '../types';
4
5
  import StrictEventEmitter from 'strict-event-emitter-types';
5
6
  import { EventEmitter } from 'events';
package/lib/admin.d.ts CHANGED
@@ -5,7 +5,7 @@ import { BN } from '@project-serum/anchor';
5
5
  import { ClearingHouse } from './clearingHouse';
6
6
  export declare class Admin extends ClearingHouse {
7
7
  initialize(usdcMint: PublicKey, adminControlsPrices: boolean): Promise<[TransactionSignature]>;
8
- initializeBank(mint: PublicKey, optimalUtilization: BN, optimalRate: BN, maxRate: BN, oracle: PublicKey, oracleSource: OracleSource, initialAssetWeight: BN, maintenanceAssetWeight: BN, initialLiabilityWeight: BN, maintenanceLiabilityWeight: BN): Promise<TransactionSignature>;
8
+ initializeBank(mint: PublicKey, optimalUtilization: BN, optimalRate: BN, maxRate: BN, oracle: PublicKey, oracleSource: OracleSource, initialAssetWeight: BN, maintenanceAssetWeight: BN, initialLiabilityWeight: BN, maintenanceLiabilityWeight: BN, imfFactor?: BN): Promise<TransactionSignature>;
9
9
  initializeMarket(priceOracle: PublicKey, baseAssetReserve: BN, quoteAssetReserve: BN, periodicity: BN, pegMultiplier?: BN, oracleSource?: OracleSource, marginRatioInitial?: number, marginRatioPartial?: number, marginRatioMaintenance?: number): Promise<TransactionSignature>;
10
10
  moveAmmPrice(baseAssetReserve: BN, quoteAssetReserve: BN, marketIndex: BN): Promise<TransactionSignature>;
11
11
  updateK(sqrtK: BN, marketIndex: BN): Promise<TransactionSignature>;
@@ -14,12 +14,13 @@ export declare class Admin extends ClearingHouse {
14
14
  updateAmmOracleTwap(marketIndex: BN): Promise<TransactionSignature>;
15
15
  resetAmmOracleTwap(marketIndex: BN): Promise<TransactionSignature>;
16
16
  withdrawFromInsuranceVault(amount: BN, recipient: PublicKey): Promise<TransactionSignature>;
17
- withdrawFees(marketIndex: BN, amount: BN, recipient: PublicKey): Promise<TransactionSignature>;
17
+ withdrawFromMarketToInsuranceVault(marketIndex: BN, amount: BN, recipient: PublicKey): Promise<TransactionSignature>;
18
18
  withdrawFromInsuranceVaultToMarket(marketIndex: BN, amount: BN): Promise<TransactionSignature>;
19
19
  updateAdmin(admin: PublicKey): Promise<TransactionSignature>;
20
20
  updateCurveUpdateIntensity(marketIndex: BN, curveUpdateIntensity: number): Promise<TransactionSignature>;
21
21
  updateMarginRatio(marketIndex: BN, marginRatioInitial: number, marginRatioPartial: number, marginRatioMaintenance: number): Promise<TransactionSignature>;
22
22
  updateMarketBaseSpread(marketIndex: BN, baseSpread: number): Promise<TransactionSignature>;
23
+ updateMarketMaxSpread(marketIndex: BN, maxSpread: number): Promise<TransactionSignature>;
23
24
  updatePartialLiquidationClosePercentage(numerator: BN, denominator: BN): Promise<TransactionSignature>;
24
25
  updatePartialLiquidationPenaltyPercentage(numerator: BN, denominator: BN): Promise<TransactionSignature>;
25
26
  updateFullLiquidationPenaltyPercentage(numerator: BN, denominator: BN): Promise<TransactionSignature>;
@@ -37,5 +38,7 @@ export declare class Admin extends ClearingHouse {
37
38
  updateFundingPaused(fundingPaused: boolean): Promise<TransactionSignature>;
38
39
  updateExchangePaused(exchangePaused: boolean): Promise<TransactionSignature>;
39
40
  disableAdminControlsPrices(): Promise<TransactionSignature>;
40
- updateOrderAuctionTime(time: BN | number): Promise<TransactionSignature>;
41
+ updateAuctionDuration(minDuration: BN | number, maxDuration: BN | number): Promise<TransactionSignature>;
42
+ updateMaxBaseAssetAmountRatio(marketIndex: BN, maxBaseAssetAmountRatio: number): Promise<TransactionSignature>;
43
+ updateMaxSlippageRatio(marketIndex: BN, maxSlippageRatio: number): Promise<TransactionSignature>;
41
44
  }
package/lib/admin.js CHANGED
@@ -58,12 +58,12 @@ class Admin extends clearingHouse_1.ClearingHouse {
58
58
  const { txSig: initializeTxSig } = await this.txSender.send(initializeTx, [], this.opts);
59
59
  return [initializeTxSig];
60
60
  }
61
- async initializeBank(mint, optimalUtilization, optimalRate, maxRate, oracle, oracleSource, initialAssetWeight, maintenanceAssetWeight, initialLiabilityWeight, maintenanceLiabilityWeight) {
61
+ async initializeBank(mint, optimalUtilization, optimalRate, maxRate, oracle, oracleSource, initialAssetWeight, maintenanceAssetWeight, initialLiabilityWeight, maintenanceLiabilityWeight, imfFactor = new anchor_1.BN(0)) {
62
62
  const bankIndex = this.getStateAccount().numberOfBanks;
63
63
  const bank = await (0, pda_1.getBankPublicKey)(this.program.programId, bankIndex);
64
64
  const bankVault = await (0, pda_1.getBankVaultPublicKey)(this.program.programId, bankIndex);
65
65
  const bankVaultAuthority = await (0, pda_1.getBankVaultAuthorityPublicKey)(this.program.programId, bankIndex);
66
- const initializeTx = await this.program.transaction.initializeBank(optimalUtilization, optimalRate, maxRate, oracleSource, initialAssetWeight, maintenanceAssetWeight, initialLiabilityWeight, maintenanceLiabilityWeight, {
66
+ const initializeTx = await this.program.transaction.initializeBank(optimalUtilization, optimalRate, maxRate, oracleSource, initialAssetWeight, maintenanceAssetWeight, initialLiabilityWeight, maintenanceLiabilityWeight, imfFactor, {
67
67
  accounts: {
68
68
  admin: this.wallet.publicKey,
69
69
  state: await this.getStatePublicKey(),
@@ -177,10 +177,12 @@ class Admin extends clearingHouse_1.ClearingHouse {
177
177
  }
178
178
  async withdrawFromInsuranceVault(amount, recipient) {
179
179
  const state = await this.getStateAccount();
180
+ const bank = this.getQuoteAssetBankAccount();
180
181
  return await this.program.rpc.withdrawFromInsuranceVault(amount, {
181
182
  accounts: {
182
183
  admin: this.wallet.publicKey,
183
184
  state: await this.getStatePublicKey(),
185
+ bank: bank.pubkey,
184
186
  insuranceVault: state.insuranceVault,
185
187
  insuranceVaultAuthority: state.insuranceVaultAuthority,
186
188
  recipient: recipient,
@@ -188,10 +190,10 @@ class Admin extends clearingHouse_1.ClearingHouse {
188
190
  },
189
191
  });
190
192
  }
191
- async withdrawFees(marketIndex, amount, recipient) {
193
+ async withdrawFromMarketToInsuranceVault(marketIndex, amount, recipient) {
192
194
  const marketPublicKey = await (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex);
193
195
  const bank = this.getQuoteAssetBankAccount();
194
- return await this.program.rpc.withdrawFees(amount, {
196
+ return await this.program.rpc.withdrawFromMarketToInsuranceVault(amount, {
195
197
  accounts: {
196
198
  admin: this.wallet.publicKey,
197
199
  state: await this.getStatePublicKey(),
@@ -206,6 +208,7 @@ class Admin extends clearingHouse_1.ClearingHouse {
206
208
  }
207
209
  async withdrawFromInsuranceVaultToMarket(marketIndex, amount) {
208
210
  const state = await this.getStateAccount();
211
+ const bank = this.getQuoteAssetBankAccount();
209
212
  return await this.program.rpc.withdrawFromInsuranceVaultToMarket(amount, {
210
213
  accounts: {
211
214
  admin: this.wallet.publicKey,
@@ -213,7 +216,9 @@ class Admin extends clearingHouse_1.ClearingHouse {
213
216
  market: await (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex),
214
217
  insuranceVault: state.insuranceVault,
215
218
  insuranceVaultAuthority: state.insuranceVaultAuthority,
216
- bankVault: this.getQuoteAssetBankAccount().vault,
219
+ bank: bank.pubkey,
220
+ bankVault: bank.vault,
221
+ bankVaultAuthority: bank.vaultAuthority,
217
222
  tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
218
223
  },
219
224
  });
@@ -255,6 +260,15 @@ class Admin extends clearingHouse_1.ClearingHouse {
255
260
  },
256
261
  });
257
262
  }
263
+ async updateMarketMaxSpread(marketIndex, maxSpread) {
264
+ return await this.program.rpc.updateMarketMaxSpread(maxSpread, {
265
+ accounts: {
266
+ admin: this.wallet.publicKey,
267
+ state: await this.getStatePublicKey(),
268
+ market: await (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex),
269
+ },
270
+ });
271
+ }
258
272
  async updatePartialLiquidationClosePercentage(numerator, denominator) {
259
273
  return await this.program.rpc.updatePartialLiquidationClosePercentage(numerator, denominator, {
260
274
  accounts: {
@@ -394,11 +408,29 @@ class Admin extends clearingHouse_1.ClearingHouse {
394
408
  },
395
409
  });
396
410
  }
397
- async updateOrderAuctionTime(time) {
398
- return await this.program.rpc.updateOrderAuctionTime(typeof time === 'number' ? time : time.toNumber, {
411
+ async updateAuctionDuration(minDuration, maxDuration) {
412
+ return await this.program.rpc.updateAuctionDuration(typeof minDuration === 'number' ? minDuration : minDuration.toNumber(), typeof maxDuration === 'number' ? maxDuration : maxDuration.toNumber(), {
413
+ accounts: {
414
+ admin: this.wallet.publicKey,
415
+ state: await this.getStatePublicKey(),
416
+ },
417
+ });
418
+ }
419
+ async updateMaxBaseAssetAmountRatio(marketIndex, maxBaseAssetAmountRatio) {
420
+ return await this.program.rpc.updateMaxBaseAssetAmountRatio(maxBaseAssetAmountRatio, {
421
+ accounts: {
422
+ admin: this.wallet.publicKey,
423
+ state: await this.getStatePublicKey(),
424
+ market: this.getMarketAccount(marketIndex).pubkey,
425
+ },
426
+ });
427
+ }
428
+ async updateMaxSlippageRatio(marketIndex, maxSlippageRatio) {
429
+ return await this.program.rpc.updateMaxSlippageRatio(maxSlippageRatio, {
399
430
  accounts: {
400
431
  admin: this.wallet.publicKey,
401
432
  state: await this.getStatePublicKey(),
433
+ market: this.getMarketAccount(marketIndex).pubkey,
402
434
  },
403
435
  });
404
436
  }
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="bn.js" />
3
3
  import { AnchorProvider, BN, Program } from '@project-serum/anchor';
4
- import { StateAccount, IWallet, PositionDirection, UserAccount, MarketAccount, OrderParams, Order, BankAccount, UserBankBalance, MakerInfo } from './types';
4
+ import { StateAccount, IWallet, PositionDirection, UserAccount, MarketAccount, OrderParams, Order, BankAccount, UserBankBalance, MakerInfo, TakerInfo, OptionalOrderParams } from './types';
5
5
  import { Connection, PublicKey, TransactionSignature, ConfirmOptions, TransactionInstruction, AccountMeta } from '@solana/web3.js';
6
6
  import { MockUSDCFaucet } from './mockUSDCFaucet';
7
7
  import { EventEmitter } from 'events';
@@ -95,24 +95,23 @@ export declare class ClearingHouse {
95
95
  updateBankCumulativeInterest(bankIndex: BN): Promise<TransactionSignature>;
96
96
  updateBankCumulativeInterestIx(bankIndex: BN): Promise<TransactionInstruction>;
97
97
  openPosition(direction: PositionDirection, amount: BN, marketIndex: BN, limitPrice?: BN): Promise<TransactionSignature>;
98
- placeOrder(orderParams: OrderParams): Promise<TransactionSignature>;
99
- getPlaceOrderIx(orderParams: OrderParams): Promise<TransactionInstruction>;
100
- expireOrders(userAccountPublicKey: PublicKey): Promise<TransactionSignature>;
101
- getExpireOrdersIx(userAccountPublicKey: PublicKey): Promise<TransactionInstruction>;
98
+ placeOrder(orderParams: OptionalOrderParams): Promise<TransactionSignature>;
99
+ getOrderParams(optionalOrderParams: OptionalOrderParams): OrderParams;
100
+ getPlaceOrderIx(orderParams: OptionalOrderParams): Promise<TransactionInstruction>;
102
101
  updateAMMs(marketIndexes: BN[]): Promise<TransactionSignature>;
103
102
  getUpdateAMMsIx(marketIndexes: BN[]): Promise<TransactionInstruction>;
104
- cancelOrder(orderId: BN): Promise<TransactionSignature>;
105
- getCancelOrderIx(orderId: BN): Promise<TransactionInstruction>;
103
+ cancelOrder(orderId?: BN): Promise<TransactionSignature>;
104
+ getCancelOrderIx(orderId?: BN): Promise<TransactionInstruction>;
106
105
  cancelOrderByUserId(userOrderId: number): Promise<TransactionSignature>;
107
106
  getCancelOrderByUserIdIx(userOrderId: number): Promise<TransactionInstruction>;
108
- cancelAllOrders(bestEffort?: boolean): Promise<TransactionSignature>;
109
- getCancelAllOrdersIx(bestEffort?: boolean): Promise<TransactionInstruction>;
110
- cancelOrdersByMarketAndSide(bestEffort?: boolean, marketIndexOnly?: BN, directionOnly?: PositionDirection): Promise<TransactionSignature>;
111
- getCancelOrdersByMarketAndSideIx(bestEffort?: boolean, marketIndexOnly?: BN, directionOnly?: PositionDirection): Promise<TransactionInstruction>;
112
- fillOrder(userAccountPublicKey: PublicKey, user: UserAccount, order: Order, makerInfo?: MakerInfo): Promise<TransactionSignature>;
107
+ fillOrder(userAccountPublicKey: PublicKey, user: UserAccount, order?: Order, makerInfo?: MakerInfo): Promise<TransactionSignature>;
113
108
  getFillOrderIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, order: Order, makerInfo?: MakerInfo): Promise<TransactionInstruction>;
114
- placeAndTake(orderParams: OrderParams, makerInfo?: MakerInfo): Promise<TransactionSignature>;
115
- getPlaceAndTakeIx(orderParams: OrderParams, makerInfo?: MakerInfo): Promise<TransactionInstruction>;
109
+ triggerOrder(userAccountPublicKey: PublicKey, user: UserAccount, order: Order): Promise<TransactionSignature>;
110
+ getTriggerOrderIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, order: Order): Promise<TransactionInstruction>;
111
+ placeAndTake(orderParams: OptionalOrderParams, makerInfo?: MakerInfo): Promise<TransactionSignature>;
112
+ getPlaceAndTakeIx(orderParams: OptionalOrderParams, makerInfo?: MakerInfo): Promise<TransactionInstruction>;
113
+ placeAndMake(orderParams: OptionalOrderParams, takerInfo: TakerInfo): Promise<TransactionSignature>;
114
+ getPlaceAndMakeIx(orderParams: OptionalOrderParams, takerInfo: TakerInfo): Promise<TransactionInstruction>;
116
115
  /**
117
116
  * Close an entire position. If you want to reduce a position, use the {@link openPosition} method in the opposite direction of the current position.
118
117
  * @param marketIndex
@@ -29,6 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.ClearingHouse = void 0;
30
30
  const anchor_1 = require("@project-serum/anchor");
31
31
  const spl_token_1 = require("@solana/spl-token");
32
+ const types_1 = require("./types");
32
33
  const anchor = __importStar(require("@project-serum/anchor"));
33
34
  const clearing_house_json_1 = __importDefault(require("./idl/clearing_house.json"));
34
35
  const web3_js_1 = require("@solana/web3.js");
@@ -42,7 +43,6 @@ const pollingClearingHouseAccountSubscriber_1 = require("./accounts/pollingClear
42
43
  const webSocketClearingHouseAccountSubscriber_1 = require("./accounts/webSocketClearingHouseAccountSubscriber");
43
44
  const retryTxSender_1 = require("./tx/retryTxSender");
44
45
  const clearingHouseUser_1 = require("./clearingHouseUser");
45
- const orderParams_1 = require("./orderParams");
46
46
  const config_1 = require("./config");
47
47
  /**
48
48
  * # ClearingHouse
@@ -371,13 +371,19 @@ class ClearingHouse {
371
371
  });
372
372
  }
373
373
  else {
374
- remainingAccounts = [
375
- {
376
- pubkey: this.getBankAccount(bankIndex).pubkey,
374
+ const bankAccount = this.getBankAccount(bankIndex);
375
+ if (!bankAccount.oracle.equals(web3_js_1.PublicKey.default)) {
376
+ remainingAccounts.push({
377
+ pubkey: bankAccount.oracle,
377
378
  isSigner: false,
378
- isWritable: true,
379
- },
380
- ];
379
+ isWritable: false,
380
+ });
381
+ }
382
+ remainingAccounts.push({
383
+ pubkey: bankAccount.pubkey,
384
+ isSigner: false,
385
+ isWritable: true,
386
+ });
381
387
  }
382
388
  const bank = this.getBankAccount(bankIndex);
383
389
  return await this.program.instruction.deposit(bankIndex, amount, reduceOnly, {
@@ -482,17 +488,25 @@ class ClearingHouse {
482
488
  });
483
489
  }
484
490
  async openPosition(direction, amount, marketIndex, limitPrice) {
485
- return await this.placeAndTake((0, orderParams_1.getMarketOrderParams)(marketIndex, direction, numericConstants_1.ZERO, amount, false, limitPrice));
491
+ return await this.placeAndTake({
492
+ orderType: types_1.OrderType.MARKET,
493
+ marketIndex,
494
+ direction,
495
+ baseAssetAmount: amount,
496
+ price: limitPrice,
497
+ });
486
498
  }
487
499
  async placeOrder(orderParams) {
488
500
  const { txSig, slot } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getPlaceOrderIx(orderParams)), [], this.opts);
489
501
  this.marketLastSlotCache.set(orderParams.marketIndex.toNumber(), slot);
490
502
  return txSig;
491
503
  }
504
+ getOrderParams(optionalOrderParams) {
505
+ return Object.assign({}, types_1.DefaultOrderParams, optionalOrderParams);
506
+ }
492
507
  async getPlaceOrderIx(orderParams) {
508
+ orderParams = this.getOrderParams(orderParams);
493
509
  const userAccountPublicKey = await this.getUserAccountPublicKey();
494
- const priceOracle = this.getMarketAccount(orderParams.marketIndex).amm
495
- .oracle;
496
510
  const remainingAccounts = this.getRemainingAccounts({
497
511
  writableMarketIndex: orderParams.marketIndex,
498
512
  });
@@ -501,26 +515,10 @@ class ClearingHouse {
501
515
  state: await this.getStatePublicKey(),
502
516
  user: userAccountPublicKey,
503
517
  authority: this.wallet.publicKey,
504
- oracle: priceOracle,
505
518
  },
506
519
  remainingAccounts,
507
520
  });
508
521
  }
509
- async expireOrders(userAccountPublicKey) {
510
- const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getExpireOrdersIx(userAccountPublicKey)), [], this.opts);
511
- return txSig;
512
- }
513
- async getExpireOrdersIx(userAccountPublicKey) {
514
- const fillerPublicKey = await this.getUserAccountPublicKey();
515
- return await this.program.instruction.expireOrders({
516
- accounts: {
517
- state: await this.getStatePublicKey(),
518
- filler: fillerPublicKey,
519
- user: userAccountPublicKey,
520
- authority: this.wallet.publicKey,
521
- },
522
- });
523
- }
524
522
  async updateAMMs(marketIndexes) {
525
523
  const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getUpdateAMMsIx(marketIndexes)), [], this.opts);
526
524
  return txSig;
@@ -561,15 +559,12 @@ class ClearingHouse {
561
559
  }
562
560
  async getCancelOrderIx(orderId) {
563
561
  const userAccountPublicKey = await this.getUserAccountPublicKey();
564
- const order = this.getOrder(orderId);
565
- const oracle = this.getMarketAccount(order.marketIndex).amm.oracle;
566
562
  const remainingAccounts = this.getRemainingAccounts({});
567
- return await this.program.instruction.cancelOrder(orderId, {
563
+ return await this.program.instruction.cancelOrder(orderId !== null && orderId !== void 0 ? orderId : null, {
568
564
  accounts: {
569
565
  state: await this.getStatePublicKey(),
570
566
  user: userAccountPublicKey,
571
567
  authority: this.wallet.publicKey,
572
- oracle,
573
568
  },
574
569
  remainingAccounts,
575
570
  });
@@ -593,117 +588,150 @@ class ClearingHouse {
593
588
  remainingAccounts,
594
589
  });
595
590
  }
596
- async cancelAllOrders(bestEffort) {
597
- const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getCancelAllOrdersIx(bestEffort)), [], this.opts);
591
+ async fillOrder(userAccountPublicKey, user, order, makerInfo) {
592
+ const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getFillOrderIx(userAccountPublicKey, user, order, makerInfo)), [], this.opts);
598
593
  return txSig;
599
594
  }
600
- async getCancelAllOrdersIx(bestEffort) {
601
- const userAccountPublicKey = await this.getUserAccountPublicKey();
602
- const remainingAccounts = this.getRemainingAccounts({});
603
- for (const order of this.getUserAccount().orders) {
604
- const oracle = this.getMarketAccount(order.marketIndex).amm.oracle;
605
- remainingAccounts.push({
606
- pubkey: oracle,
607
- isWritable: false,
608
- isSigner: false,
609
- });
610
- }
611
- return await this.program.instruction.cancelAllOrders(bestEffort, {
612
- accounts: {
613
- state: await this.getStatePublicKey(),
614
- user: userAccountPublicKey,
615
- authority: this.wallet.publicKey,
616
- },
617
- remainingAccounts,
595
+ async getFillOrderIx(userAccountPublicKey, userAccount, order, makerInfo) {
596
+ const fillerPublicKey = await this.getUserAccountPublicKey();
597
+ const marketIndex = order.marketIndex;
598
+ const marketAccount = this.getMarketAccount(marketIndex);
599
+ const oracleAccountMap = new Map();
600
+ const bankAccountMap = new Map();
601
+ const marketAccountMap = new Map();
602
+ marketAccountMap.set(marketIndex.toNumber(), {
603
+ pubkey: marketAccount.pubkey,
604
+ isWritable: true,
605
+ isSigner: false,
618
606
  });
619
- }
620
- async cancelOrdersByMarketAndSide(bestEffort, marketIndexOnly, directionOnly) {
621
- const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getCancelOrdersByMarketAndSideIx(bestEffort, marketIndexOnly, directionOnly)), [], this.opts);
622
- return txSig;
623
- }
624
- async getCancelOrdersByMarketAndSideIx(bestEffort, marketIndexOnly, directionOnly) {
625
- const userAccountPublicKey = await this.getUserAccountPublicKey();
626
- const remainingAccounts = this.getRemainingAccounts({});
627
- for (const order of this.getUserAccount().orders) {
628
- const oracle = this.getMarketAccount(order.marketIndex).amm.oracle;
607
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
608
+ pubkey: marketAccount.amm.oracle,
609
+ isWritable: false,
610
+ isSigner: false,
611
+ });
612
+ for (const bankBalance of userAccount.bankBalances) {
613
+ if (!bankBalance.balance.eq(numericConstants_1.ZERO)) {
614
+ const bankAccount = this.getBankAccount(bankBalance.bankIndex);
615
+ bankAccountMap.set(bankBalance.bankIndex.toNumber(), {
616
+ pubkey: bankAccount.pubkey,
617
+ isSigner: false,
618
+ isWritable: true,
619
+ });
620
+ if (!bankAccount.oracle.equals(web3_js_1.PublicKey.default)) {
621
+ oracleAccountMap.set(bankAccount.oracle.toString(), {
622
+ pubkey: bankAccount.oracle,
623
+ isSigner: false,
624
+ isWritable: false,
625
+ });
626
+ }
627
+ }
628
+ }
629
+ for (const position of userAccount.positions) {
630
+ if (!(0, position_1.positionIsAvailable)(position) &&
631
+ !position.marketIndex.eq(order.marketIndex)) {
632
+ const market = this.getMarketAccount(position.marketIndex);
633
+ marketAccountMap.set(position.marketIndex.toNumber(), {
634
+ pubkey: market.pubkey,
635
+ isWritable: true,
636
+ isSigner: false,
637
+ });
638
+ oracleAccountMap.set(market.amm.oracle.toString(), {
639
+ pubkey: market.amm.oracle,
640
+ isWritable: false,
641
+ isSigner: false,
642
+ });
643
+ }
644
+ }
645
+ const remainingAccounts = [
646
+ ...oracleAccountMap.values(),
647
+ ...bankAccountMap.values(),
648
+ ...marketAccountMap.values(),
649
+ ];
650
+ if (makerInfo) {
629
651
  remainingAccounts.push({
630
- pubkey: oracle,
631
- isWritable: false,
652
+ pubkey: makerInfo.maker,
653
+ isWritable: true,
632
654
  isSigner: false,
633
655
  });
634
656
  }
635
- return await this.program.instruction.cancelOrdersByMarketAndSide(bestEffort, marketIndexOnly, directionOnly, {
657
+ const orderId = order.orderId;
658
+ const makerOrderId = makerInfo ? makerInfo.order.orderId : null;
659
+ return await this.program.instruction.fillOrder(orderId, makerOrderId, {
636
660
  accounts: {
637
661
  state: await this.getStatePublicKey(),
662
+ filler: fillerPublicKey,
638
663
  user: userAccountPublicKey,
639
664
  authority: this.wallet.publicKey,
640
665
  },
641
666
  remainingAccounts,
642
667
  });
643
668
  }
644
- async fillOrder(userAccountPublicKey, user, order, makerInfo) {
645
- const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getFillOrderIx(userAccountPublicKey, user, order, makerInfo)), [], this.opts);
669
+ async triggerOrder(userAccountPublicKey, user, order) {
670
+ const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getTriggerOrderIx(userAccountPublicKey, user, order)), [], this.opts);
646
671
  return txSig;
647
672
  }
648
- async getFillOrderIx(userAccountPublicKey, userAccount, order, makerInfo) {
673
+ async getTriggerOrderIx(userAccountPublicKey, userAccount, order) {
649
674
  const fillerPublicKey = await this.getUserAccountPublicKey();
650
675
  const marketIndex = order.marketIndex;
651
676
  const marketAccount = this.getMarketAccount(marketIndex);
652
- const oracle = marketAccount.amm.oracle;
653
- const bankAccountInfos = [
654
- {
655
- pubkey: this.getQuoteAssetBankAccount().pubkey,
656
- isSigner: false,
657
- isWritable: true,
658
- },
659
- ];
660
- const marketAccountInfos = [
661
- {
662
- pubkey: marketAccount.pubkey,
663
- isWritable: true,
664
- isSigner: false,
665
- },
666
- ];
667
- const oracleAccountInfos = [
668
- {
669
- pubkey: marketAccount.amm.oracle,
670
- isWritable: false,
671
- isSigner: false,
672
- },
673
- ];
677
+ const oracleAccountMap = new Map();
678
+ const bankAccountMap = new Map();
679
+ const marketAccountMap = new Map();
680
+ marketAccountMap.set(marketIndex.toNumber(), {
681
+ pubkey: marketAccount.pubkey,
682
+ isWritable: true,
683
+ isSigner: false,
684
+ });
685
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
686
+ pubkey: marketAccount.amm.oracle,
687
+ isWritable: false,
688
+ isSigner: false,
689
+ });
690
+ for (const bankBalance of userAccount.bankBalances) {
691
+ if (!bankBalance.balance.eq(numericConstants_1.ZERO)) {
692
+ const bankAccount = this.getBankAccount(bankBalance.bankIndex);
693
+ bankAccountMap.set(bankBalance.bankIndex.toNumber(), {
694
+ pubkey: bankAccount.pubkey,
695
+ isSigner: false,
696
+ isWritable: true,
697
+ });
698
+ if (!bankAccount.oracle.equals(web3_js_1.PublicKey.default)) {
699
+ oracleAccountMap.set(bankAccount.oracle.toString(), {
700
+ pubkey: bankAccount.oracle,
701
+ isSigner: false,
702
+ isWritable: false,
703
+ });
704
+ }
705
+ }
706
+ }
674
707
  for (const position of userAccount.positions) {
675
708
  if (!(0, position_1.positionIsAvailable)(position) &&
676
709
  !position.marketIndex.eq(order.marketIndex)) {
677
710
  const market = this.getMarketAccount(position.marketIndex);
678
- marketAccountInfos.push({
711
+ marketAccountMap.set(position.marketIndex.toNumber(), {
679
712
  pubkey: market.pubkey,
680
- isWritable: false,
713
+ isWritable: true,
681
714
  isSigner: false,
682
715
  });
683
- oracleAccountInfos.push({
716
+ oracleAccountMap.set(market.amm.oracle.toString(), {
684
717
  pubkey: market.amm.oracle,
685
718
  isWritable: false,
686
719
  isSigner: false,
687
720
  });
688
721
  }
689
722
  }
690
- const remainingAccounts = oracleAccountInfos.concat(bankAccountInfos.concat(marketAccountInfos));
691
- if (makerInfo) {
692
- remainingAccounts.push({
693
- pubkey: makerInfo.maker,
694
- isWritable: true,
695
- isSigner: false,
696
- });
697
- }
723
+ const remainingAccounts = [
724
+ ...oracleAccountMap.values(),
725
+ ...bankAccountMap.values(),
726
+ ...marketAccountMap.values(),
727
+ ];
698
728
  const orderId = order.orderId;
699
- const makerOrderId = makerInfo ? makerInfo.order.orderId : null;
700
- return await this.program.instruction.fillOrder(orderId, makerOrderId, {
729
+ return await this.program.instruction.triggerOrder(orderId, {
701
730
  accounts: {
702
731
  state: await this.getStatePublicKey(),
703
732
  filler: fillerPublicKey,
704
733
  user: userAccountPublicKey,
705
734
  authority: this.wallet.publicKey,
706
- oracle: oracle,
707
735
  },
708
736
  remainingAccounts,
709
737
  });
@@ -714,9 +742,8 @@ class ClearingHouse {
714
742
  return txSig;
715
743
  }
716
744
  async getPlaceAndTakeIx(orderParams, makerInfo) {
745
+ orderParams = this.getOrderParams(orderParams);
717
746
  const userAccountPublicKey = await this.getUserAccountPublicKey();
718
- const priceOracle = this.getMarketAccount(orderParams.marketIndex).amm
719
- .oracle;
720
747
  const remainingAccounts = this.getRemainingAccounts({
721
748
  writableMarketIndex: orderParams.marketIndex,
722
749
  writableBankIndex: numericConstants_1.QUOTE_ASSET_BANK_INDEX,
@@ -735,7 +762,34 @@ class ClearingHouse {
735
762
  state: await this.getStatePublicKey(),
736
763
  user: userAccountPublicKey,
737
764
  authority: this.wallet.publicKey,
738
- oracle: priceOracle,
765
+ },
766
+ remainingAccounts,
767
+ });
768
+ }
769
+ async placeAndMake(orderParams, takerInfo) {
770
+ const { txSig, slot } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getPlaceAndMakeIx(orderParams, takerInfo)), [], this.opts);
771
+ this.marketLastSlotCache.set(orderParams.marketIndex.toNumber(), slot);
772
+ return txSig;
773
+ }
774
+ async getPlaceAndMakeIx(orderParams, takerInfo) {
775
+ orderParams = this.getOrderParams(orderParams);
776
+ const userAccountPublicKey = await this.getUserAccountPublicKey();
777
+ const remainingAccounts = this.getRemainingAccounts({
778
+ writableMarketIndex: orderParams.marketIndex,
779
+ writableBankIndex: numericConstants_1.QUOTE_ASSET_BANK_INDEX,
780
+ });
781
+ const takerOrderId = takerInfo.order.orderId;
782
+ remainingAccounts.push({
783
+ pubkey: takerInfo.taker,
784
+ isSigner: false,
785
+ isWritable: true,
786
+ });
787
+ return await this.program.instruction.placeAndMake(orderParams, takerOrderId, {
788
+ accounts: {
789
+ state: await this.getStatePublicKey(),
790
+ user: userAccountPublicKey,
791
+ taker: takerInfo.taker,
792
+ authority: this.wallet.publicKey,
739
793
  },
740
794
  remainingAccounts,
741
795
  });
@@ -750,7 +804,13 @@ class ClearingHouse {
750
804
  if (!userPosition) {
751
805
  throw Error(`No position in market ${marketIndex.toString()}`);
752
806
  }
753
- return await this.placeAndTake((0, orderParams_1.getMarketOrderParams)(marketIndex, (0, position_1.findDirectionToClose)(userPosition), numericConstants_1.ZERO, userPosition.baseAssetAmount, true, undefined));
807
+ return await this.placeAndTake({
808
+ orderType: types_1.OrderType.MARKET,
809
+ marketIndex,
810
+ direction: (0, position_1.findDirectionToClose)(userPosition),
811
+ baseAssetAmount: userPosition.baseAssetAmount,
812
+ reduceOnly: true,
813
+ });
754
814
  }
755
815
  async settlePNLs(users, marketIndex) {
756
816
  const ixs = [];
package/lib/config.js CHANGED
@@ -7,7 +7,7 @@ exports.configs = {
7
7
  devnet: {
8
8
  ENV: 'devnet',
9
9
  PYTH_ORACLE_MAPPING_ADDRESS: 'BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2',
10
- CLEARING_HOUSE_PROGRAM_ID: 'GCuH76fb1rXc7bjFXNcnNvWSekLgzpsnMbc1Ng4FsGSs',
10
+ CLEARING_HOUSE_PROGRAM_ID: 'BMow898PH56jD8z4EaqxicoGXkR1HhN17qrER6Uc4AYq',
11
11
  USDC_MINT_ADDRESS: '8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2',
12
12
  MARKETS: markets_1.DevnetMarkets,
13
13
  BANKS: banks_1.DevnetBanks,
@@ -12,8 +12,15 @@ exports.DevnetBanks = [
12
12
  mint: new web3_js_1.PublicKey('8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2'),
13
13
  },
14
14
  {
15
- symbol: 'BTC',
15
+ symbol: 'SOL',
16
16
  bankIndex: new __1.BN(1),
17
+ oracle: new web3_js_1.PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
18
+ oracleSource: __1.OracleSource.PYTH,
19
+ mint: new web3_js_1.PublicKey('So11111111111111111111111111111111111111112'),
20
+ },
21
+ {
22
+ symbol: 'BTC',
23
+ bankIndex: new __1.BN(2),
17
24
  oracle: new web3_js_1.PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
18
25
  oracleSource: __1.OracleSource.PYTH,
19
26
  mint: new web3_js_1.PublicKey('Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr'),
@@ -29,6 +29,7 @@ export declare const AMM_RESERVE_PRECISION: BN;
29
29
  export declare const BASE_PRECISION: BN;
30
30
  export declare const BASE_PRECISION_EXP: BN;
31
31
  export declare const AMM_TO_QUOTE_PRECISION_RATIO: BN;
32
+ export declare const PRICE_DIV_PEG: BN;
32
33
  export declare const PRICE_TO_QUOTE_PRECISION: BN;
33
34
  export declare const AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO: BN;
34
35
  export declare const MARGIN_PRECISION: BN;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.QUOTE_ASSET_BANK_INDEX = exports.ONE_YEAR = exports.BID_ASK_SPREAD_PRECISION = exports.MARGIN_PRECISION = exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.PRICE_TO_QUOTE_PRECISION = exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.BASE_PRECISION_EXP = exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION = exports.PEG_PRECISION = exports.FUNDING_PAYMENT_PRECISION = exports.MARK_PRICE_PRECISION = exports.QUOTE_PRECISION = exports.BANK_BALANCE_PRECISION = exports.BANK_BALANCE_PRECISION_EXP = exports.BANK_WEIGHT_PRECISION = exports.BANK_RATE_PRECISION = exports.BANK_UTILIZATION_PRECISION = exports.BANK_CUMULATIVE_INTEREST_PRECISION = exports.BANK_INTEREST_PRECISION = exports.AMM_RESERVE_PRECISION_EXP = exports.PEG_PRECISION_EXP = exports.FUNDING_RATE_PRECISION_EXP = exports.MARK_PRICE_PRECISION_EXP = exports.FUNDING_PAYMENT_PRECISION_EXP = exports.QUOTE_PRECISION_EXP = exports.MAX_LEVERAGE = exports.TEN_MILLION = exports.BN_MAX = exports.TEN_THOUSAND = exports.TEN = exports.TWO = exports.ONE = exports.ZERO = void 0;
3
+ exports.QUOTE_ASSET_BANK_INDEX = exports.ONE_YEAR = exports.BID_ASK_SPREAD_PRECISION = exports.MARGIN_PRECISION = exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.PRICE_TO_QUOTE_PRECISION = exports.PRICE_DIV_PEG = exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.BASE_PRECISION_EXP = exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION = exports.PEG_PRECISION = exports.FUNDING_PAYMENT_PRECISION = exports.MARK_PRICE_PRECISION = exports.QUOTE_PRECISION = exports.BANK_BALANCE_PRECISION = exports.BANK_BALANCE_PRECISION_EXP = exports.BANK_WEIGHT_PRECISION = exports.BANK_RATE_PRECISION = exports.BANK_UTILIZATION_PRECISION = exports.BANK_CUMULATIVE_INTEREST_PRECISION = exports.BANK_INTEREST_PRECISION = exports.AMM_RESERVE_PRECISION_EXP = exports.PEG_PRECISION_EXP = exports.FUNDING_RATE_PRECISION_EXP = exports.MARK_PRICE_PRECISION_EXP = exports.FUNDING_PAYMENT_PRECISION_EXP = exports.QUOTE_PRECISION_EXP = exports.MAX_LEVERAGE = exports.TEN_MILLION = exports.BN_MAX = exports.TEN_THOUSAND = exports.TEN = exports.TWO = exports.ONE = exports.ZERO = void 0;
4
4
  const __1 = require("../");
5
5
  exports.ZERO = new __1.BN(0);
6
6
  exports.ONE = new __1.BN(1);
@@ -31,6 +31,7 @@ exports.AMM_RESERVE_PRECISION = new __1.BN(10).pow(exports.AMM_RESERVE_PRECISION
31
31
  exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION;
32
32
  exports.BASE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP;
33
33
  exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.div(exports.QUOTE_PRECISION); // 10^7
34
+ exports.PRICE_DIV_PEG = exports.MARK_PRICE_PRECISION.div(exports.PEG_PRECISION); //10^7
34
35
  exports.PRICE_TO_QUOTE_PRECISION = exports.MARK_PRICE_PRECISION.div(exports.QUOTE_PRECISION);
35
36
  exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.mul(exports.PEG_PRECISION).div(exports.QUOTE_PRECISION); // 10^10
36
37
  exports.MARGIN_PRECISION = exports.TEN_THOUSAND;