@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.
- package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +14 -13
- package/lib/accounts/pollingClearingHouseAccountSubscriber.js +30 -27
- package/lib/accounts/types.d.ts +9 -9
- package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +15 -14
- package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +38 -34
- package/lib/addresses/pda.d.ts +7 -6
- package/lib/addresses/pda.js +31 -27
- package/lib/admin.d.ts +13 -7
- package/lib/admin.js +111 -44
- package/lib/clearingHouse.d.ts +71 -42
- package/lib/clearingHouse.js +767 -278
- package/lib/clearingHouseConfig.d.ts +2 -2
- package/lib/clearingHouseUser.d.ts +24 -22
- package/lib/clearingHouseUser.js +273 -177
- package/lib/config.d.ts +7 -7
- package/lib/config.js +21 -21
- package/lib/constants/numericConstants.d.ts +12 -12
- package/lib/constants/numericConstants.js +13 -13
- package/lib/constants/{markets.d.ts → perpMarkets.d.ts} +5 -5
- package/lib/constants/{markets.js → perpMarkets.js} +4 -4
- package/lib/constants/{banks.d.ts → spotMarkets.d.ts} +6 -6
- package/lib/constants/{banks.js → spotMarkets.js} +16 -16
- package/lib/dlob/DLOB.d.ts +73 -0
- package/lib/dlob/DLOB.js +557 -0
- package/lib/dlob/DLOBNode.d.ts +52 -0
- package/lib/dlob/DLOBNode.js +82 -0
- package/lib/dlob/NodeList.d.ts +26 -0
- package/lib/dlob/NodeList.js +138 -0
- package/lib/events/types.d.ts +2 -1
- package/lib/events/types.js +1 -0
- package/lib/examples/makeTradeExample.js +7 -7
- package/lib/idl/clearing_house.json +1152 -503
- package/lib/index.d.ts +10 -3
- package/lib/index.js +10 -3
- package/lib/math/amm.d.ts +2 -2
- package/lib/math/amm.js +1 -1
- package/lib/math/funding.d.ts +6 -6
- package/lib/math/funding.js +2 -1
- package/lib/math/margin.d.ts +4 -4
- package/lib/math/margin.js +18 -11
- package/lib/math/market.d.ts +11 -10
- package/lib/math/market.js +30 -7
- package/lib/math/oracles.d.ts +2 -1
- package/lib/math/oracles.js +11 -1
- package/lib/math/orders.d.ts +6 -6
- package/lib/math/orders.js +31 -16
- package/lib/math/position.d.ts +13 -13
- package/lib/math/position.js +19 -19
- package/lib/math/spotBalance.d.ts +22 -0
- package/lib/math/spotBalance.js +193 -0
- package/lib/math/spotMarket.d.ts +4 -0
- package/lib/math/spotMarket.js +8 -0
- package/lib/math/spotPosition.d.ts +6 -0
- package/lib/math/spotPosition.js +23 -0
- package/lib/math/state.js +2 -2
- package/lib/math/trade.d.ts +4 -4
- package/lib/orderParams.d.ts +4 -4
- package/lib/orderParams.js +12 -4
- package/lib/serum/serumSubscriber.d.ts +23 -0
- package/lib/serum/serumSubscriber.js +41 -0
- package/lib/serum/types.d.ts +11 -0
- package/lib/serum/types.js +2 -0
- package/lib/tx/retryTxSender.d.ts +1 -1
- package/lib/tx/retryTxSender.js +4 -2
- package/lib/tx/types.d.ts +1 -1
- package/lib/types.d.ts +148 -57
- package/lib/types.js +39 -11
- package/lib/userMap/userMap.d.ts +25 -0
- package/lib/userMap/userMap.js +73 -0
- package/lib/userMap/userStatsMap.d.ts +19 -0
- package/lib/userMap/userStatsMap.js +68 -0
- package/package.json +6 -3
- package/src/accounts/pollingClearingHouseAccountSubscriber.ts +42 -38
- package/src/accounts/types.ts +12 -9
- package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +65 -52
- package/src/addresses/pda.ts +49 -44
- package/src/admin.ts +190 -55
- package/src/clearingHouse.ts +1092 -365
- package/src/clearingHouseConfig.ts +2 -2
- package/src/clearingHouseUser.ts +518 -255
- package/src/config.ts +30 -30
- package/src/constants/numericConstants.ts +17 -15
- package/src/constants/{markets.ts → perpMarkets.ts} +5 -5
- package/src/constants/{banks.ts → spotMarkets.ts} +19 -19
- package/src/dlob/DLOB.ts +884 -0
- package/src/dlob/DLOBNode.ts +163 -0
- package/src/dlob/NodeList.ts +185 -0
- package/src/events/types.ts +3 -0
- package/src/examples/makeTradeExample.js +152 -75
- package/src/examples/makeTradeExample.ts +10 -8
- package/src/idl/clearing_house.json +1152 -503
- package/src/index.ts +10 -3
- package/src/math/amm.ts +6 -3
- package/src/math/funding.ts +7 -7
- package/src/math/margin.ts +34 -23
- package/src/math/market.ts +72 -20
- package/src/math/oracles.ts +18 -1
- package/src/math/orders.ts +33 -25
- package/src/math/position.ts +31 -31
- package/src/math/spotBalance.ts +316 -0
- package/src/math/spotMarket.ts +9 -0
- package/src/math/spotPosition.ts +47 -0
- package/src/math/state.ts +2 -2
- package/src/math/trade.ts +4 -4
- package/src/orderParams.ts +16 -8
- package/src/serum/serumSubscriber.ts +80 -0
- package/src/serum/types.ts +13 -0
- package/src/tx/retryTxSender.ts +5 -2
- package/src/tx/types.ts +2 -1
- package/src/types.ts +135 -56
- package/src/userMap/userMap.ts +100 -0
- package/src/userMap/userStatsMap.ts +110 -0
- package/tests/bn/test.ts +2 -3
- package/tests/dlob/helpers.ts +322 -0
- package/tests/dlob/test.ts +2865 -0
- package/lib/math/bankBalance.d.ts +0 -15
- package/lib/math/bankBalance.js +0 -150
- package/src/constants/numericConstants.js +0 -41
- package/src/math/bankBalance.ts +0 -258
- package/src/math/oracles.js +0 -26
- package/src/math/state.js +0 -15
- package/src/orderParams.js +0 -20
- package/src/slot/SlotSubscriber.js +0 -39
- 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
|
-
};
|
package/lib/math/bankBalance.js
DELETED
|
@@ -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);
|
package/src/math/bankBalance.ts
DELETED
|
@@ -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
|
-
}
|
package/src/math/oracles.js
DELETED
|
@@ -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;
|
package/src/orderParams.js
DELETED
|
@@ -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;
|