@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
@@ -40,6 +40,7 @@ import { EventEmitter } from 'events';
40
40
  import StrictEventEmitter from 'strict-event-emitter-types';
41
41
  import {
42
42
  getClearingHouseStateAccountPublicKey,
43
+ getInsuranceFundStakeAccountPublicKey,
43
44
  getMarketPublicKey,
44
45
  getUserAccountPublicKey,
45
46
  getUserAccountPublicKeySync,
@@ -2175,6 +2176,7 @@ export class ClearingHouse {
2175
2176
  public async resolvePerpBankruptcy(
2176
2177
  userAccountPublicKey: PublicKey,
2177
2178
  userAccount: UserAccount,
2179
+ bankIndex: BN,
2178
2180
  marketIndex: BN
2179
2181
  ): Promise<TransactionSignature> {
2180
2182
  const { txSig } = await this.txSender.send(
@@ -2182,6 +2184,7 @@ export class ClearingHouse {
2182
2184
  await this.getResolvePerpBankruptcyIx(
2183
2185
  userAccountPublicKey,
2184
2186
  userAccount,
2187
+ bankIndex,
2185
2188
  marketIndex
2186
2189
  )
2187
2190
  ),
@@ -2194,24 +2197,36 @@ export class ClearingHouse {
2194
2197
  public async getResolvePerpBankruptcyIx(
2195
2198
  userAccountPublicKey: PublicKey,
2196
2199
  userAccount: UserAccount,
2200
+ bankIndex: BN,
2197
2201
  marketIndex: BN
2198
2202
  ): Promise<TransactionInstruction> {
2199
2203
  const liquidatorPublicKey = await this.getUserAccountPublicKey();
2200
2204
 
2201
2205
  const remainingAccounts = this.getRemainingAccountsWithCounterparty({
2202
2206
  writableMarketIndex: marketIndex,
2207
+ writableBankIndexes: [bankIndex],
2203
2208
  counterPartyUserAccount: userAccount,
2204
2209
  });
2205
2210
 
2206
- return await this.program.instruction.resolvePerpBankruptcy(marketIndex, {
2207
- accounts: {
2208
- state: await this.getStatePublicKey(),
2209
- authority: this.wallet.publicKey,
2210
- user: userAccountPublicKey,
2211
- liquidator: liquidatorPublicKey,
2212
- },
2213
- remainingAccounts: remainingAccounts,
2214
- });
2211
+ const bank = this.getBankAccount(bankIndex);
2212
+
2213
+ return await this.program.instruction.resolvePerpBankruptcy(
2214
+ bankIndex,
2215
+ marketIndex,
2216
+ {
2217
+ accounts: {
2218
+ state: await this.getStatePublicKey(),
2219
+ authority: this.wallet.publicKey,
2220
+ user: userAccountPublicKey,
2221
+ liquidator: liquidatorPublicKey,
2222
+ bankVault: bank.vault,
2223
+ insuranceFundVault: bank.insuranceFundVault,
2224
+ insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
2225
+ tokenProgram: TOKEN_PROGRAM_ID,
2226
+ },
2227
+ remainingAccounts: remainingAccounts,
2228
+ }
2229
+ );
2215
2230
  }
2216
2231
 
2217
2232
  public async resolveBorrowBankruptcy(
@@ -2245,12 +2260,18 @@ export class ClearingHouse {
2245
2260
  counterPartyUserAccount: userAccount,
2246
2261
  });
2247
2262
 
2263
+ const bank = this.getBankAccount(bankIndex);
2264
+
2248
2265
  return await this.program.instruction.resolveBorrowBankruptcy(bankIndex, {
2249
2266
  accounts: {
2250
2267
  state: await this.getStatePublicKey(),
2251
2268
  authority: this.wallet.publicKey,
2252
2269
  user: userAccountPublicKey,
2253
2270
  liquidator: liquidatorPublicKey,
2271
+ bankVault: bank.vault,
2272
+ insuranceFundVault: bank.insuranceFundVault,
2273
+ insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
2274
+ tokenProgram: TOKEN_PROGRAM_ID,
2254
2275
  },
2255
2276
  remainingAccounts: remainingAccounts,
2256
2277
  });
@@ -2480,4 +2501,191 @@ export class ClearingHouse {
2480
2501
 
2481
2502
  return oracleData;
2482
2503
  }
2504
+
2505
+ public async initializeInsuranceFundStake(
2506
+ bankIndex: BN
2507
+ ): Promise<TransactionSignature> {
2508
+ const { txSig } = await this.txSender.send(
2509
+ wrapInTx(await this.getInitializeInsuranceFundStakeIx(bankIndex)),
2510
+ [],
2511
+ this.opts
2512
+ );
2513
+ return txSig;
2514
+ }
2515
+
2516
+ public async getInitializeInsuranceFundStakeIx(
2517
+ bankIndex: BN
2518
+ ): Promise<TransactionInstruction> {
2519
+ const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
2520
+ this.program.programId,
2521
+ this.wallet.publicKey,
2522
+ bankIndex
2523
+ );
2524
+
2525
+ return await this.program.instruction.initializeInsuranceFundStake(
2526
+ bankIndex,
2527
+ {
2528
+ accounts: {
2529
+ insuranceFundStake: ifStakeAccountPublicKey,
2530
+ bank: this.getBankAccount(bankIndex).pubkey,
2531
+ userStats: this.getUserStatsAccountPublicKey(),
2532
+ authority: this.wallet.publicKey,
2533
+ payer: this.wallet.publicKey,
2534
+ rent: anchor.web3.SYSVAR_RENT_PUBKEY,
2535
+ systemProgram: anchor.web3.SystemProgram.programId,
2536
+ state: await this.getStatePublicKey(),
2537
+ },
2538
+ }
2539
+ );
2540
+ }
2541
+
2542
+ public async addInsuranceFundStake(
2543
+ bankIndex: BN,
2544
+ amount: BN,
2545
+ collateralAccountPublicKey: PublicKey
2546
+ ): Promise<TransactionSignature> {
2547
+ const bank = this.getBankAccount(bankIndex);
2548
+ const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
2549
+ this.program.programId,
2550
+ this.wallet.publicKey,
2551
+ bankIndex
2552
+ );
2553
+
2554
+ const remainingAccounts = this.getRemainingAccounts({
2555
+ writableBankIndex: bankIndex,
2556
+ });
2557
+
2558
+ return await this.program.rpc.addInsuranceFundStake(bankIndex, amount, {
2559
+ accounts: {
2560
+ state: await this.getStatePublicKey(),
2561
+ bank: bank.pubkey,
2562
+ insuranceFundStake: ifStakeAccountPublicKey,
2563
+ userStats: this.getUserStatsAccountPublicKey(),
2564
+ authority: this.wallet.publicKey,
2565
+ insuranceFundVault: bank.insuranceFundVault,
2566
+ userTokenAccount: collateralAccountPublicKey,
2567
+ tokenProgram: TOKEN_PROGRAM_ID,
2568
+ },
2569
+ remainingAccounts,
2570
+ });
2571
+ }
2572
+
2573
+ public async requestRemoveInsuranceFundStake(
2574
+ bankIndex: BN,
2575
+ amount: BN
2576
+ ): Promise<TransactionSignature> {
2577
+ const bank = this.getBankAccount(bankIndex);
2578
+ const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
2579
+ this.program.programId,
2580
+ this.wallet.publicKey,
2581
+ bankIndex
2582
+ );
2583
+
2584
+ const remainingAccounts = this.getRemainingAccounts({
2585
+ writableBankIndex: bankIndex,
2586
+ });
2587
+
2588
+ return await this.program.rpc.requestRemoveInsuranceFundStake(
2589
+ bankIndex,
2590
+ amount,
2591
+ {
2592
+ accounts: {
2593
+ state: await this.getStatePublicKey(),
2594
+ bank: bank.pubkey,
2595
+ insuranceFundStake: ifStakeAccountPublicKey,
2596
+ userStats: this.getUserStatsAccountPublicKey(),
2597
+ authority: this.wallet.publicKey,
2598
+ insuranceFundVault: bank.insuranceFundVault,
2599
+ // userTokenAccount: collateralAccountPublicKey,
2600
+ // tokenProgram: TOKEN_PROGRAM_ID,
2601
+ },
2602
+ remainingAccounts,
2603
+ }
2604
+ );
2605
+ }
2606
+
2607
+ public async cancelRequestRemoveInsuranceFundStake(
2608
+ bankIndex: BN
2609
+ ): Promise<TransactionSignature> {
2610
+ const bank = this.getBankAccount(bankIndex);
2611
+ const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
2612
+ this.program.programId,
2613
+ this.wallet.publicKey,
2614
+ bankIndex
2615
+ );
2616
+
2617
+ const remainingAccounts = this.getRemainingAccounts({
2618
+ writableBankIndex: bankIndex,
2619
+ });
2620
+
2621
+ return await this.program.rpc.cancelRequestRemoveInsuranceFundStake(
2622
+ bankIndex,
2623
+ {
2624
+ accounts: {
2625
+ state: await this.getStatePublicKey(),
2626
+ bank: bank.pubkey,
2627
+ insuranceFundStake: ifStakeAccountPublicKey,
2628
+ userStats: this.getUserStatsAccountPublicKey(),
2629
+ authority: this.wallet.publicKey,
2630
+ insuranceFundVault: bank.insuranceFundVault,
2631
+ // userTokenAccount: collateralAccountPublicKey,
2632
+ // tokenProgram: TOKEN_PROGRAM_ID,
2633
+ },
2634
+ remainingAccounts,
2635
+ }
2636
+ );
2637
+ }
2638
+
2639
+ public async removeInsuranceFundStake(
2640
+ bankIndex: BN,
2641
+ collateralAccountPublicKey: PublicKey
2642
+ ): Promise<TransactionSignature> {
2643
+ const bank = this.getBankAccount(bankIndex);
2644
+ const ifStakeAccountPublicKey = getInsuranceFundStakeAccountPublicKey(
2645
+ this.program.programId,
2646
+ this.wallet.publicKey,
2647
+ bankIndex
2648
+ );
2649
+
2650
+ const remainingAccounts = this.getRemainingAccounts({
2651
+ writableBankIndex: bankIndex,
2652
+ });
2653
+
2654
+ return await this.program.rpc.removeInsuranceFundStake(bankIndex, {
2655
+ accounts: {
2656
+ state: await this.getStatePublicKey(),
2657
+ bank: bank.pubkey,
2658
+ insuranceFundStake: ifStakeAccountPublicKey,
2659
+ userStats: this.getUserStatsAccountPublicKey(),
2660
+ authority: this.wallet.publicKey,
2661
+ insuranceFundVault: bank.insuranceFundVault,
2662
+ insuranceFundVaultAuthority: bank.insuranceFundVaultAuthority,
2663
+ userTokenAccount: collateralAccountPublicKey,
2664
+ tokenProgram: TOKEN_PROGRAM_ID,
2665
+ },
2666
+ remainingAccounts,
2667
+ });
2668
+ }
2669
+
2670
+ public async settleRevenueToInsuranceFund(
2671
+ bankIndex: BN
2672
+ ): Promise<TransactionSignature> {
2673
+ const bank = this.getBankAccount(bankIndex);
2674
+
2675
+ const remainingAccounts = this.getRemainingAccounts({
2676
+ writableBankIndex: bankIndex,
2677
+ });
2678
+
2679
+ return await this.program.rpc.settleRevenueToInsuranceFund(bankIndex, {
2680
+ accounts: {
2681
+ state: await this.getStatePublicKey(),
2682
+ bank: bank.pubkey,
2683
+ bankVault: bank.vault,
2684
+ bankVaultAuthority: bank.vaultAuthority,
2685
+ insuranceFundVault: bank.insuranceFundVault,
2686
+ tokenProgram: TOKEN_PROGRAM_ID,
2687
+ },
2688
+ remainingAccounts,
2689
+ });
2690
+ }
2483
2691
  }
