@drift-labs/sdk 0.2.0-master.25 → 0.2.0-master.27

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 (124) hide show
  1. package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +14 -13
  2. package/lib/accounts/pollingClearingHouseAccountSubscriber.js +30 -27
  3. package/lib/accounts/types.d.ts +9 -9
  4. package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +15 -14
  5. package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +38 -34
  6. package/lib/addresses/pda.d.ts +7 -6
  7. package/lib/addresses/pda.js +31 -27
  8. package/lib/admin.d.ts +13 -7
  9. package/lib/admin.js +111 -44
  10. package/lib/clearingHouse.d.ts +71 -42
  11. package/lib/clearingHouse.js +767 -278
  12. package/lib/clearingHouseConfig.d.ts +2 -2
  13. package/lib/clearingHouseUser.d.ts +24 -22
  14. package/lib/clearingHouseUser.js +273 -177
  15. package/lib/config.d.ts +7 -7
  16. package/lib/config.js +21 -21
  17. package/lib/constants/numericConstants.d.ts +12 -12
  18. package/lib/constants/numericConstants.js +13 -13
  19. package/lib/constants/{markets.d.ts → perpMarkets.d.ts} +5 -5
  20. package/lib/constants/{markets.js → perpMarkets.js} +4 -4
  21. package/lib/constants/{banks.d.ts → spotMarkets.d.ts} +6 -6
  22. package/lib/constants/{banks.js → spotMarkets.js} +16 -16
  23. package/lib/dlob/DLOB.d.ts +73 -0
  24. package/lib/dlob/DLOB.js +557 -0
  25. package/lib/dlob/DLOBNode.d.ts +52 -0
  26. package/lib/dlob/DLOBNode.js +82 -0
  27. package/lib/dlob/NodeList.d.ts +26 -0
  28. package/lib/dlob/NodeList.js +138 -0
  29. package/lib/events/types.d.ts +2 -1
  30. package/lib/events/types.js +1 -0
  31. package/lib/examples/makeTradeExample.js +7 -7
  32. package/lib/idl/clearing_house.json +1152 -503
  33. package/lib/index.d.ts +10 -3
  34. package/lib/index.js +10 -3
  35. package/lib/math/amm.d.ts +2 -2
  36. package/lib/math/amm.js +1 -1
  37. package/lib/math/funding.d.ts +6 -6
  38. package/lib/math/funding.js +2 -1
  39. package/lib/math/margin.d.ts +4 -4
  40. package/lib/math/margin.js +18 -11
  41. package/lib/math/market.d.ts +11 -10
  42. package/lib/math/market.js +30 -7
  43. package/lib/math/oracles.d.ts +2 -1
  44. package/lib/math/oracles.js +11 -1
  45. package/lib/math/orders.d.ts +6 -6
  46. package/lib/math/orders.js +31 -16
  47. package/lib/math/position.d.ts +13 -13
  48. package/lib/math/position.js +19 -19
  49. package/lib/math/spotBalance.d.ts +22 -0
  50. package/lib/math/spotBalance.js +193 -0
  51. package/lib/math/spotMarket.d.ts +4 -0
  52. package/lib/math/spotMarket.js +8 -0
  53. package/lib/math/spotPosition.d.ts +6 -0
  54. package/lib/math/spotPosition.js +23 -0
  55. package/lib/math/state.js +2 -2
  56. package/lib/math/trade.d.ts +4 -4
  57. package/lib/orderParams.d.ts +4 -4
  58. package/lib/orderParams.js +12 -4
  59. package/lib/serum/serumSubscriber.d.ts +23 -0
  60. package/lib/serum/serumSubscriber.js +41 -0
  61. package/lib/serum/types.d.ts +11 -0
  62. package/lib/serum/types.js +2 -0
  63. package/lib/tx/retryTxSender.d.ts +1 -1
  64. package/lib/tx/retryTxSender.js +4 -2
  65. package/lib/tx/types.d.ts +1 -1
  66. package/lib/types.d.ts +148 -57
  67. package/lib/types.js +39 -11
  68. package/lib/userMap/userMap.d.ts +25 -0
  69. package/lib/userMap/userMap.js +73 -0
  70. package/lib/userMap/userStatsMap.d.ts +19 -0
  71. package/lib/userMap/userStatsMap.js +68 -0
  72. package/package.json +6 -3
  73. package/src/accounts/pollingClearingHouseAccountSubscriber.ts +42 -38
  74. package/src/accounts/types.ts +12 -9
  75. package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +65 -52
  76. package/src/addresses/pda.ts +49 -44
  77. package/src/admin.ts +190 -55
  78. package/src/clearingHouse.ts +1092 -365
  79. package/src/clearingHouseConfig.ts +2 -2
  80. package/src/clearingHouseUser.ts +518 -255
  81. package/src/config.ts +30 -30
  82. package/src/constants/numericConstants.ts +17 -15
  83. package/src/constants/{markets.ts → perpMarkets.ts} +5 -5
  84. package/src/constants/{banks.ts → spotMarkets.ts} +19 -19
  85. package/src/dlob/DLOB.ts +884 -0
  86. package/src/dlob/DLOBNode.ts +163 -0
  87. package/src/dlob/NodeList.ts +185 -0
  88. package/src/events/types.ts +3 -0
  89. package/src/examples/makeTradeExample.js +152 -75
  90. package/src/examples/makeTradeExample.ts +10 -8
  91. package/src/idl/clearing_house.json +1152 -503
  92. package/src/index.ts +10 -3
  93. package/src/math/amm.ts +6 -3
  94. package/src/math/funding.ts +7 -7
  95. package/src/math/margin.ts +34 -23
  96. package/src/math/market.ts +72 -20
  97. package/src/math/oracles.ts +18 -1
  98. package/src/math/orders.ts +33 -25
  99. package/src/math/position.ts +31 -31
  100. package/src/math/spotBalance.ts +316 -0
  101. package/src/math/spotMarket.ts +9 -0
  102. package/src/math/spotPosition.ts +47 -0
  103. package/src/math/state.ts +2 -2
  104. package/src/math/trade.ts +4 -4
  105. package/src/orderParams.ts +16 -8
  106. package/src/serum/serumSubscriber.ts +80 -0
  107. package/src/serum/types.ts +13 -0
  108. package/src/tx/retryTxSender.ts +5 -2
  109. package/src/tx/types.ts +2 -1
  110. package/src/types.ts +135 -56
  111. package/src/userMap/userMap.ts +100 -0
  112. package/src/userMap/userStatsMap.ts +110 -0
  113. package/tests/bn/test.ts +2 -3
  114. package/tests/dlob/helpers.ts +322 -0
  115. package/tests/dlob/test.ts +2865 -0
  116. package/lib/math/bankBalance.d.ts +0 -15
  117. package/lib/math/bankBalance.js +0 -150
  118. package/src/constants/numericConstants.js +0 -41
  119. package/src/math/bankBalance.ts +0 -258
  120. package/src/math/oracles.js +0 -26
  121. package/src/math/state.js +0 -15
  122. package/src/orderParams.js +0 -20
  123. package/src/slot/SlotSubscriber.js +0 -39
  124. package/src/tokenFaucet.js +0 -189
