@drift-labs/sdk 0.2.0-master.21 → 0.2.0-master.24

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 (88) hide show
  1. package/lib/accounts/types.d.ts +1 -0
  2. package/lib/addresses/pda.d.ts +3 -0
  3. package/lib/addresses/pda.js +23 -1
  4. package/lib/admin.d.ts +3 -0
  5. package/lib/admin.js +31 -0
  6. package/lib/clearingHouse.d.ts +9 -2
  7. package/lib/clearingHouse.js +132 -4
  8. package/lib/clearingHouseUser.js +5 -5
  9. package/lib/config.js +1 -1
  10. package/lib/constants/banks.d.ts +2 -0
  11. package/lib/constants/banks.js +9 -0
  12. package/lib/constants/numericConstants.d.ts +2 -0
  13. package/lib/constants/numericConstants.js +4 -1
  14. package/lib/events/sort.js +7 -10
  15. package/lib/events/types.d.ts +2 -1
  16. package/lib/events/types.js +1 -0
  17. package/lib/idl/clearing_house.json +1008 -147
  18. package/lib/index.d.ts +1 -0
  19. package/lib/index.js +1 -0
  20. package/lib/math/amm.js +2 -2
  21. package/lib/math/insurance.d.ts +4 -0
  22. package/lib/math/insurance.js +27 -0
  23. package/lib/math/margin.d.ts +1 -1
  24. package/lib/math/margin.js +5 -7
  25. package/lib/math/position.js +1 -1
  26. package/lib/types.d.ts +56 -20
  27. package/lib/types.js +0 -3
  28. package/package.json +1 -1
  29. package/src/addresses/marketAddresses.js +26 -0
  30. package/src/addresses/pda.ts +47 -0
  31. package/src/admin.ts +65 -0
  32. package/src/assert/assert.js +9 -0
  33. package/src/clearingHouse.ts +217 -9
  34. package/src/clearingHouseUser.ts +10 -6
  35. package/src/config.ts +1 -1
  36. package/src/constants/banks.js +42 -0
  37. package/src/constants/banks.ts +16 -0
  38. package/src/constants/markets.js +42 -0
  39. package/src/constants/numericConstants.js +41 -0
  40. package/src/constants/numericConstants.ts +4 -0
  41. package/src/events/eventList.js +77 -0
  42. package/src/events/sort.ts +10 -14
  43. package/src/events/txEventCache.js +71 -0
  44. package/src/events/types.ts +3 -0
  45. package/src/examples/makeTradeExample.js +80 -0
  46. package/src/factory/bigNum.js +390 -0
  47. package/src/factory/oracleClient.js +20 -0
  48. package/src/idl/clearing_house.json +1008 -147
  49. package/src/index.ts +1 -0
  50. package/src/math/amm.ts +2 -2
  51. package/src/math/auction.js +42 -0
  52. package/src/math/conversion.js +11 -0
  53. package/src/math/funding.js +248 -0
  54. package/src/math/insurance.ts +35 -0
  55. package/src/math/margin.ts +3 -10
  56. package/src/math/oracles.js +26 -0
  57. package/src/math/position.ts +2 -2
  58. package/src/math/repeg.js +128 -0
  59. package/src/math/state.js +15 -0
  60. package/src/math/trade.js +253 -0
  61. package/src/math/utils.js +26 -0
  62. package/src/math/utils.js.map +1 -0
  63. package/src/oracles/oracleClientCache.js +19 -0
  64. package/src/oracles/pythClient.js +46 -0
  65. package/src/oracles/quoteAssetOracleClient.js +32 -0
  66. package/src/oracles/switchboardClient.js +69 -0
  67. package/src/oracles/types.js +2 -0
  68. package/src/orderParams.js +20 -0
  69. package/src/slot/SlotSubscriber.js +39 -0
  70. package/src/token/index.js +38 -0
  71. package/src/tokenFaucet.js +189 -0
  72. package/src/tx/types.js +2 -0
  73. package/src/tx/utils.js +17 -0
  74. package/src/types.ts +64 -20
  75. package/src/userName.js +20 -0
  76. package/src/util/computeUnits.js +27 -0
  77. package/src/util/getTokenAddress.js +9 -0
  78. package/src/util/promiseTimeout.js +14 -0
  79. package/src/util/tps.js +27 -0
  80. package/src/wallet.js +35 -0
  81. package/my-script/.env +0 -7
  82. package/my-script/getUserStats.ts +0 -124
  83. package/my-script/multiConnections.ts +0 -137
  84. package/my-script/test-regex.ts +0 -11
  85. package/my-script/utils.ts +0 -52
  86. package/my-script/ww18NdhuLSQPCrHSx7V68eZJpe2y311heWeXJfSmP3Q.json +0 -1
  87. package/my-script/ww2z7N9TG1PLLUQGQF2VKzCFaPtQ5FBhRfeEAuy6c5C.json +0 -1
  88. package/my-script/ww3StJtTubhwssqAhvSSAc5ifCgKjzmF8hz7Gt2DmSa.json +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, UserStatsAccount } from '../types';