@@ -46,7 +46,7 @@ import {
46
46
  calculateLiabilityWeight,
47
47
  } from './math/bankBalance';
48
48
  import {
49
- calculateMarginBaseAssetValue,
49
+ calculateBaseAssetValueWithOracle,
50
50
  calculateWorstCaseBaseAssetAmount,
51
51
  } from './math/margin';
52
52
  import { OraclePriceData } from './oracles/types';
@@ -568,7 +568,7 @@ export class ClearingHouseUser {
568
568
  const market = this.clearingHouse.getMarketAccount(
569
569
  marketPosition.marketIndex
570
570
  );
571
- const posVal = calculateMarginBaseAssetValue(
571
+ const posVal = calculateBaseAssetValueWithOracle(
572
572
  market,
573
573
  marketPosition,
574
574
  this.getOracleDataForMarket(market.marketIndex)
@@ -593,7 +593,11 @@ export class ClearingHouseUser {
593
593
  const market = this.clearingHouse.getMarketAccount(
594
594
  userPosition.marketIndex
595
595
  );
596
- return calculateMarginBaseAssetValue(market, userPosition, oraclePriceData);
596
+ return calculateBaseAssetValueWithOracle(
597
+ market,
598
+ userPosition,
599
+ oraclePriceData
600
+ );
597
601
  }
598
602
 
599
603
  public getPositionSide(
@@ -644,7 +648,7 @@ export class ClearingHouseUser {
644
648
  oraclePriceData
645
649
  );
646
650
  } else {
647
- baseAssetValue = calculateMarginBaseAssetValue(
651
+ baseAssetValue = calculateBaseAssetValueWithOracle(
648
652
  market,
649
653
  position,
650
654
  oraclePriceData
@@ -818,7 +822,7 @@ export class ClearingHouseUser {
818
822
  proposedMarketPosition.marketIndex
819
823
  );
820
824
 
821
- const proposedMarketPositionValue = calculateMarginBaseAssetValue(
825
+ const proposedMarketPositionValue = calculateBaseAssetValueWithOracle(
822
826
  market,
823
827
  proposedMarketPosition,
824
828
  this.getOracleDataForMarket(market.marketIndex)
@@ -835,7 +839,7 @@ export class ClearingHouseUser {
835
839
  const market = this.clearingHouse.getMarketAccount(
836
840
  position.marketIndex
837
841
  );
838
- const positionValue = calculateMarginBaseAssetValue(
842
+ const positionValue = calculateBaseAssetValueWithOracle(
839
843
  market,
840
844
  position,
841
845
  this.getOracleDataForMarket(market.marketIndex)
package/src/config.ts CHANGED
@@ -28,7 +28,7 @@ export const configs: { [key in DriftEnv]: DriftConfig } = {
28
28
  devnet: {
29
29
  ENV: 'devnet',
30
30
  PYTH_ORACLE_MAPPING_ADDRESS: 'BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2',
31
- CLEARING_HOUSE_PROGRAM_ID: '65sz7dRiWDRPZjiRxcTxPM7AE6VK4Nag9HEK6oBJXhJn',
31
+ CLEARING_HOUSE_PROGRAM_ID: 'HbUKwqFPjz9r7ZtT416AU8aaecDQMKKiDCTS3AdXnS6c',
32
32
  USDC_MINT_ADDRESS: '8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2',
33
33
  MARKETS: DevnetMarkets,
34
34
  BANKS: DevnetBanks,
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Banks = exports.MainnetBanks = exports.DevnetBanks = exports.WRAPPED_SOL_MINT = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ const __1 = require("../");
6
+ exports.WRAPPED_SOL_MINT = new web3_js_1.PublicKey('So11111111111111111111111111111111111111112');
7
+ exports.DevnetBanks = [
8
+ {
9
+ symbol: 'USDC',
10
+ bankIndex: new __1.BN(0),
11
+ oracle: web3_js_1.PublicKey.default,
12
+ oracleSource: __1.OracleSource.QUOTE_ASSET,
13
+ mint: new web3_js_1.PublicKey('8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2'),
14
+ },
15
+ {
16
+ symbol: 'SOL',
17
+ bankIndex: new __1.BN(1),
18
+ oracle: new web3_js_1.PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
19
+ oracleSource: __1.OracleSource.PYTH,
20
+ mint: new web3_js_1.PublicKey(exports.WRAPPED_SOL_MINT),
21
+ },
22
+ {
23
+ symbol: 'BTC',
24
+ bankIndex: new __1.BN(2),
25
+ oracle: new web3_js_1.PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
26
+ oracleSource: __1.OracleSource.PYTH,
27
+ mint: new web3_js_1.PublicKey('3BZPwbcqB5kKScF3TEXxwNfx5ipV13kbRVDvfVp5c6fv'),
28
+ },
29
+ ];
30
+ exports.MainnetBanks = [
31
+ {
32
+ symbol: 'USDC',
33
+ bankIndex: new __1.BN(0),
34
+ oracle: web3_js_1.PublicKey.default,
35
+ oracleSource: __1.OracleSource.QUOTE_ASSET,
36
+ mint: new web3_js_1.PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
37
+ },
38
+ ];
39
+ exports.Banks = {
40
+ devnet: exports.DevnetBanks,
41
+ 'mainnet-beta': exports.MainnetBanks,
42
+ };
@@ -1,5 +1,11 @@
1
1
  import { PublicKey } from '@solana/web3.js';
2
2
  import { BN, DriftEnv, OracleSource } from '../';
3
+ import {
4
+ BANK_BALANCE_PRECISION,
5
+ BANK_BALANCE_PRECISION_EXP,
6
+ LAMPORTS_EXP,
7
+ LAMPORTS_PRECISION,
8
+ } from './numericConstants';
3
9
 
4
10
  export type BankConfig = {
5
11
  symbol: string;
@@ -7,6 +13,8 @@ export type BankConfig = {
7
13
  oracle: PublicKey;
8
14
  mint: PublicKey;
9
15
  oracleSource: OracleSource;
16
+ precision: BN;
17
+ precisionExp: BN;
10
18
  };
11
19
 
12
20
  export const WRAPPED_SOL_MINT = new PublicKey(
@@ -20,6 +28,8 @@ export const DevnetBanks: BankConfig[] = [
20
28
  oracle: PublicKey.default,
21
29
  oracleSource: OracleSource.QUOTE_ASSET,
22
30
  mint: new PublicKey('8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2'),
31
+ precision: BANK_BALANCE_PRECISION,
32
+ precisionExp: BANK_BALANCE_PRECISION_EXP,
23
33
  },
24
34
  {
25
35
  symbol: 'SOL',
@@ -27,6 +37,8 @@ export const DevnetBanks: BankConfig[] = [
27
37
  oracle: new PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
28
38
  oracleSource: OracleSource.PYTH,
29
39
  mint: new PublicKey(WRAPPED_SOL_MINT),
40
+ precision: LAMPORTS_PRECISION,
41
+ precisionExp: LAMPORTS_EXP,
30
42
  },
31
43
  {
32
44
  symbol: 'BTC',
@@ -34,6 +46,8 @@ export const DevnetBanks: BankConfig[] = [
34
46
  oracle: new PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
35
47
  oracleSource: OracleSource.PYTH,
36
48
  mint: new PublicKey('3BZPwbcqB5kKScF3TEXxwNfx5ipV13kbRVDvfVp5c6fv'),
49
+ precision: BANK_BALANCE_PRECISION,
50
+ precisionExp: BANK_BALANCE_PRECISION_EXP,
37
51
  },
38
52
  ];
39
53
 
@@ -44,6 +58,8 @@ export const MainnetBanks: BankConfig[] = [
44
58
  oracle: PublicKey.default,
45
59
  oracleSource: OracleSource.QUOTE_ASSET,
46
60
  mint: new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'),
61
+ precision: BANK_BALANCE_PRECISION,
62
+ precisionExp: BANK_BALANCE_PRECISION_EXP,
47
63
  },
48
64
  ];
49
65
 
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Markets = exports.MainnetMarkets = exports.DevnetMarkets = void 0;
4
+ const __1 = require("../");
5
+ const web3_js_1 = require("@solana/web3.js");
6
+ exports.DevnetMarkets = [
7
+ {
8
+ fullName: 'Solana',
9
+ category: ['L1', 'Infra'],
10
+ symbol: 'SOL-PERP',
11
+ baseAssetSymbol: 'SOL',
12
+ marketIndex: new __1.BN(0),
13
+ oracle: new web3_js_1.PublicKey('J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix'),
14
+ launchTs: 1655751353000,
15
+ oracleSource: __1.OracleSource.PYTH,
16
+ },
17
+ {
18
+ fullName: 'Bitcoin',
19
+ category: ['L1', 'Payment'],
20
+ symbol: 'BTC-PERP',
21
+ baseAssetSymbol: 'BTC',
22
+ marketIndex: new __1.BN(1),
23
+ oracle: new web3_js_1.PublicKey('HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J'),
24
+ launchTs: 1655751353000,
25
+ oracleSource: __1.OracleSource.PYTH,
26
+ },
27
+ {
28
+ fullName: 'Ethereum',
29
+ category: ['L1', 'Infra'],
30
+ symbol: 'ETH-PERP',
31
+ baseAssetSymbol: 'ETH',
32
+ marketIndex: new __1.BN(2),
33
+ oracle: new web3_js_1.PublicKey('EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw'),
34
+ launchTs: 1637691133472,
35
+ oracleSource: __1.OracleSource.PYTH,
36
+ },
37
+ ];
38
+ exports.MainnetMarkets = [];
39
+ exports.Markets = {
40
+ devnet: exports.DevnetMarkets,
41
+ 'mainnet-beta': [],
42
+ };
@@ -0,0 +1,41 @@
1
+ "use strict";
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_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
+ const __1 = require("../");
5
+ exports.ZERO = new __1.BN(0);
6
+ exports.ONE = new __1.BN(1);
7
+ exports.TWO = new __1.BN(2);
8
+ exports.TEN = new __1.BN(10);
9
+ exports.TEN_THOUSAND = new __1.BN(10000);
10
+ exports.BN_MAX = new __1.BN(Number.MAX_SAFE_INTEGER);
11
+ exports.TEN_MILLION = exports.TEN_THOUSAND.mul(exports.TEN_THOUSAND);
12
+ exports.MAX_LEVERAGE = new __1.BN(5);
13
+ exports.QUOTE_PRECISION_EXP = new __1.BN(6);
14
+ exports.FUNDING_PAYMENT_PRECISION_EXP = new __1.BN(4);
15
+ exports.MARK_PRICE_PRECISION_EXP = new __1.BN(10);
16
+ exports.FUNDING_RATE_PRECISION_EXP = exports.MARK_PRICE_PRECISION_EXP.mul(exports.FUNDING_PAYMENT_PRECISION_EXP);
17
+ exports.PEG_PRECISION_EXP = new __1.BN(3);
18
+ exports.AMM_RESERVE_PRECISION_EXP = new __1.BN(13);
19
+ exports.BANK_INTEREST_PRECISION = new __1.BN(1000000);
20
+ exports.BANK_CUMULATIVE_INTEREST_PRECISION = new __1.BN(10000000000);
21
+ exports.BANK_UTILIZATION_PRECISION = new __1.BN(1000000);
22
+ exports.BANK_RATE_PRECISION = new __1.BN(1000000);
23
+ exports.BANK_WEIGHT_PRECISION = new __1.BN(100);
24
+ exports.BANK_BALANCE_PRECISION_EXP = new __1.BN(6);
25
+ exports.BANK_BALANCE_PRECISION = new __1.BN(10).pow(exports.BANK_BALANCE_PRECISION_EXP);
26
+ exports.LIQUIDATION_FEE_PRECISION = new __1.BN(1000000);
27
+ exports.QUOTE_PRECISION = new __1.BN(10).pow(exports.QUOTE_PRECISION_EXP);
28
+ exports.MARK_PRICE_PRECISION = new __1.BN(10).pow(exports.MARK_PRICE_PRECISION_EXP);
29
+ exports.FUNDING_PAYMENT_PRECISION = new __1.BN(10).pow(exports.FUNDING_PAYMENT_PRECISION_EXP);
30
+ exports.PEG_PRECISION = new __1.BN(10).pow(exports.PEG_PRECISION_EXP);
31
+ exports.AMM_RESERVE_PRECISION = new __1.BN(10).pow(exports.AMM_RESERVE_PRECISION_EXP);
32
+ exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION;
33
+ exports.BASE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP;
34
+ exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.div(exports.QUOTE_PRECISION); // 10^7
35
+ exports.PRICE_DIV_PEG = exports.MARK_PRICE_PRECISION.div(exports.PEG_PRECISION); //10^7
36
+ exports.PRICE_TO_QUOTE_PRECISION = exports.MARK_PRICE_PRECISION.div(exports.QUOTE_PRECISION);
37
+ exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.mul(exports.PEG_PRECISION).div(exports.QUOTE_PRECISION); // 10^10
38
+ exports.MARGIN_PRECISION = exports.TEN_THOUSAND;
39
+ exports.BID_ASK_SPREAD_PRECISION = new __1.BN(1000000);
40
+ exports.ONE_YEAR = new __1.BN(31536000);
41
+ exports.QUOTE_ASSET_BANK_INDEX = new __1.BN(0);
@@ -1,3 +1,4 @@
1
+ import { LAMPORTS_PER_SOL } from '@solana/web3.js';
1
2
  import { BN } from '../';
2
3
 
3
4
  export const ZERO = new BN(0);
@@ -66,3 +67,6 @@ export const BID_ASK_SPREAD_PRECISION = new BN(1000000);
66
67
  export const ONE_YEAR = new BN(31536000);
67
68
 
68
69
  export const QUOTE_ASSET_BANK_INDEX = new BN(0);
70
+
71
+ export const LAMPORTS_PRECISION = new BN(LAMPORTS_PER_SOL);
72
+ export const LAMPORTS_EXP = new BN(Math.log10(LAMPORTS_PER_SOL));
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventList = void 0;
4
+ class Node {
5
+ constructor(event, next, prev) {
6
+ this.event = event;
7
+ this.next = next;
8
+ this.prev = prev;
9
+ }
10
+ }
11
+ class EventList {
12
+ constructor(eventType, maxSize, sortFn, orderDirection) {
13
+ this.eventType = eventType;
14
+ this.maxSize = maxSize;
15
+ this.sortFn = sortFn;
16
+ this.orderDirection = orderDirection;
17
+ this.size = 0;
18
+ }
19
+ insert(event) {
20
+ this.size++;
21
+ const newNode = new Node(event);
22
+ if (this.head === undefined) {
23
+ this.head = this.tail = newNode;
24
+ return;
25
+ }
26
+ if (this.sortFn(this.head.event, newNode.event) ===
27
+ (this.orderDirection === 'asc' ? 'less than' : 'greater than')) {
28
+ this.head.prev = newNode;
29
+ newNode.next = this.head;
30
+ this.head = newNode;
31
+ }
32
+ else {
33
+ let currentNode = this.head;
34
+ while (currentNode.next !== undefined &&
35
+ this.sortFn(currentNode.next.event, newNode.event) !==
36
+ (this.orderDirection === 'asc' ? 'less than' : 'greater than')) {
37
+ currentNode = currentNode.next;
38
+ }
39
+ newNode.next = currentNode.next;
40
+ if (currentNode.next !== undefined) {
41
+ newNode.next.prev = newNode;
42
+ }
43
+ currentNode.next = newNode;
44
+ newNode.prev = currentNode;
45
+ }
46
+ if (this.size > this.maxSize) {
47
+ this.detach();
48
+ }
49
+ }
50
+ detach() {
51
+ const node = this.tail;
52
+ if (node.prev !== undefined) {
53
+ node.prev.next = node.next;
54
+ }
55
+ else {
56
+ this.head = node.next;
57
+ }
58
+ if (node.next !== undefined) {
59
+ node.next.prev = node.prev;
60
+ }
61
+ else {
62
+ this.tail = node.prev;
63
+ }
64
+ this.size--;
65
+ }
66
+ toArray() {
67
+ return Array.from(this);
68
+ }
69
+ *[Symbol.iterator]() {
70
+ let node = this.head;
71
+ while (node) {
72
+ yield node.event;
73
+ node = node.next;
74
+ }
75
+ }
76
+ }
77
+ exports.EventList = EventList;
@@ -6,8 +6,8 @@ import {
6
6
  SortFn,
7
7
  Event,
8
8
  } from './types';
9
- import { OrderRecord } from '../types';
10
- import { PublicKey, ZERO } from '../index';
9
+ import { OrderActionRecord } from '../types';
10
+ import { ZERO } from '../index';
11
11
 
12
12
  function clientSortAscFn(): 'less than' {
13
13
  return 'less than';
@@ -24,21 +24,17 @@ function defaultBlockchainSortFn(
24
24
  return currentEvent.slot <= newEvent.slot ? 'less than' : 'greater than';
25
25
  }
26
26
 
27
- function orderRecordSortFn(
28
- currentEvent: Event<OrderRecord>,
29
- newEvent: Event<OrderRecord>
27
+ function orderActionRecordSortFn(
28
+ currentEvent: Event<OrderActionRecord>,
29
+ newEvent: Event<OrderActionRecord>
30
30
  ): 'less than' | 'greater than' {
31
- const currentEventMarketIndex = !currentEvent.maker.equals(PublicKey.default)
32
- ? currentEvent.makerOrder.marketIndex
33
- : currentEvent.takerOrder.marketIndex;
34
- const newEventMarketIndex = !newEvent.maker.equals(PublicKey.default)
35
- ? newEvent.makerOrder.marketIndex
36
- : newEvent.takerOrder.marketIndex;
31
+ const currentEventMarketIndex = currentEvent.marketIndex;
32
+ const newEventMarketIndex = newEvent.marketIndex;
37
33
  if (!currentEventMarketIndex.eq(newEventMarketIndex)) {
38
34
  return currentEvent.ts.lte(newEvent.ts) ? 'less than' : 'greater than';
39
35
  }
40
36
 
41
- if (currentEvent.fillRecordId.gt(ZERO) && newEvent.fillRecordId.gt(ZERO)) {
37
+ if (currentEvent.fillRecordId?.gt(ZERO) && newEvent.fillRecordId?.gt(ZERO)) {
42
38
  return currentEvent.fillRecordId.lte(newEvent.fillRecordId)
43
39
  ? 'less than'
44
40
  : 'greater than';
@@ -57,8 +53,8 @@ export function getSortFn(
57
53
  }
58
54
 
59
55
  switch (eventType) {
60
- case 'OrderRecord':
61
- return orderRecordSortFn;
56
+ case 'OrderActionRecord':
57
+ return orderActionRecordSortFn;
62
58
  default:
63
59
  return defaultBlockchainSortFn;
64
60
  }