@@ -1,15 +0,0 @@
1
- /// <reference types="bn.js" />
2
- import { BankAccount, BankBalanceType, MarginCategory } from '../types';
3
- import { BN } from '@project-serum/anchor';
4
- export declare function getBalance(tokenAmount: BN, bank: BankAccount, balanceType: BankBalanceType): BN;
5
- export declare function getTokenAmount(balanceAmount: BN, bank: BankAccount, balanceType: BankBalanceType): BN;
6
- export declare function calculateAssetWeight(balanceAmount: BN, bank: BankAccount, marginCategory: MarginCategory): BN;
7
- export declare function calculateLiabilityWeight(balanceAmount: BN, bank: BankAccount, marginCategory: MarginCategory): BN;
8
- export declare function calculateInterestAccumulated(bank: BankAccount, now: BN): {
9
- borrowInterest: BN;
10
- depositInterest: BN;
11
- };
12
- export declare function calculateWithdrawLimit(bank: BankAccount, now: BN): {
13
- borrowLimit: BN;
14
- withdrawLimit: BN;
15
- };
@@ -1,150 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.calculateWithdrawLimit = exports.calculateInterestAccumulated = exports.calculateLiabilityWeight = exports.calculateAssetWeight = exports.getTokenAmount = exports.getBalance = void 0;
4
- const types_1 = require("../types");
5
- const anchor_1 = require("@project-serum/anchor");
6
- const numericConstants_1 = require("../constants/numericConstants");
7
- const margin_1 = require("./margin");
8
- function getBalance(tokenAmount, bank, balanceType) {
9
- const precisionIncrease = numericConstants_1.TEN.pow(new anchor_1.BN(16 - bank.decimals));
10
- const cumulativeInterest = (0, types_1.isVariant)(balanceType, 'deposit')
11
- ? bank.cumulativeDepositInterest
12
- : bank.cumulativeBorrowInterest;
13
- let balance = tokenAmount.mul(precisionIncrease).div(cumulativeInterest);
14
- if (!balance.eq(numericConstants_1.ZERO) && (0, types_1.isVariant)(balanceType, 'borrow')) {
15
- balance = balance.add(numericConstants_1.ONE);
16
- }
17
- return balance;
18
- }
19
- exports.getBalance = getBalance;
20
- function getTokenAmount(balanceAmount, bank, balanceType) {
21
- const precisionDecrease = numericConstants_1.TEN.pow(new anchor_1.BN(16 - bank.decimals));
22
- const cumulativeInterest = (0, types_1.isVariant)(balanceType, 'deposit')
23
- ? bank.cumulativeDepositInterest
24
- : bank.cumulativeBorrowInterest;
25
- return balanceAmount.mul(cumulativeInterest).div(precisionDecrease);
26
- }
27
- exports.getTokenAmount = getTokenAmount;
28
- function calculateAssetWeight(balanceAmount, bank, marginCategory) {
29
- const sizePrecision = numericConstants_1.TEN.pow(new anchor_1.BN(bank.decimals));
30
- let sizeInAmmReservePrecision;
31
- if (sizePrecision.gt(numericConstants_1.AMM_RESERVE_PRECISION)) {
32
- sizeInAmmReservePrecision = balanceAmount.div(sizePrecision.div(numericConstants_1.AMM_RESERVE_PRECISION));
33
- }
34
- else {
35
- sizeInAmmReservePrecision = balanceAmount
36
- .mul(numericConstants_1.AMM_RESERVE_PRECISION)
37
- .div(sizePrecision);
38
- }
39
- let assetWeight;
40
- switch (marginCategory) {
41
- case 'Initial':
42
- assetWeight = (0, margin_1.calculateSizeDiscountAssetWeight)(sizeInAmmReservePrecision, bank.imfFactor, bank.initialAssetWeight);
43
- break;
44
- case 'Maintenance':
45
- assetWeight = (0, margin_1.calculateSizeDiscountAssetWeight)(sizeInAmmReservePrecision, bank.imfFactor, bank.maintenanceAssetWeight);
46
- break;
47
- default:
48
- assetWeight = bank.initialAssetWeight;
49
- break;
50
- }
51
- return assetWeight;
52
- }
53
- exports.calculateAssetWeight = calculateAssetWeight;
54
- function calculateLiabilityWeight(balanceAmount, bank, marginCategory) {
55
- const sizePrecision = numericConstants_1.TEN.pow(new anchor_1.BN(bank.decimals));
56
- let sizeInAmmReservePrecision;
57
- if (sizePrecision.gt(numericConstants_1.AMM_RESERVE_PRECISION)) {
58
- sizeInAmmReservePrecision = balanceAmount.div(sizePrecision.div(numericConstants_1.AMM_RESERVE_PRECISION));
59
- }
60
- else {
61
- sizeInAmmReservePrecision = balanceAmount
62
- .mul(numericConstants_1.AMM_RESERVE_PRECISION)
63
- .div(sizePrecision);
64
- }
65
- let assetWeight;
66
- switch (marginCategory) {
67
- case 'Initial':
68
- assetWeight = (0, margin_1.calculateSizePremiumLiabilityWeight)(sizeInAmmReservePrecision, bank.imfFactor, bank.initialLiabilityWeight, numericConstants_1.BANK_WEIGHT_PRECISION);
69
- break;
70
- case 'Maintenance':
71
- assetWeight = (0, margin_1.calculateSizePremiumLiabilityWeight)(sizeInAmmReservePrecision, bank.imfFactor, bank.maintenanceLiabilityWeight, numericConstants_1.BANK_WEIGHT_PRECISION);
72
- break;
73
- default:
74
- assetWeight = bank.initialLiabilityWeight;
75
- break;
76
- }
77
- return assetWeight;
78
- }
79
- exports.calculateLiabilityWeight = calculateLiabilityWeight;
80
- function calculateInterestAccumulated(bank, now) {
81
- const token_deposit_amount = getTokenAmount(bank.depositBalance, bank, types_1.BankBalanceType.DEPOSIT);
82
- const token_borrow_amount = getTokenAmount(bank.borrowBalance, bank, types_1.BankBalanceType.BORROW);
83
- let utilization;
84
- if (token_borrow_amount.eq(numericConstants_1.ZERO) && token_deposit_amount.eq(numericConstants_1.ZERO)) {
85
- utilization = numericConstants_1.ZERO;
86
- }
87
- else if (token_deposit_amount.eq(numericConstants_1.ZERO)) {
88
- utilization = numericConstants_1.BANK_UTILIZATION_PRECISION;
89
- }
90
- else {
91
- utilization = token_borrow_amount
92
- .mul(numericConstants_1.BANK_UTILIZATION_PRECISION)
93
- .div(token_deposit_amount);
94
- }
95
- let interest_rate;
96
- if (utilization.gt(bank.optimalUtilization)) {
97
- const surplusUtilization = utilization.sub(bank.optimalUtilization);
98
- const borrowRateSlope = bank.maxBorrowRate
99
- .sub(bank.optimalBorrowRate)
100
- .mul(numericConstants_1.BANK_UTILIZATION_PRECISION)
101
- .div(numericConstants_1.BANK_UTILIZATION_PRECISION.sub(bank.optimalUtilization));
102
- interest_rate = bank.optimalBorrowRate.add(surplusUtilization.mul(borrowRateSlope).div(numericConstants_1.BANK_UTILIZATION_PRECISION));
103
- }
104
- else {
105
- const borrowRateSlope = bank.optimalBorrowRate
106
- .mul(numericConstants_1.BANK_UTILIZATION_PRECISION)
107
- .div(numericConstants_1.BANK_UTILIZATION_PRECISION.sub(bank.optimalUtilization));
108
- interest_rate = utilization
109
- .mul(borrowRateSlope)
110
- .div(numericConstants_1.BANK_UTILIZATION_PRECISION);
111
- }
112
- const timeSinceLastUpdate = now.sub(bank.lastInterestTs);
113
- const modifiedBorrowRate = interest_rate.mul(timeSinceLastUpdate);
114
- const modifiedDepositRate = modifiedBorrowRate
115
- .mul(utilization)
116
- .div(numericConstants_1.BANK_UTILIZATION_PRECISION);
117
- const borrowInterest = bank.cumulativeBorrowInterest
118
- .mul(modifiedBorrowRate)
119
- .div(numericConstants_1.ONE_YEAR)
120
- .div(numericConstants_1.BANK_INTEREST_PRECISION)
121
- .add(numericConstants_1.ONE);
122
- const depositInterest = bank.cumulativeDepositInterest
123
- .mul(modifiedDepositRate)
124
- .div(numericConstants_1.ONE_YEAR)
125
- .div(numericConstants_1.BANK_INTEREST_PRECISION);
126
- return { borrowInterest, depositInterest };
127
- }
128
- exports.calculateInterestAccumulated = calculateInterestAccumulated;
129
- function calculateWithdrawLimit(bank, now) {
130
- const bankDepositTokenAmount = getTokenAmount(bank.depositBalance, bank, types_1.BankBalanceType.DEPOSIT);
131
- const bankBorrowTokenAmount = getTokenAmount(bank.borrowBalance, bank, types_1.BankBalanceType.BORROW);
132
- const twentyFourHours = new anchor_1.BN(60 * 60 * 24);
133
- const sinceLast = now.sub(bank.lastTwapTs);
134
- const sinceStart = anchor_1.BN.max(numericConstants_1.ZERO, twentyFourHours.sub(sinceLast));
135
- const borrowTokenTwapLive = bank.borrowTokenTwap
136
- .mul(sinceStart)
137
- .add(bankBorrowTokenAmount.mul(sinceLast))
138
- .div(sinceLast.add(sinceLast));
139
- const depositTokenTwapLive = bank.depositTokenTwap
140
- .mul(sinceStart)
141
- .add(bankDepositTokenAmount.mul(sinceLast))
142
- .div(sinceLast.add(sinceLast));
143
- const maxBorrowTokens = anchor_1.BN.min(anchor_1.BN.max(bankDepositTokenAmount.div(new anchor_1.BN(6)), borrowTokenTwapLive.add(borrowTokenTwapLive.div(new anchor_1.BN(5)))), bankDepositTokenAmount.sub(bankDepositTokenAmount.div(new anchor_1.BN(10)))); // between ~15-90% utilization with friction on twap
144
- const minDepositTokens = depositTokenTwapLive.sub(anchor_1.BN.min(anchor_1.BN.max(depositTokenTwapLive.div(new anchor_1.BN(5)), bank.withdrawGuardThreshold), depositTokenTwapLive));
145
- return {
146
- borrowLimit: maxBorrowTokens.sub(bankBorrowTokenAmount),
147
- withdrawLimit: bankDepositTokenAmount.sub(minDepositTokens),
148
- };
149
- }
150
- exports.calculateWithdrawLimit = calculateWithdrawLimit;
@@ -1,41 +0,0 @@
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,258 +0,0 @@
1
- import {
2
- BankAccount,
3
- BankBalanceType,
4
- isVariant,
5
- MarginCategory,
6
- } from '../types';
7
- import { BN } from '@project-serum/anchor';
8
- import {
9
- BANK_UTILIZATION_PRECISION,
10
- ONE,
11
- TEN,
12
- ZERO,
13
- BANK_INTEREST_PRECISION,
14
- BANK_WEIGHT_PRECISION,
15
- ONE_YEAR,
16
- AMM_RESERVE_PRECISION,
17
- } from '../constants/numericConstants';
18
- import {
19
- calculateSizeDiscountAssetWeight,
20
- calculateSizePremiumLiabilityWeight,
21
- } from './margin';
22
-
23
- export function getBalance(
24
- tokenAmount: BN,
25
- bank: BankAccount,
26
- balanceType: BankBalanceType
27
- ): BN {
28
- const precisionIncrease = TEN.pow(new BN(16 - bank.decimals));
29
-
30
- const cumulativeInterest = isVariant(balanceType, 'deposit')
31
- ? bank.cumulativeDepositInterest
32
- : bank.cumulativeBorrowInterest;
33
-
34
- let balance = tokenAmount.mul(precisionIncrease).div(cumulativeInterest);
35
-
36
- if (!balance.eq(ZERO) && isVariant(balanceType, 'borrow')) {
37
- balance = balance.add(ONE);
38
- }
39
-
40
- return balance;
41
- }
42
-
43
- export function getTokenAmount(
44
- balanceAmount: BN,
45
- bank: BankAccount,
46
- balanceType: BankBalanceType
47
- ): BN {
48
- const precisionDecrease = TEN.pow(new BN(16 - bank.decimals));
49
-
50
- const cumulativeInterest = isVariant(balanceType, 'deposit')
51
- ? bank.cumulativeDepositInterest
52
- : bank.cumulativeBorrowInterest;
53
-
54
- return balanceAmount.mul(cumulativeInterest).div(precisionDecrease);
55
- }
56
-
57
- export function calculateAssetWeight(
58
- balanceAmount: BN,
59
- bank: BankAccount,
60
- marginCategory: MarginCategory
61
- ): BN {
62
- const sizePrecision = TEN.pow(new BN(bank.decimals));
63
- let sizeInAmmReservePrecision;
64
- if (sizePrecision.gt(AMM_RESERVE_PRECISION)) {
65
- sizeInAmmReservePrecision = balanceAmount.div(
66
- sizePrecision.div(AMM_RESERVE_PRECISION)
67
- );
68
- } else {
69
- sizeInAmmReservePrecision = balanceAmount
70
- .mul(AMM_RESERVE_PRECISION)
71
- .div(sizePrecision);
72
- }
73
-
74
- let assetWeight;
75
-
76
- switch (marginCategory) {
77
- case 'Initial':
78
- assetWeight = calculateSizeDiscountAssetWeight(
79
- sizeInAmmReservePrecision,
80
- bank.imfFactor,
81
- bank.initialAssetWeight
82
- );
83
- break;
84
- case 'Maintenance':
85
- assetWeight = calculateSizeDiscountAssetWeight(
86
- sizeInAmmReservePrecision,
87
- bank.imfFactor,
88
- bank.maintenanceAssetWeight
89
- );
90
- break;
91
- default:
92
- assetWeight = bank.initialAssetWeight;
93
- break;
94
- }
95
-
96
- return assetWeight;
97
- }
98
-
99
- export function calculateLiabilityWeight(
100
- balanceAmount: BN,
101
- bank: BankAccount,
102
- marginCategory: MarginCategory
103
- ): BN {
104
- const sizePrecision = TEN.pow(new BN(bank.decimals));
105
- let sizeInAmmReservePrecision;
106
- if (sizePrecision.gt(AMM_RESERVE_PRECISION)) {
107
- sizeInAmmReservePrecision = balanceAmount.div(
108
- sizePrecision.div(AMM_RESERVE_PRECISION)
109
- );
110
- } else {
111
- sizeInAmmReservePrecision = balanceAmount
112
- .mul(AMM_RESERVE_PRECISION)
113
- .div(sizePrecision);
114
- }
115
-
116
- let assetWeight;
117
-
118
- switch (marginCategory) {
119
- case 'Initial':
120
- assetWeight = calculateSizePremiumLiabilityWeight(
121
- sizeInAmmReservePrecision,
122
- bank.imfFactor,
123
- bank.initialLiabilityWeight,
124
- BANK_WEIGHT_PRECISION
125
- );
126
- break;
127
- case 'Maintenance':
128
- assetWeight = calculateSizePremiumLiabilityWeight(
129
- sizeInAmmReservePrecision,
130
- bank.imfFactor,
131
- bank.maintenanceLiabilityWeight,
132
- BANK_WEIGHT_PRECISION
133
- );
134
- break;
135
- default:
136
- assetWeight = bank.initialLiabilityWeight;
137
- break;
138
- }
139
-
140
- return assetWeight;
141
- }
142
-
143
- export function calculateInterestAccumulated(
144
- bank: BankAccount,
145
- now: BN
146
- ): { borrowInterest: BN; depositInterest: BN } {
147
- const token_deposit_amount = getTokenAmount(
148
- bank.depositBalance,
149
- bank,
150
- BankBalanceType.DEPOSIT
151
- );
152
- const token_borrow_amount = getTokenAmount(
153
- bank.borrowBalance,
154
- bank,
155
- BankBalanceType.BORROW
156
- );
157
-
158
- let utilization: BN;
159
- if (token_borrow_amount.eq(ZERO) && token_deposit_amount.eq(ZERO)) {
160
- utilization = ZERO;
161
- } else if (token_deposit_amount.eq(ZERO)) {
162
- utilization = BANK_UTILIZATION_PRECISION;
163
- } else {
164
- utilization = token_borrow_amount
165
- .mul(BANK_UTILIZATION_PRECISION)
166
- .div(token_deposit_amount);
167
- }
168
-
169
- let interest_rate: BN;
170
- if (utilization.gt(bank.optimalUtilization)) {
171
- const surplusUtilization = utilization.sub(bank.optimalUtilization);
172
- const borrowRateSlope = bank.maxBorrowRate
173
- .sub(bank.optimalBorrowRate)
174
- .mul(BANK_UTILIZATION_PRECISION)
175
- .div(BANK_UTILIZATION_PRECISION.sub(bank.optimalUtilization));
176
-
177
- interest_rate = bank.optimalBorrowRate.add(
178
- surplusUtilization.mul(borrowRateSlope).div(BANK_UTILIZATION_PRECISION)
179
- );
180
- } else {
181
- const borrowRateSlope = bank.optimalBorrowRate
182
- .mul(BANK_UTILIZATION_PRECISION)
183
- .div(BANK_UTILIZATION_PRECISION.sub(bank.optimalUtilization));
184
-
185
- interest_rate = utilization
186
- .mul(borrowRateSlope)
187
- .div(BANK_UTILIZATION_PRECISION);
188
- }
189
-
190
- const timeSinceLastUpdate = now.sub(bank.lastInterestTs);
191
-
192
- const modifiedBorrowRate = interest_rate.mul(timeSinceLastUpdate);
193
-
194
- const modifiedDepositRate = modifiedBorrowRate
195
- .mul(utilization)
196
- .div(BANK_UTILIZATION_PRECISION);
197
-
198
- const borrowInterest = bank.cumulativeBorrowInterest
199
- .mul(modifiedBorrowRate)
200
- .div(ONE_YEAR)
201
- .div(BANK_INTEREST_PRECISION)
202
- .add(ONE);
203
- const depositInterest = bank.cumulativeDepositInterest
204
- .mul(modifiedDepositRate)
205
- .div(ONE_YEAR)
206
- .div(BANK_INTEREST_PRECISION);
207
-
208
- return { borrowInterest, depositInterest };
209
- }
210
-
211
- export function calculateWithdrawLimit(
212
- bank: BankAccount,
213
- now: BN
214
- ): { borrowLimit: BN; withdrawLimit: BN } {
215
- const bankDepositTokenAmount = getTokenAmount(
216
- bank.depositBalance,
217
- bank,
218
- BankBalanceType.DEPOSIT
219
- );
220
- const bankBorrowTokenAmount = getTokenAmount(
221
- bank.borrowBalance,
222
- bank,
223
- BankBalanceType.BORROW
224
- );
225
-
226
- const twentyFourHours = new BN(60 * 60 * 24);
227
- const sinceLast = now.sub(bank.lastTwapTs);
228
- const sinceStart = BN.max(ZERO, twentyFourHours.sub(sinceLast));
229
- const borrowTokenTwapLive = bank.borrowTokenTwap
230
- .mul(sinceStart)
231
- .add(bankBorrowTokenAmount.mul(sinceLast))
232
- .div(sinceLast.add(sinceLast));
233
-
234
- const depositTokenTwapLive = bank.depositTokenTwap
235
- .mul(sinceStart)
236
- .add(bankDepositTokenAmount.mul(sinceLast))
237
- .div(sinceLast.add(sinceLast));
238
-
239
- const maxBorrowTokens = BN.min(
240
- BN.max(
241
- bankDepositTokenAmount.div(new BN(6)),
242
- borrowTokenTwapLive.add(borrowTokenTwapLive.div(new BN(5)))
243
- ),
244
- bankDepositTokenAmount.sub(bankDepositTokenAmount.div(new BN(10)))
245
- ); // between ~15-90% utilization with friction on twap
246
-
247
- const minDepositTokens = depositTokenTwapLive.sub(
248
- BN.min(
249
- BN.max(depositTokenTwapLive.div(new BN(5)), bank.withdrawGuardThreshold),
250
- depositTokenTwapLive
251
- )
252
- );
253
-
254
- return {
255
- borrowLimit: maxBorrowTokens.sub(bankBorrowTokenAmount),
256
- withdrawLimit: bankDepositTokenAmount.sub(minDepositTokens),
257
- };
258
- }
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isOracleValid = void 0;
4
- const numericConstants_1 = require("../constants/numericConstants");
5
- const index_1 = require("../index");
6
- function isOracleValid(amm, oraclePriceData, oracleGuardRails, slot) {
7
- const isOraclePriceNonPositive = oraclePriceData.price.lt(numericConstants_1.ZERO);
8
- const isOraclePriceTooVolatile = oraclePriceData.price
9
- .div(index_1.BN.max(numericConstants_1.ONE, amm.lastOraclePriceTwap))
10
- .gt(oracleGuardRails.validity.tooVolatileRatio) ||
11
- amm.lastOraclePriceTwap
12
- .div(index_1.BN.max(numericConstants_1.ONE, oraclePriceData.price))
13
- .gt(oracleGuardRails.validity.tooVolatileRatio);
14
- const isConfidenceTooLarge = oraclePriceData.price
15
- .div(index_1.BN.max(numericConstants_1.ONE, oraclePriceData.confidence))
16
- .lt(oracleGuardRails.validity.confidenceIntervalMaxSize);
17
- const oracleIsStale = oraclePriceData.slot
18
- .sub(new index_1.BN(slot))
19
- .gt(oracleGuardRails.validity.slotsBeforeStale);
20
- return !(!oraclePriceData.hasSufficientNumberOfDataPoints ||
21
- oracleIsStale ||
22
- isOraclePriceNonPositive ||
23
- isOraclePriceTooVolatile ||
24
- isConfidenceTooLarge);
25
- }
26
- exports.isOracleValid = isOracleValid;
package/src/math/state.js DELETED
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getExchangeFee = void 0;
4
- /**
5
- * Get the clearing house percent fee charged on notional of taking trades
6
- *
7
- * @param state
8
- * @returns Precision : basis points (bps)
9
- */
10
- function getExchangeFee(state) {
11
- const exchangeFee = state.feeStructure.feeNumerator.toNumber() /
12
- state.feeStructure.feeDenominator.toNumber();
13
- return exchangeFee;
14
- }
15
- exports.getExchangeFee = getExchangeFee;
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMarketOrderParams = exports.getTriggerLimitOrderParams = exports.getTriggerMarketOrderParams = exports.getLimitOrderParams = void 0;
4
- const types_1 = require("./types");
5
- function getLimitOrderParams(params) {
6
- return Object.assign({}, params, { orderType: types_1.OrderType.LIMIT });
7
- }
8
- exports.getLimitOrderParams = getLimitOrderParams;
9
- function getTriggerMarketOrderParams(params) {
10
- return Object.assign({}, params, { orderType: types_1.OrderType.TRIGGER_MARKET });
11
- }
12
- exports.getTriggerMarketOrderParams = getTriggerMarketOrderParams;
13
- function getTriggerLimitOrderParams(params) {
14
- return Object.assign({}, params, { orderType: types_1.OrderType.TRIGGER_LIMIT });
15
- }
16
- exports.getTriggerLimitOrderParams = getTriggerLimitOrderParams;
17
- function getMarketOrderParams(params) {
18
- return Object.assign({}, params, { orderType: types_1.OrderType.MARKET });
19
- }
20
- exports.getMarketOrderParams = getMarketOrderParams;
@@ -1,39 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.SlotSubscriber = void 0;
13
- const events_1 = require("events");
14
- class SlotSubscriber {
15
- constructor(connection, _config) {
16
- this.connection = connection;
17
- this.eventEmitter = new events_1.EventEmitter();
18
- }
19
- subscribe() {
20
- return __awaiter(this, void 0, void 0, function* () {
21
- this.currentSlot = yield this.connection.getSlot('confirmed');
22
- this.subscriptionId = this.connection.onSlotChange((slotInfo) => {
23
- this.currentSlot = slotInfo.slot;
24
- this.eventEmitter.emit('newSlot', slotInfo.slot);
25
- });
26
- });
27
- }
28
- getSlot() {
29
- return this.currentSlot;
30
- }
31
- unsubscribe() {
32
- return __awaiter(this, void 0, void 0, function* () {
33
- if (this.subscriptionId) {
34
- yield this.connection.removeSlotChangeListener(this.subscriptionId);
35
- }
36
- });
37
- }
38
- }
39
- exports.SlotSubscriber = SlotSubscriber;