4
5
  import StrictEventEmitter from 'strict-event-emitter-types';
5
6
  import { EventEmitter } from 'events';
@@ -11,3 +11,6 @@ export declare function getMarketPublicKey(programId: PublicKey, marketIndex: BN
11
11
  export declare function getBankPublicKey(programId: PublicKey, bankIndex: BN): Promise<PublicKey>;
12
12
  export declare function getBankVaultPublicKey(programId: PublicKey, bankIndex: BN): Promise<PublicKey>;
13
13
  export declare function getBankVaultAuthorityPublicKey(programId: PublicKey, bankIndex: BN): Promise<PublicKey>;
14
+ export declare function getInsuranceFundVaultPublicKey(programId: PublicKey, bankIndex: BN): Promise<PublicKey>;
15
+ export declare function getInsuranceFundVaultAuthorityPublicKey(programId: PublicKey, bankIndex: BN): Promise<PublicKey>;
16
+ export declare function getInsuranceFundStakeAccountPublicKey(programId: PublicKey, authority: PublicKey, bankIndex: BN): PublicKey;
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.getBankVaultAuthorityPublicKey = exports.getBankVaultPublicKey = exports.getBankPublicKey = exports.getMarketPublicKey = exports.getUserStatsAccountPublicKey = exports.getUserAccountPublicKeySync = exports.getUserAccountPublicKey = exports.getUserAccountPublicKeyAndNonce = exports.getClearingHouseStateAccountPublicKey = exports.getClearingHouseStateAccountPublicKeyAndNonce = void 0;
26
+ exports.getInsuranceFundStakeAccountPublicKey = exports.getInsuranceFundVaultAuthorityPublicKey = exports.getInsuranceFundVaultPublicKey = exports.getBankVaultAuthorityPublicKey = exports.getBankVaultPublicKey = exports.getBankPublicKey = exports.getMarketPublicKey = exports.getUserStatsAccountPublicKey = exports.getUserAccountPublicKeySync = exports.getUserAccountPublicKey = exports.getUserAccountPublicKeyAndNonce = exports.getClearingHouseStateAccountPublicKey = exports.getClearingHouseStateAccountPublicKeyAndNonce = void 0;
27
27
  const anchor = __importStar(require("@project-serum/anchor"));
28
28
  async function getClearingHouseStateAccountPublicKeyAndNonce(programId) {
29
29
  return anchor.web3.PublicKey.findProgramAddress([Buffer.from(anchor.utils.bytes.utf8.encode('clearing_house'))], programId);
@@ -88,3 +88,25 @@ async function getBankVaultAuthorityPublicKey(programId, bankIndex) {
88
88
  ], programId))[0];
89
89
  }
90
90
  exports.getBankVaultAuthorityPublicKey = getBankVaultAuthorityPublicKey;
91
+ async function getInsuranceFundVaultPublicKey(programId, bankIndex) {
92
+ return (await anchor.web3.PublicKey.findProgramAddress([
93
+ Buffer.from(anchor.utils.bytes.utf8.encode('insurance_fund_vault')),
94
+ bankIndex.toArrayLike(Buffer, 'le', 8),
95
+ ], programId))[0];
96
+ }
97
+ exports.getInsuranceFundVaultPublicKey = getInsuranceFundVaultPublicKey;
98
+ async function getInsuranceFundVaultAuthorityPublicKey(programId, bankIndex) {
99
+ return (await anchor.web3.PublicKey.findProgramAddress([
100
+ Buffer.from(anchor.utils.bytes.utf8.encode('insurance_fund_vault_authority')),
101
+ bankIndex.toArrayLike(Buffer, 'le', 8),
102
+ ], programId))[0];
103
+ }
104
+ exports.getInsuranceFundVaultAuthorityPublicKey = getInsuranceFundVaultAuthorityPublicKey;
105
+ function getInsuranceFundStakeAccountPublicKey(programId, authority, bankIndex) {
106
+ return anchor.web3.PublicKey.findProgramAddressSync([
107
+ Buffer.from(anchor.utils.bytes.utf8.encode('insurance_fund_stake')),
108
+ authority.toBuffer(),
109
+ bankIndex.toArrayLike(Buffer, 'le', 8),
110
+ ], programId)[0];
111
+ }
112
+ exports.getInsuranceFundStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey;
package/lib/admin.d.ts CHANGED
@@ -20,6 +20,7 @@ export declare class Admin extends ClearingHouse {
20
20
  updateCurveUpdateIntensity(marketIndex: BN, curveUpdateIntensity: number): Promise<TransactionSignature>;
21
21
  updateMarginRatio(marketIndex: BN, marginRatioInitial: number, marginRatioMaintenance: number): Promise<TransactionSignature>;
22
22
  updateMarketBaseSpread(marketIndex: BN, baseSpread: number): Promise<TransactionSignature>;
23
+ updateAmmJitIntensity(marketIndex: BN, ammJitIntensity: number): Promise<TransactionSignature>;
23
24
  updateMarketMaxSpread(marketIndex: BN, maxSpread: number): Promise<TransactionSignature>;
24
25
  updatePartialLiquidationClosePercentage(numerator: BN, denominator: BN): Promise<TransactionSignature>;
25
26
  updatePartialLiquidationPenaltyPercentage(numerator: BN, denominator: BN): Promise<TransactionSignature>;
@@ -30,6 +31,8 @@ export declare class Admin extends ClearingHouse {
30
31
  updateFee(fees: FeeStructure): Promise<TransactionSignature>;
31
32
  updateOracleGuardRails(oracleGuardRails: OracleGuardRails): Promise<TransactionSignature>;
32
33
  updateBankWithdrawGuardThreshold(bankIndex: BN, withdrawGuardThreshold: BN): Promise<TransactionSignature>;
34
+ updateBankIfFactor(bankIndex: BN, userIfFactor: BN, totalIfFactor: BN, liquidationIfFactor: BN): Promise<TransactionSignature>;
35
+ updateBankInsuranceWithdrawEscrowPeriod(bankIndex: BN, insuranceWithdrawEscrowPeriod: BN): Promise<TransactionSignature>;
33
36
  updateLpCooldownTime(marketIndex: BN, cooldownTime: BN): Promise<TransactionSignature>;
34
37
  updateMarketOracle(marketIndex: BN, oracle: PublicKey, oracleSource: OracleSource): Promise<TransactionSignature>;
35
38
  updateMarketMinimumQuoteAssetTradeSize(marketIndex: BN, minimumTradeSize: BN): Promise<TransactionSignature>;
package/lib/admin.js CHANGED
@@ -63,6 +63,8 @@ class Admin extends clearingHouse_1.ClearingHouse {
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 insuranceFundVault = await (0, pda_1.getInsuranceFundVaultPublicKey)(this.program.programId, bankIndex);
67
+ const insuranceFundVaultAuthority = await (0, pda_1.getInsuranceFundVaultAuthorityPublicKey)(this.program.programId, bankIndex);
66
68
  const initializeTx = await this.program.transaction.initializeBank(optimalUtilization, optimalRate, maxRate, oracleSource, initialAssetWeight, maintenanceAssetWeight, initialLiabilityWeight, maintenanceLiabilityWeight, imfFactor, liquidationFee, {
67
69
  accounts: {
68
70
  admin: this.wallet.publicKey,
@@ -70,6 +72,8 @@ class Admin extends clearingHouse_1.ClearingHouse {
70
72
  bank,
71
73
  bankVault,
72
74
  bankVaultAuthority,
75
+ insuranceFundVault,
76
+ insuranceFundVaultAuthority,
73
77
  bankMint: mint,
74
78
  oracle,
75
79
  rent: web3_js_1.SYSVAR_RENT_PUBKEY,
@@ -260,6 +264,15 @@ class Admin extends clearingHouse_1.ClearingHouse {
260
264
  },
261
265
  });
262
266
  }
267
+ async updateAmmJitIntensity(marketIndex, ammJitIntensity) {
268
+ return await this.program.rpc.updateAmmJitIntensity(ammJitIntensity, {
269
+ accounts: {
270
+ admin: this.wallet.publicKey,
271
+ state: await this.getStatePublicKey(),
272
+ market: await (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex),
273
+ },
274
+ });
275
+ }
263
276
  async updateMarketMaxSpread(marketIndex, maxSpread) {
264
277
  return await this.program.rpc.updateMarketMaxSpread(maxSpread, {
265
278
  accounts: {
@@ -342,6 +355,24 @@ class Admin extends clearingHouse_1.ClearingHouse {
342
355
  },
343
356
  });
344
357
  }
358
+ async updateBankIfFactor(bankIndex, userIfFactor, totalIfFactor, liquidationIfFactor) {
359
+ return await this.program.rpc.updateBankIfFactor(bankIndex, userIfFactor, totalIfFactor, liquidationIfFactor, {
360
+ accounts: {
361
+ admin: this.wallet.publicKey,
362
+ state: await this.getStatePublicKey(),
363
+ bank: await (0, pda_1.getBankPublicKey)(this.program.programId, bankIndex),
364
+ },
365
+ });
366
+ }
367
+ async updateBankInsuranceWithdrawEscrowPeriod(bankIndex, insuranceWithdrawEscrowPeriod) {
368
+ return await this.program.rpc.updateBankInsuranceWithdrawEscrowPeriod(insuranceWithdrawEscrowPeriod, {
369
+ accounts: {
370
+ admin: this.wallet.publicKey,
371
+ state: await this.getStatePublicKey(),
372
+ bank: await (0, pda_1.getBankPublicKey)(this.program.programId, bankIndex),
373
+ },
374
+ });
375
+ }
345
376
  async updateLpCooldownTime(marketIndex, cooldownTime) {
346
377
  return await this.program.rpc.updateLpCooldownTime(cooldownTime, {
347
378
  accounts: {
@@ -149,8 +149,8 @@ export declare class ClearingHouse {
149
149
  getLiquidateBorrowForPerpPnlIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, perpMarketIndex: BN, liabilityBankIndex: BN, maxLiabilityTransfer: BN): Promise<TransactionInstruction>;
150
150
  liquidatePerpPnlForDeposit(userAccountPublicKey: PublicKey, userAccount: UserAccount, perpMarketIndex: BN, assetBankIndex: BN, maxPnlTransfer: BN): Promise<TransactionSignature>;
151
151
  getLiquidatePerpPnlForDepositIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, perpMarketIndex: BN, assetBankIndex: BN, maxPnlTransfer: BN): Promise<TransactionInstruction>;
152
- resolvePerpBankruptcy(userAccountPublicKey: PublicKey, userAccount: UserAccount, marketIndex: BN): Promise<TransactionSignature>;
153
- getResolvePerpBankruptcyIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, marketIndex: BN): Promise<TransactionInstruction>;
152
+ resolvePerpBankruptcy(userAccountPublicKey: PublicKey, userAccount: UserAccount, bankIndex: BN, marketIndex: BN): Promise<TransactionSignature>;
153
+ getResolvePerpBankruptcyIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, bankIndex: BN, marketIndex: BN): Promise<TransactionInstruction>;
154
154
  resolveBorrowBankruptcy(userAccountPublicKey: PublicKey, userAccount: UserAccount, bankIndex: BN): Promise<TransactionSignature>;
155
155
  getResolveBorrowBankruptcyIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, bankIndex: BN): Promise<TransactionInstruction>;
156
156
  getRemainingAccountsWithCounterparty(params: {
@@ -164,4 +164,11 @@ export declare class ClearingHouse {
164
164
  getSettleFundingPaymentIx(userAccount: PublicKey): Promise<TransactionInstruction>;
165
165
  triggerEvent(eventName: keyof ClearingHouseAccountEvents, data?: any): void;
166
166
  getOracleDataForMarket(marketIndex: BN): OraclePriceData;
167
+ initializeInsuranceFundStake(bankIndex: BN): Promise<TransactionSignature>;
168
+ getInitializeInsuranceFundStakeIx(bankIndex: BN): Promise<TransactionInstruction>;
169
+ addInsuranceFundStake(bankIndex: BN, amount: BN, collateralAccountPublicKey: PublicKey): Promise<TransactionSignature>;
170
+ requestRemoveInsuranceFundStake(bankIndex: BN, amount: BN): Promise<TransactionSignature>;
171
+ cancelRequestRemoveInsuranceFundStake(bankIndex: BN): Promise<TransactionSignature>;
172
+ removeInsuranceFundStake(bankIndex: BN, collateralAccountPublicKey: PublicKey): Promise<TransactionSignature>;
173
+ settleRevenueToInsuranceFund(bankIndex: BN): Promise<TransactionSignature>;
167
174
  }
@@ -1300,22 +1300,28 @@ class ClearingHouse {
1300
1300
  remainingAccounts: remainingAccounts,
1301
1301
  });
1302
1302
  }
1303
- async resolvePerpBankruptcy(userAccountPublicKey, userAccount, marketIndex) {
1304
- const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getResolvePerpBankruptcyIx(userAccountPublicKey, userAccount, marketIndex)), [], this.opts);
1303
+ async resolvePerpBankruptcy(userAccountPublicKey, userAccount, bankIndex, marketIndex) {
1304
+ const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getResolvePerpBankruptcyIx(userAccountPublicKey, userAccount, bankIndex, marketIndex)), [], this.opts);
1305
1305
  return txSig;
1306
1306
  }
1307
- async getResolvePerpBankruptcyIx(userAccountPublicKey, userAccount, marketIndex) {
1307
+ async getResolvePerpBankruptcyIx(userAccountPublicKey, userAccount, bankIndex, marketIndex) {
1308
1308
  const liquidatorPublicKey = await this.getUserAccountPublicKey();
1309
1309
  const remainingAccounts = this.getRemainingAccountsWithCounterparty({
1310
1310
  writableMarketIndex: marketIndex,
1311
+ writableBankIndexes: [bankIndex],
1311
1312
  counterPartyUserAccount: userAccount,
1312
1313
  });
1313
- return await this.program.instruction.resolvePerpBankruptcy(marketIndex, {
1314
+ const bank = this.getBankAccount(bankIndex);
1315
+ return await this.program.instruction.resolvePerpBankruptcy(bankIndex, marketIndex, {
1314
1316
  accounts: {
1315
1317
  state: await this.getStatePublicKey(),
1316
1318
  authority: this.wallet.publicKey,
1317
1319
  user: userAccountPublicKey,
1318
1320
  liquidator: liquidatorPublicKey,
1321
+ bankVault: bank.vault,
1322
+ insuranceFundVault: bank.insuranceFundVault,
1323
+ insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
1324
+ tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
1319
1325
  },
1320
1326
  remainingAccounts: remainingAccounts,
1321
1327
  });
@@ -1330,12 +1336,17 @@ class ClearingHouse {
1330
1336
  writableBankIndexes: [bankIndex],
1331
1337
  counterPartyUserAccount: userAccount,
1332
1338
  });
1339
+ const bank = this.getBankAccount(bankIndex);
1333
1340
  return await this.program.instruction.resolveBorrowBankruptcy(bankIndex, {
1334
1341
  accounts: {
1335
1342
  state: await this.getStatePublicKey(),
1336
1343
  authority: this.wallet.publicKey,
1337
1344
  user: userAccountPublicKey,
1338
1345
  liquidator: liquidatorPublicKey,
1346
+ bankVault: bank.vault,
1347
+ insuranceFundVault: bank.insuranceFundVault,
1348
+ insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
1349
+ tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
1339
1350
  },
1340
1351
  remainingAccounts: remainingAccounts,
1341
1352
  });
@@ -1517,5 +1528,122 @@ class ClearingHouse {
1517
1528
  const oracleData = this.getOraclePriceDataAndSlot(oracleKey).data;
1518
1529
  return oracleData;
1519
1530
  }
1531
+ async initializeInsuranceFundStake(bankIndex) {
1532
+ const { txSig } = await this.txSender.send((0, utils_1.wrapInTx)(await this.getInitializeInsuranceFundStakeIx(bankIndex)), [], this.opts);
1533
+ return txSig;
1534
+ }
1535
+ async getInitializeInsuranceFundStakeIx(bankIndex) {
1536
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, bankIndex);
1537
+ return await this.program.instruction.initializeInsuranceFundStake(bankIndex, {
1538
+ accounts: {
1539
+ insuranceFundStake: ifStakeAccountPublicKey,
1540
+ bank: this.getBankAccount(bankIndex).pubkey,
1541
+ userStats: this.getUserStatsAccountPublicKey(),
1542
+ authority: this.wallet.publicKey,
1543
+ payer: this.wallet.publicKey,
1544
+ rent: anchor.web3.SYSVAR_RENT_PUBKEY,
1545
+ systemProgram: anchor.web3.SystemProgram.programId,
1546
+ state: await this.getStatePublicKey(),
1547
+ },
1548
+ });
1549
+ }
1550
+ async addInsuranceFundStake(bankIndex, amount, collateralAccountPublicKey) {
1551
+ const bank = this.getBankAccount(bankIndex);
1552
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, bankIndex);
1553
+ const remainingAccounts = this.getRemainingAccounts({
1554
+ writableBankIndex: bankIndex,
1555
+ });
1556
+ return await this.program.rpc.addInsuranceFundStake(bankIndex, amount, {
1557
+ accounts: {
1558
+ state: await this.getStatePublicKey(),
1559
+ bank: bank.pubkey,
1560
+ insuranceFundStake: ifStakeAccountPublicKey,
1561
+ userStats: this.getUserStatsAccountPublicKey(),
1562
+ authority: this.wallet.publicKey,
1563
+ insuranceFundVault: bank.insuranceFundVault,
1564
+ userTokenAccount: collateralAccountPublicKey,
1565
+ tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
1566
+ },
1567
+ remainingAccounts,
1568
+ });
1569
+ }
1570
+ async requestRemoveInsuranceFundStake(bankIndex, amount) {
1571
+ const bank = this.getBankAccount(bankIndex);
1572
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, bankIndex);
1573
+ const remainingAccounts = this.getRemainingAccounts({
1574
+ writableBankIndex: bankIndex,
1575
+ });
1576
+ return await this.program.rpc.requestRemoveInsuranceFundStake(bankIndex, amount, {
1577
+ accounts: {
1578
+ state: await this.getStatePublicKey(),
1579
+ bank: bank.pubkey,
1580
+ insuranceFundStake: ifStakeAccountPublicKey,
1581
+ userStats: this.getUserStatsAccountPublicKey(),
1582
+ authority: this.wallet.publicKey,
1583
+ insuranceFundVault: bank.insuranceFundVault,
1584
+ // userTokenAccount: collateralAccountPublicKey,
1585
+ // tokenProgram: TOKEN_PROGRAM_ID,
1586
+ },
1587
+ remainingAccounts,
1588
+ });
1589
+ }
1590
+ async cancelRequestRemoveInsuranceFundStake(bankIndex) {
1591
+ const bank = this.getBankAccount(bankIndex);
1592
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, bankIndex);
1593
+ const remainingAccounts = this.getRemainingAccounts({
1594
+ writableBankIndex: bankIndex,
1595
+ });
1596
+ return await this.program.rpc.cancelRequestRemoveInsuranceFundStake(bankIndex, {
1597
+ accounts: {
1598
+ state: await this.getStatePublicKey(),
1599
+ bank: bank.pubkey,
1600
+ insuranceFundStake: ifStakeAccountPublicKey,
1601
+ userStats: this.getUserStatsAccountPublicKey(),
1602
+ authority: this.wallet.publicKey,
1603
+ insuranceFundVault: bank.insuranceFundVault,
1604
+ // userTokenAccount: collateralAccountPublicKey,
1605
+ // tokenProgram: TOKEN_PROGRAM_ID,
1606
+ },
1607
+ remainingAccounts,
1608
+ });
1609
+ }
1610
+ async removeInsuranceFundStake(bankIndex, collateralAccountPublicKey) {
1611
+ const bank = this.getBankAccount(bankIndex);
1612
+ const ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, bankIndex);
1613
+ const remainingAccounts = this.getRemainingAccounts({
1614
+ writableBankIndex: bankIndex,
1615
+ });
1616
+ return await this.program.rpc.removeInsuranceFundStake(bankIndex, {
1617
+ accounts: {
1618
+ state: await this.getStatePublicKey(),
1619
+ bank: bank.pubkey,
1620
+ insuranceFundStake: ifStakeAccountPublicKey,
1621
+ userStats: this.getUserStatsAccountPublicKey(),
1622
+ authority: this.wallet.publicKey,
1623
+ insuranceFundVault: bank.insuranceFundVault,
1624
+ insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
1625
+ userTokenAccount: collateralAccountPublicKey,
1626
+ tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
1627
+ },
1628
+ remainingAccounts,
1629
+ });
1630
+ }
1631
+ async settleRevenueToInsuranceFund(bankIndex) {
1632
+ const bank = this.getBankAccount(bankIndex);
1633
+ const remainingAccounts = this.getRemainingAccounts({
1634
+ writableBankIndex: bankIndex,
1635
+ });
1636
+ return await this.program.rpc.settleRevenueToInsuranceFund(bankIndex, {
1637
+ accounts: {
1638
+ state: await this.getStatePublicKey(),
1639
+ bank: bank.pubkey,
1640
+ bankVault: bank.vault,
1641
+ bankVaultAuthority: bank.vaultAuthority,
1642
+ insuranceFundVault: bank.insuranceFundVault,
1643
+ tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
1644
+ },
1645
+ remainingAccounts,
1646
+ });
1647
+ }
1520
1648
  }
1521
1649
  exports.ClearingHouse = ClearingHouse;
@@ -363,7 +363,7 @@ class ClearingHouseUser {
363
363
  getTotalPositionValue() {
364
364
  return this.getUserAccount().positions.reduce((positionValue, marketPosition) => {
365
365
  const market = this.clearingHouse.getMarketAccount(marketPosition.marketIndex);
366
- const posVal = (0, margin_1.calculateMarginBaseAssetValue)(market, marketPosition, this.getOracleDataForMarket(market.marketIndex));
366
+ const posVal = (0, margin_1.calculateBaseAssetValueWithOracle)(market, marketPosition, this.getOracleDataForMarket(market.marketIndex));
367
367
  return positionValue.add(posVal);
368
368
  }, numericConstants_1.ZERO);
369
369
  }
@@ -374,7 +374,7 @@ class ClearingHouseUser {
374
374
  getPositionValue(marketIndex, oraclePriceData) {
375
375
  const userPosition = this.getUserPosition(marketIndex) || this.getEmptyPosition(marketIndex);
376
376
  const market = this.clearingHouse.getMarketAccount(userPosition.marketIndex);
377
- return (0, margin_1.calculateMarginBaseAssetValue)(market, userPosition, oraclePriceData);
377
+ return (0, margin_1.calculateBaseAssetValueWithOracle)(market, userPosition, oraclePriceData);
378
378
  }
379
379
  getPositionSide(currentPosition) {
380
380
  if (currentPosition.baseAssetAmount.gt(numericConstants_1.ZERO)) {
@@ -411,7 +411,7 @@ class ClearingHouseUser {
411
411
  baseAssetValue = (0, _1.calculateBaseAssetValue)(market, position, oraclePriceData);
412
412
  }
413
413
  else {
414
- baseAssetValue = (0, margin_1.calculateMarginBaseAssetValue)(market, position, oraclePriceData);
414
+ baseAssetValue = (0, margin_1.calculateBaseAssetValueWithOracle)(market, position, oraclePriceData);
415
415
  }
416
416
  if (position.baseAssetAmount.eq(numericConstants_1.ZERO)) {
417
417
  return [numericConstants_1.ZERO, numericConstants_1.ZERO];
@@ -533,13 +533,13 @@ class ClearingHouseUser {
533
533
  if (proposedBaseAssetAmount.eq(numericConstants_1.ZERO))
534
534
  return new _1.BN(-1);
535
535
  const market = this.clearingHouse.getMarketAccount(proposedMarketPosition.marketIndex);
536
- const proposedMarketPositionValue = (0, margin_1.calculateMarginBaseAssetValue)(market, proposedMarketPosition, this.getOracleDataForMarket(market.marketIndex));
536
+ const proposedMarketPositionValue = (0, margin_1.calculateBaseAssetValueWithOracle)(market, proposedMarketPosition, this.getOracleDataForMarket(market.marketIndex));
537
537
  // total position value after trade
538
538
  const totalPositionValueAfterTrade = totalPositionValueExcludingTargetMarket.add(proposedMarketPositionValue);
539
539
  const marginRequirementExcludingTargetMarket = this.getUserAccount().positions.reduce((totalMarginRequirement, position) => {
540
540
  if (!position.marketIndex.eq(marketPosition.marketIndex)) {
541
541
  const market = this.clearingHouse.getMarketAccount(position.marketIndex);
542
- const positionValue = (0, margin_1.calculateMarginBaseAssetValue)(market, position, this.getOracleDataForMarket(market.marketIndex));
542
+ const positionValue = (0, margin_1.calculateBaseAssetValueWithOracle)(market, position, this.getOracleDataForMarket(market.marketIndex));
543
543
  const marketMarginRequirement = positionValue
544
544
  .mul(new _1.BN((0, _1.calculateMarketMarginRatio)(market, position.baseAssetAmount.abs(), 'Maintenance')))
545
545
  .div(numericConstants_1.MARGIN_PRECISION);
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: '65sz7dRiWDRPZjiRxcTxPM7AE6VK4Nag9HEK6oBJXhJn',
10
+ CLEARING_HOUSE_PROGRAM_ID: 'HbUKwqFPjz9r7ZtT416AU8aaecDQMKKiDCTS3AdXnS6c',
11
11
  USDC_MINT_ADDRESS: '8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2',
12
12
  MARKETS: markets_1.DevnetMarkets,
13
13
  BANKS: banks_1.DevnetBanks,
@@ -7,6 +7,8 @@ export declare type BankConfig = {
7
7
  oracle: PublicKey;
8
8
  mint: PublicKey;
9
9
  oracleSource: OracleSource;
10
+ precision: BN;
11
+ precisionExp: BN;
10
12
  };
11
13
  export declare const WRAPPED_SOL_MINT: PublicKey;
12
14
  export declare const DevnetBanks: BankConfig[];
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Banks = exports.MainnetBanks = exports.DevnetBanks = exports.WRAPPED_SOL_MINT = void 0;
4
4
  const web3_js_1 = require("@solana/web3.js");
5
5
  const __1 = require("../");
6
+ const numericConstants_1 = require("./numericConstants");
6
7
  exports.WRAPPED_SOL_MINT = new web3_js_1.PublicKey('So11111111111111111111111111111111111111112');
7
8
  exports.DevnetBanks = [
8
9
  {
@@ -11,6 +12,8 @@ exports.DevnetBanks = [
11
12
  oracle: web3_js_1.PublicKey.default,
12
13
  oracleSource: __1.OracleSource.QUOTE_ASSET,
13
14
  mint: new web3_js_1.PublicKey('8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2'),
15
+ precision: numericConstants_1.BANK_BALANCE_PRECISION,
16
+ precisionExp: numericConstants_1.BANK_BALANCE_PRECISION_EXP,
14
17
  },
15
18
  {
16
19
  symbol: 'SOL',
@@ -18,6 +21,8 @@ exports.DevnetBanks = [
18
21
  oracle: new web3_js_1.PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
19
22
  oracleSource: __1.OracleSource.PYTH,
20
23
  mint: new web3_js_1.PublicKey(exports.WRAPPED_SOL_MINT),
24
+ precision: numericConstants_1.LAMPORTS_PRECISION,
25
+ precisionExp: numericConstants_1.LAMPORTS_EXP,
21
26
  },
22
27
  {
23
28
  symbol: 'BTC',
@@ -25,6 +30,8 @@ exports.DevnetBanks = [
25
30
  oracle: new web3_js_1.PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
26
31
  oracleSource: __1.OracleSource.PYTH,
27
32
  mint: new web3_js_1.PublicKey('3BZPwbcqB5kKScF3TEXxwNfx5ipV13kbRVDvfVp5c6fv'),
33
+ precision: numericConstants_1.BANK_BALANCE_PRECISION,
34
+ precisionExp: numericConstants_1.BANK_BALANCE_PRECISION_EXP,
28
35
  },
29
36
  ];
30
37
  exports.MainnetBanks = [
@@ -34,6 +41,8 @@ exports.MainnetBanks = [
34
41
  oracle: web3_js_1.PublicKey.default,
35
42
  oracleSource: __1.OracleSource.QUOTE_ASSET,
36
43
  mint: new web3_js_1.PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
44
+ precision: numericConstants_1.BANK_BALANCE_PRECISION,
45
+ precisionExp: numericConstants_1.BANK_BALANCE_PRECISION_EXP,
37
46
  },
38
47
  ];
39
48
  exports.Banks = {
@@ -41,3 +41,5 @@ export declare const MARGIN_PRECISION: BN;
41
41
  export declare const BID_ASK_SPREAD_PRECISION: BN;
42
42
  export declare const ONE_YEAR: BN;
43
43
  export declare const QUOTE_ASSET_BANK_INDEX: BN;
44
+ export declare const LAMPORTS_PRECISION: BN;
45
+ export declare const LAMPORTS_EXP: BN;
@@ -1,6 +1,7 @@
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.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.LIQUIDATION_FEE_PRECISION = exports.BANK_IMF_PRECISION = exports.BANK_IMF_PRECISION_EXP = 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_CUMULATIVE_INTEREST_PRECISION_EXP = exports.BANK_INTEREST_PRECISION = exports.BANK_INTEREST_PRECISION_EXP = 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.LAMPORTS_EXP = exports.LAMPORTS_PRECISION = 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.LIQUIDATION_FEE_PRECISION = exports.BANK_IMF_PRECISION = exports.BANK_IMF_PRECISION_EXP = 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_CUMULATIVE_INTEREST_PRECISION_EXP = exports.BANK_INTEREST_PRECISION = exports.BANK_INTEREST_PRECISION_EXP = 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
+ const web3_js_1 = require("@solana/web3.js");
4
5
  const __1 = require("../");
5
6
  exports.ZERO = new __1.BN(0);
6
7
  exports.ONE = new __1.BN(1);
@@ -43,3 +44,5 @@ exports.MARGIN_PRECISION = exports.TEN_THOUSAND;
43
44
  exports.BID_ASK_SPREAD_PRECISION = new __1.BN(1000000);
44
45
  exports.ONE_YEAR = new __1.BN(31536000);
45
46
  exports.QUOTE_ASSET_BANK_INDEX = new __1.BN(0);
47
+ exports.LAMPORTS_PRECISION = new __1.BN(web3_js_1.LAMPORTS_PER_SOL);
48
+ exports.LAMPORTS_EXP = new __1.BN(Math.log10(web3_js_1.LAMPORTS_PER_SOL));
@@ -11,17 +11,14 @@ function clientSortDescFn() {
11
11
  function defaultBlockchainSortFn(currentEvent, newEvent) {
12
12
  return currentEvent.slot <= newEvent.slot ? 'less than' : 'greater than';
13
13
  }
14
- function orderRecordSortFn(currentEvent, newEvent) {
15
- const currentEventMarketIndex = !currentEvent.maker.equals(index_1.PublicKey.default)
16
- ? currentEvent.makerOrder.marketIndex
17
- : currentEvent.takerOrder.marketIndex;
18
- const newEventMarketIndex = !newEvent.maker.equals(index_1.PublicKey.default)
19
- ? newEvent.makerOrder.marketIndex
20
- : newEvent.takerOrder.marketIndex;
14
+ function orderActionRecordSortFn(currentEvent, newEvent) {
15
+ var _a, _b;
16
+ const currentEventMarketIndex = currentEvent.marketIndex;
17
+ const newEventMarketIndex = newEvent.marketIndex;
21
18
  if (!currentEventMarketIndex.eq(newEventMarketIndex)) {
22
19
  return currentEvent.ts.lte(newEvent.ts) ? 'less than' : 'greater than';
23
20
  }
24
- if (currentEvent.fillRecordId.gt(index_1.ZERO) && newEvent.fillRecordId.gt(index_1.ZERO)) {
21
+ if (((_a = currentEvent.fillRecordId) === null || _a === void 0 ? void 0 : _a.gt(index_1.ZERO)) && ((_b = newEvent.fillRecordId) === null || _b === void 0 ? void 0 : _b.gt(index_1.ZERO))) {
25
22
  return currentEvent.fillRecordId.lte(newEvent.fillRecordId)
26
23
  ? 'less than'
27
24
  : 'greater than';
@@ -35,8 +32,8 @@ function getSortFn(orderBy, orderDir, eventType) {
35
32
  return orderDir === 'asc' ? clientSortAscFn : clientSortDescFn;
36
33
  }
37
34
  switch (eventType) {
38
- case 'OrderRecord':
39
- return orderRecordSortFn;
35
+ case 'OrderActionRecord':
36
+ return orderActionRecordSortFn;
40
37
  default:
41
38
  return defaultBlockchainSortFn;
42
39
  }
@@ -1,5 +1,5 @@
1
1
  import { Commitment, TransactionSignature } from '@solana/web3.js';
2
- import { DepositRecord, FundingPaymentRecord, FundingRateRecord, LiquidationRecord, NewUserRecord, OrderRecord, SettlePnlRecord } from '../index';
2
+ import { DepositRecord, FundingPaymentRecord, FundingRateRecord, LiquidationRecord, NewUserRecord, OrderActionRecord, OrderRecord, SettlePnlRecord } from '../index';
3
3
  export declare type EventSubscriptionOptions = {
4
4
  eventTypes?: EventType[];
5
5
  maxEventsPerType?: number;
@@ -27,6 +27,7 @@ export declare type EventMap = {
27
27
  LiquidationRecord: Event<LiquidationRecord>;
28
28
  FundingRateRecord: Event<FundingRateRecord>;
29
29
  OrderRecord: Event<OrderRecord>;
30
+ OrderActionRecord: Event<OrderActionRecord>;
30
31
  SettlePnlRecord: Event<SettlePnlRecord>;
31
32
  NewUserRecord: Event<NewUserRecord>;
32
33
  };
@@ -7,6 +7,7 @@ exports.DefaultEventSubscriptionOptions = {
7
7
  'FundingPaymentRecord',
8
8
  'LiquidationRecord',
9
9
  'OrderRecord',
10
+ 'OrderActionRecord',
10
11
  'FundingRateRecord',
11
12
  'NewUserRecord',
12
13
  'SettlePnlRecord',