@drift-labs/sdk 0.1.7 → 0.1.11
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/.eslintrc.json +36 -0
- package/.prettierignore +1 -0
- package/.prettierrc.js +9 -0
- package/lib/accounts/defaultClearingHouseAccountSubscriber.d.ts +1 -0
- package/lib/accounts/defaultClearingHouseAccountSubscriber.d.ts.map +1 -0
- package/lib/accounts/defaultHistoryAccountSubscriber.d.ts +1 -0
- package/lib/accounts/defaultHistoryAccountSubscriber.d.ts.map +1 -0
- package/lib/accounts/defaultUserAccountSubscriber.d.ts +1 -0
- package/lib/accounts/defaultUserAccountSubscriber.d.ts.map +1 -0
- package/lib/accounts/types.d.ts +1 -0
- package/lib/accounts/types.d.ts.map +1 -0
- package/lib/accounts/webSocketAccountSubscriber.d.ts +1 -0
- package/lib/accounts/webSocketAccountSubscriber.d.ts.map +1 -0
- package/lib/addresses.d.ts +1 -0
- package/lib/addresses.d.ts.map +1 -0
- package/lib/admin.d.ts +2 -1
- package/lib/admin.d.ts.map +1 -0
- package/lib/admin.js +2 -2
- package/lib/assert/assert.d.ts +1 -0
- package/lib/assert/assert.d.ts.map +1 -0
- package/lib/clearingHouse.d.ts +1 -0
- package/lib/clearingHouse.d.ts.map +1 -0
- package/lib/clearingHouseUser.d.ts +2 -1
- package/lib/clearingHouseUser.d.ts.map +1 -0
- package/lib/clearingHouseUser.js +20 -3
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +1 -1
- package/lib/constants/markets.d.ts +1 -0
- package/lib/constants/markets.d.ts.map +1 -0
- package/lib/constants/markets.js +28 -21
- package/lib/constants/numericConstants.d.ts +1 -0
- package/lib/constants/numericConstants.d.ts.map +1 -0
- package/lib/examples/makeTradeExample.d.ts +1 -0
- package/lib/examples/makeTradeExample.d.ts.map +1 -0
- package/lib/idl/clearing_house.json +34 -30
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/math/amm.d.ts +1 -0
- package/lib/math/amm.d.ts.map +1 -0
- package/lib/math/conversion.d.ts +1 -0
- package/lib/math/conversion.d.ts.map +1 -0
- package/lib/math/funding.d.ts +11 -1
- package/lib/math/funding.d.ts.map +1 -0
- package/lib/math/funding.js +84 -19
- package/lib/math/market.d.ts +1 -0
- package/lib/math/market.d.ts.map +1 -0
- package/lib/math/position.d.ts +7 -0
- package/lib/math/position.d.ts.map +1 -0
- package/lib/math/position.js +17 -1
- package/lib/math/trade.d.ts +5 -3
- package/lib/math/trade.d.ts.map +1 -0
- package/lib/math/trade.js +4 -4
- package/lib/math/utils.d.ts +1 -0
- package/lib/math/utils.d.ts.map +1 -0
- package/lib/mockUSDCFaucet.d.ts +1 -0
- package/lib/mockUSDCFaucet.d.ts.map +1 -0
- package/lib/pythClient.d.ts +1 -0
- package/lib/pythClient.d.ts.map +1 -0
- package/lib/tx/defaultTxSender.d.ts +1 -0
- package/lib/tx/defaultTxSender.d.ts.map +1 -0
- package/lib/tx/types.d.ts +1 -0
- package/lib/tx/types.d.ts.map +1 -0
- package/lib/tx/utils.d.ts +1 -0
- package/lib/tx/utils.d.ts.map +1 -0
- package/lib/types.d.ts +10 -1
- package/lib/types.d.ts.map +1 -0
- package/package.json +12 -2
- package/src/admin.ts +4 -4
- package/src/clearingHouseUser.ts +27 -4
- package/src/config.ts +1 -1
- package/src/constants/markets.ts +28 -21
- package/src/idl/clearing_house.json +34 -30
- package/src/math/funding.ts +120 -48
- package/src/math/position.ts +19 -0
- package/src/math/trade.ts +11 -6
- package/src/types.ts +9 -1
- package/tsconfig.json +2 -1
package/lib/math/funding.js
CHANGED
|
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.calculateFundingPool = exports.calculateLongShortFundingRate = exports.calculateEstimatedFundingRate = exports.calculateAllEstimatedFundingRate = void 0;
|
|
12
|
+
exports.calculateFundingPool = exports.calculateLongShortFundingRateAndLiveTwaps = exports.calculateLongShortFundingRate = exports.calculateEstimatedFundingRate = exports.calculateAllEstimatedFundingRate = void 0;
|
|
13
13
|
const anchor_1 = require("@project-serum/anchor");
|
|
14
14
|
const numericConstants_1 = require("../constants/numericConstants");
|
|
15
15
|
const market_1 = require("./market");
|
|
@@ -29,22 +29,34 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
|
|
|
29
29
|
const secondsInHour = new anchor_1.BN(3600);
|
|
30
30
|
const hoursInDay = new anchor_1.BN(24);
|
|
31
31
|
if (!market.initialized) {
|
|
32
|
-
return [
|
|
32
|
+
return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
|
|
33
33
|
}
|
|
34
34
|
const payFreq = new anchor_1.BN(market.amm.fundingPeriod);
|
|
35
|
-
|
|
36
|
-
const oracleTwapWithMantissa = new anchor_1.BN(oraclePriceData.twap.value * numericConstants_1.MARK_PRICE_PRECISION.toNumber());
|
|
35
|
+
// todo: sufficiently differs from blockchain timestamp?
|
|
37
36
|
const now = new anchor_1.BN((Date.now() / 1000).toFixed(0));
|
|
38
37
|
const timeSinceLastUpdate = now.sub(market.amm.lastFundingRateTs);
|
|
38
|
+
// calculate real-time mark twap
|
|
39
39
|
const lastMarkTwapWithMantissa = market.amm.lastMarkPriceTwap;
|
|
40
40
|
const lastMarkPriceTwapTs = market.amm.lastMarkPriceTwapTs;
|
|
41
41
|
const timeSinceLastMarkChange = now.sub(lastMarkPriceTwapTs);
|
|
42
|
-
const markTwapTimeSinceLastUpdate =
|
|
42
|
+
const markTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastMarkChange));
|
|
43
43
|
const baseAssetPriceWithMantissa = market_1.calculateMarkPrice(market);
|
|
44
44
|
const markTwapWithMantissa = markTwapTimeSinceLastUpdate
|
|
45
45
|
.mul(lastMarkTwapWithMantissa)
|
|
46
46
|
.add(timeSinceLastMarkChange.mul(baseAssetPriceWithMantissa))
|
|
47
47
|
.div(timeSinceLastMarkChange.add(markTwapTimeSinceLastUpdate));
|
|
48
|
+
// calculate real-time (predicted) oracle twap
|
|
49
|
+
// note: oracle twap depends on `when the chord is struck` (market is trade)
|
|
50
|
+
const lastOracleTwapWithMantissa = market.amm.lastOraclePriceTwap;
|
|
51
|
+
const lastOraclePriceTwapTs = market.amm.lastOraclePriceTwapTs;
|
|
52
|
+
const timeSinceLastOracleTwapUpdate = now.sub(lastOraclePriceTwapTs);
|
|
53
|
+
const oracleTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastOracleTwapUpdate));
|
|
54
|
+
const oraclePriceData = yield pythClient.getPriceData(market.amm.oracle);
|
|
55
|
+
const oraclePriceStableWithMantissa = new anchor_1.BN(((oraclePriceData.price + oraclePriceData.previousPrice) / 2) * numericConstants_1.MARK_PRICE_PRECISION.toNumber());
|
|
56
|
+
const oracleTwapWithMantissa = oracleTwapTimeSinceLastUpdate
|
|
57
|
+
.mul(lastOracleTwapWithMantissa)
|
|
58
|
+
.add(timeSinceLastMarkChange.mul(oraclePriceStableWithMantissa))
|
|
59
|
+
.div(timeSinceLastOracleTwapUpdate.add(oracleTwapTimeSinceLastUpdate));
|
|
48
60
|
const twapSpread = markTwapWithMantissa.sub(oracleTwapWithMantissa);
|
|
49
61
|
const twapSpreadPct = twapSpread
|
|
50
62
|
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
@@ -58,26 +70,55 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
|
|
|
58
70
|
.div(secondsInHour)
|
|
59
71
|
.div(hoursInDay);
|
|
60
72
|
const interpEst = twapSpreadPct.mul(periodAdjustment).div(hoursInDay);
|
|
61
|
-
const interpRateQuote = twapSpreadPct
|
|
73
|
+
const interpRateQuote = twapSpreadPct
|
|
74
|
+
.mul(periodAdjustment)
|
|
75
|
+
.div(hoursInDay)
|
|
62
76
|
.div(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION));
|
|
63
|
-
|
|
77
|
+
let feePoolSize = calculateFundingPool(market);
|
|
78
|
+
if (interpRateQuote.lt(new anchor_1.BN(0))) {
|
|
79
|
+
feePoolSize = feePoolSize.mul(new anchor_1.BN(-1));
|
|
80
|
+
}
|
|
64
81
|
let cappedAltEst;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
82
|
+
let largerSide;
|
|
83
|
+
let smallerSide;
|
|
84
|
+
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
|
|
85
|
+
largerSide = market.baseAssetAmountLong.abs();
|
|
86
|
+
smallerSide = market.baseAssetAmountShort.abs();
|
|
87
|
+
if (twapSpread.gt(new anchor_1.BN(0))) {
|
|
88
|
+
return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, interpEst, interpEst];
|
|
89
|
+
}
|
|
70
90
|
}
|
|
71
|
-
else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort)) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
91
|
+
else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
|
|
92
|
+
largerSide = market.baseAssetAmountShort.abs();
|
|
93
|
+
smallerSide = market.baseAssetAmountLong.abs();
|
|
94
|
+
if (twapSpread.lt(new anchor_1.BN(0))) {
|
|
95
|
+
return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, interpEst, interpEst];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, interpEst, interpEst];
|
|
100
|
+
}
|
|
101
|
+
if (largerSide.gt(numericConstants_1.ZERO)) {
|
|
102
|
+
cappedAltEst = smallerSide.mul(twapSpread).div(largerSide);
|
|
103
|
+
const feePoolTopOff = feePoolSize
|
|
104
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION))
|
|
105
|
+
.mul(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
75
106
|
.div(largerSide);
|
|
107
|
+
cappedAltEst = cappedAltEst.add(feePoolTopOff);
|
|
108
|
+
cappedAltEst = cappedAltEst
|
|
109
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
110
|
+
.mul(new anchor_1.BN(100))
|
|
111
|
+
.div(oracleTwapWithMantissa)
|
|
112
|
+
.mul(periodAdjustment)
|
|
113
|
+
.div(hoursInDay);
|
|
114
|
+
if (cappedAltEst.abs().gt(interpEst.abs())) {
|
|
115
|
+
cappedAltEst = interpEst;
|
|
116
|
+
}
|
|
76
117
|
}
|
|
77
118
|
else {
|
|
78
119
|
cappedAltEst = interpEst;
|
|
79
120
|
}
|
|
80
|
-
return [lowerboundEst, cappedAltEst, interpEst];
|
|
121
|
+
return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, cappedAltEst, interpEst];
|
|
81
122
|
});
|
|
82
123
|
}
|
|
83
124
|
exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
|
|
@@ -91,7 +132,7 @@ exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
|
|
|
91
132
|
*/
|
|
92
133
|
function calculateEstimatedFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1), estimationMethod) {
|
|
93
134
|
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
-
const [lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
|
|
135
|
+
const [_1, _2, lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
|
|
95
136
|
if (estimationMethod == 'lowerbound') {
|
|
96
137
|
//assuming remaining funding period has no gap
|
|
97
138
|
return lowerboundEst;
|
|
@@ -115,7 +156,7 @@ exports.calculateEstimatedFundingRate = calculateEstimatedFundingRate;
|
|
|
115
156
|
*/
|
|
116
157
|
function calculateLongShortFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
|
|
117
158
|
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
-
const [_, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
|
|
159
|
+
const [_1, _2, _, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
|
|
119
160
|
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
|
|
120
161
|
return [cappedAltEst, interpEst];
|
|
121
162
|
}
|
|
@@ -128,12 +169,36 @@ function calculateLongShortFundingRate(market, pythClient, periodAdjustment = ne
|
|
|
128
169
|
});
|
|
129
170
|
}
|
|
130
171
|
exports.calculateLongShortFundingRate = calculateLongShortFundingRate;
|
|
172
|
+
/**
|
|
173
|
+
*
|
|
174
|
+
* @param market
|
|
175
|
+
* @param pythClient
|
|
176
|
+
* @param periodAdjustment
|
|
177
|
+
* @param estimationMethod
|
|
178
|
+
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
179
|
+
*/
|
|
180
|
+
function calculateLongShortFundingRateAndLiveTwaps(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
|
|
181
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
182
|
+
const [markTwapLive, oracleTwapLive, _2, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
|
|
183
|
+
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
|
|
184
|
+
return [markTwapLive, oracleTwapLive, cappedAltEst, interpEst];
|
|
185
|
+
}
|
|
186
|
+
else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
|
|
187
|
+
return [markTwapLive, oracleTwapLive, interpEst, cappedAltEst];
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
return [markTwapLive, oracleTwapLive, interpEst, interpEst];
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
exports.calculateLongShortFundingRateAndLiveTwaps = calculateLongShortFundingRateAndLiveTwaps;
|
|
131
195
|
/**
|
|
132
196
|
*
|
|
133
197
|
* @param market
|
|
134
198
|
* @returns Estimated fee pool size
|
|
135
199
|
*/
|
|
136
200
|
function calculateFundingPool(market) {
|
|
201
|
+
// todo
|
|
137
202
|
const totalFeeLB = market.amm.totalFee.div(new anchor_1.BN(2));
|
|
138
203
|
const feePool = market.amm.totalFeeMinusDistributions.sub(totalFeeLB);
|
|
139
204
|
return feePool;
|
package/lib/math/market.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/math/market.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAMrD"}
|
package/lib/math/position.d.ts
CHANGED
|
@@ -24,3 +24,10 @@ export declare function calculatePositionPNL(market: Market, marketPosition: Use
|
|
|
24
24
|
* @returns // TODO-PRECISION
|
|
25
25
|
*/
|
|
26
26
|
export declare function calculatePositionFundingPNL(market: Market, marketPosition: UserPosition): BN;
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param userPosition
|
|
30
|
+
* @returns Precision: MARK_PRICE_PRECISION (10^10)
|
|
31
|
+
*/
|
|
32
|
+
export declare function calculateEntryPrice(userPosition: UserPosition): BN;
|
|
33
|
+
//# sourceMappingURL=position.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/math/position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,YAAY,EAAE,MAAM,UAAU,CAAC;AAQnE,OAAO,EAAE,MAAM,OAAO,CAAC;AAQvB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,GACxB,EAAE,CA+BJ;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,YAAY,EAC5B,WAAW,UAAQ,GACjB,EAAE,CAgCJ;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,YAAY,GAC1B,EAAE,CAoBJ;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUlE"}
|
package/lib/math/position.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.calculatePositionFundingPNL = exports.calculatePositionPNL = exports.calculateBaseAssetValue = void 0;
|
|
6
|
+
exports.calculateEntryPrice = exports.calculatePositionFundingPNL = exports.calculatePositionPNL = exports.calculateBaseAssetValue = void 0;
|
|
7
7
|
const types_1 = require("../types");
|
|
8
8
|
const numericConstants_1 = require("../constants/numericConstants");
|
|
9
9
|
const bn_js_1 = __importDefault(require("bn.js"));
|
|
@@ -98,3 +98,19 @@ function calculatePositionFundingPNL(market, marketPosition) {
|
|
|
98
98
|
return perPositionFundingRate;
|
|
99
99
|
}
|
|
100
100
|
exports.calculatePositionFundingPNL = calculatePositionFundingPNL;
|
|
101
|
+
/**
|
|
102
|
+
*
|
|
103
|
+
* @param userPosition
|
|
104
|
+
* @returns Precision: MARK_PRICE_PRECISION (10^10)
|
|
105
|
+
*/
|
|
106
|
+
function calculateEntryPrice(userPosition) {
|
|
107
|
+
if (userPosition.baseAssetAmount.eq(numericConstants_1.ZERO)) {
|
|
108
|
+
return numericConstants_1.ZERO;
|
|
109
|
+
}
|
|
110
|
+
return userPosition.quoteAssetAmount
|
|
111
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
112
|
+
.mul(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO)
|
|
113
|
+
.div(userPosition.baseAssetAmount)
|
|
114
|
+
.abs();
|
|
115
|
+
}
|
|
116
|
+
exports.calculateEntryPrice = calculateEntryPrice;
|
package/lib/math/trade.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/// <reference types="bn.js" />
|
|
2
2
|
import { Market, PositionDirection } from '../types';
|
|
3
3
|
import { BN } from '@project-serum/anchor';
|
|
4
|
-
|
|
4
|
+
import { AssetType } from './amm';
|
|
5
|
+
export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceDeltaAsNumber' | 'pctAvg' | 'pctMax' | 'quoteAssetAmount' | 'quoteAssetAmountPeg' | 'acquiredBaseAssetAmount' | 'acquiredQuoteAssetAmount' | 'all';
|
|
5
6
|
/**
|
|
6
7
|
* Calculates avg/max slippage (price impact) for candidate trade
|
|
7
8
|
* @param direction
|
|
@@ -17,7 +18,7 @@ export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' |
|
|
|
17
18
|
*
|
|
18
19
|
* 'newPrice' => the price of the asset after the trade : Precision MARK_PRICE_PRECISION
|
|
19
20
|
*/
|
|
20
|
-
export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: Market): [BN, BN, BN, BN];
|
|
21
|
+
export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: Market, inputAssetType?: AssetType): [BN, BN, BN, BN];
|
|
21
22
|
/**
|
|
22
23
|
* Calculates acquired amounts for trade executed
|
|
23
24
|
* @param direction
|
|
@@ -27,7 +28,7 @@ export declare function calculateTradeSlippage(direction: PositionDirection, amo
|
|
|
27
28
|
* | 'acquiredBase' => positive/negative change in user's base : BN TODO-PRECISION
|
|
28
29
|
* | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
|
|
29
30
|
*/
|
|
30
|
-
export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: Market): [BN, BN];
|
|
31
|
+
export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: Market, inputAssetType?: AssetType): [BN, BN];
|
|
31
32
|
/**
|
|
32
33
|
* calculateTargetPriceTrade
|
|
33
34
|
* simple function for finding arbitraging trades
|
|
@@ -44,3 +45,4 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
|
|
|
44
45
|
* ]
|
|
45
46
|
*/
|
|
46
47
|
export declare function calculateTargetPriceTrade(market: Market, targetPrice: BN, pct?: BN): [PositionDirection, BN, BN, BN];
|
|
48
|
+
//# sourceMappingURL=trade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../src/math/trade.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAS3C,OAAO,EAIN,SAAS,EACT,MAAM,OAAO,CAAC;AAKf,oBAAY,eAAe,GACxB,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,oBAAoB,GACpB,QAAQ,GACR,QAAQ,GACR,kBAAkB,GAClB,qBAAqB,GACrB,yBAAyB,GACzB,0BAA0B,GAC1B,KAAK,CAAC;AAET;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,SAAmB,GACjC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CA0ClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC5C,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,SAAmB,GACjC,CAAC,EAAE,EAAE,EAAE,CAAC,CAiBV;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,EAAE,EACf,GAAG,GAAE,EAAW,GACd,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CA6GjC"}
|
package/lib/math/trade.js
CHANGED
|
@@ -24,12 +24,12 @@ const MAXPCT = new anchor_1.BN(1000); //percentage units are [0,1000] => [0,1]
|
|
|
24
24
|
*
|
|
25
25
|
* 'newPrice' => the price of the asset after the trade : Precision MARK_PRICE_PRECISION
|
|
26
26
|
*/
|
|
27
|
-
function calculateTradeSlippage(direction, amount, market) {
|
|
27
|
+
function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote') {
|
|
28
28
|
const oldPrice = market_1.calculateMarkPrice(market);
|
|
29
29
|
if (amount.eq(numericConstants_1.ZERO)) {
|
|
30
30
|
return [numericConstants_1.ZERO, numericConstants_1.ZERO, oldPrice, oldPrice];
|
|
31
31
|
}
|
|
32
|
-
const [acquiredBase, acquiredQuote] = calculateTradeAcquiredAmounts(direction, amount, market);
|
|
32
|
+
const [acquiredBase, acquiredQuote] = calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType);
|
|
33
33
|
const entryPrice = amm_1.calculatePrice(acquiredBase, acquiredQuote, market.amm.pegMultiplier).mul(new anchor_1.BN(-1));
|
|
34
34
|
const newPrice = amm_1.calculatePrice(market.amm.baseAssetReserve.sub(acquiredBase), market.amm.quoteAssetReserve.sub(acquiredQuote), market.amm.pegMultiplier);
|
|
35
35
|
if (direction == types_1.PositionDirection.SHORT) {
|
|
@@ -60,11 +60,11 @@ exports.calculateTradeSlippage = calculateTradeSlippage;
|
|
|
60
60
|
* | 'acquiredBase' => positive/negative change in user's base : BN TODO-PRECISION
|
|
61
61
|
* | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
|
|
62
62
|
*/
|
|
63
|
-
function calculateTradeAcquiredAmounts(direction, amount, market) {
|
|
63
|
+
function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote') {
|
|
64
64
|
if (amount.eq(numericConstants_1.ZERO)) {
|
|
65
65
|
return [numericConstants_1.ZERO, numericConstants_1.ZERO];
|
|
66
66
|
}
|
|
67
|
-
const [newQuoteAssetReserve, newBaseAssetReserve] = amm_1.calculateAmmReservesAfterSwap(market.amm,
|
|
67
|
+
const [newQuoteAssetReserve, newBaseAssetReserve] = amm_1.calculateAmmReservesAfterSwap(market.amm, inputAssetType, amount, amm_1.getSwapDirection(inputAssetType, direction));
|
|
68
68
|
const acquiredBase = market.amm.baseAssetReserve.sub(newBaseAssetReserve);
|
|
69
69
|
const acquiredQuote = market.amm.quoteAssetReserve.sub(newQuoteAssetReserve);
|
|
70
70
|
return [acquiredBase, acquiredQuote];
|
package/lib/math/utils.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/math/utils.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,YAAY,8CA0BxB,CAAC"}
|
package/lib/mockUSDCFaucet.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockUSDCFaucet.d.ts","sourceRoot":"","sources":["../src/mockUSDCFaucet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAO,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACN,WAAW,EAKX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EAIT,sBAAsB,EACtB,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,qBAAa,cAAc;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;gBAGrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,cAAc;IAUT,uCAAuC,IAAI,OAAO,CAC9D;QAAC,SAAS;QAAE,MAAM;KAAC,CACnB;IAOD,4BAA4B,CAAC,EAAE,SAAS,CAAC;IAC5B,+BAA+B,IAAI,OAAO,CAAC,SAAS,CAAC;IAUrD,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA8C3C,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IAM1B,UAAU,CACtB,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,EAAE,GACR,OAAO,CAAC,oBAAoB,CAAC;IAanB,qCAAqC,CACjD,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE,EAAE,GACR,OAAO,CAAC,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAWhC,iDAAiD,CAC7D,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE,EAAE,GACR,OAAO,CAAC,CAAC,SAAS,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAC;IA8B1D,gCAAgC,CAAC,KAAK,EAAE;QACpD,UAAU,EAAE,SAAS,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IAWrB,mBAAmB,CAAC,KAAK,EAAE;QACvC,UAAU,EAAE,SAAS,CAAC;KACtB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBX,uBAAuB,CAAC,KAAK,EAAE;QAC3C,UAAU,EAAE,SAAS,CAAC;QACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;KAC7C,GAAG,OAAO,CAAC,OAAO,CAAC;CAuBpB"}
|
package/lib/pythClient.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythClient.d.ts","sourceRoot":"","sources":["../src/pythClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,qBAAa,UAAU;IACtB,OAAO,CAAC,UAAU,CAAa;gBAEZ,UAAU,EAAE,UAAU;IAI5B,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;CAIxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultTxSender.d.ts","sourceRoot":"","sources":["../../src/tx/defaultTxSender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EACN,cAAc,EACd,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,qBAAa,eAAgB,YAAW,QAAQ;IAC/C,QAAQ,EAAE,QAAQ,CAAC;gBAEA,QAAQ,EAAE,QAAQ;IAIrC,IAAI,CACH,EAAE,EAAE,WAAW,EACf,iBAAiB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EACjC,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC;CAGhC"}
|
package/lib/tx/types.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tx/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,QAAQ;IACxB,IAAI,CACH,EAAE,EAAE,WAAW,EACf,iBAAiB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EACjC,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACjC"}
|
package/lib/tx/utils.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tx/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,wBAAgB,QAAQ,CAAC,WAAW,EAAE,sBAAsB,GAAG,WAAW,CAEzE"}
|
package/lib/types.d.ts
CHANGED
|
@@ -203,6 +203,8 @@ export declare type AMM = {
|
|
|
203
203
|
lastFundingRateTs: BN;
|
|
204
204
|
lastMarkPriceTwap: BN;
|
|
205
205
|
lastMarkPriceTwapTs: BN;
|
|
206
|
+
lastOraclePriceTwap: BN;
|
|
207
|
+
lastOraclePriceTwapTs: BN;
|
|
206
208
|
oracle: PublicKey;
|
|
207
209
|
oracleSource: OracleSource;
|
|
208
210
|
fundingPeriod: BN;
|
|
@@ -240,6 +242,7 @@ export interface Trade {
|
|
|
240
242
|
afterPrice: number;
|
|
241
243
|
side: TradeSide;
|
|
242
244
|
size: number;
|
|
245
|
+
quoteSize: number;
|
|
243
246
|
ts: number;
|
|
244
247
|
fee: number;
|
|
245
248
|
marketIndex: number;
|
|
@@ -274,9 +277,14 @@ export declare type Candle = {
|
|
|
274
277
|
};
|
|
275
278
|
export interface FundingPayment {
|
|
276
279
|
userPublicKey: string;
|
|
277
|
-
|
|
280
|
+
serverTs: number;
|
|
278
281
|
marketIndex: number;
|
|
279
282
|
amount: string;
|
|
283
|
+
blockchainTs: number;
|
|
284
|
+
baseAssetAmount: string;
|
|
285
|
+
userLastCumulativeFunding: string;
|
|
286
|
+
userLastFundingRateTs: string;
|
|
287
|
+
rate: number;
|
|
280
288
|
}
|
|
281
289
|
export interface IWallet {
|
|
282
290
|
signTransaction(tx: Transaction): Promise<Transaction>;
|
|
@@ -327,3 +335,4 @@ export declare type OracleGuardRails = {
|
|
|
327
335
|
};
|
|
328
336
|
useForLiquidations: boolean;
|
|
329
337
|
};
|
|
338
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drift-labs/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"types": "lib/index.d.ts",
|
|
6
6
|
"author": "crispheaney",
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "yarn clean && tsc",
|
|
14
14
|
"clean": "rm -rf lib",
|
|
15
|
-
"patch-and-pub": "npm version patch --force && npm publish"
|
|
15
|
+
"patch-and-pub": "npm version patch --force && npm publish",
|
|
16
|
+
"prettify": "prettier --write './src/**/*.{ts,tsx}'",
|
|
17
|
+
"lint": "eslint . --ext ts --ext tsx --ext js --quiet"
|
|
16
18
|
},
|
|
17
19
|
"keywords": [
|
|
18
20
|
"drift-labs",
|
|
@@ -34,6 +36,14 @@
|
|
|
34
36
|
"@types/bn.js": "^5.1.0",
|
|
35
37
|
"strict-event-emitter-types": "^2.0.0"
|
|
36
38
|
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "^4.28.0",
|
|
41
|
+
"@typescript-eslint/parser": "^4.28.0",
|
|
42
|
+
"eslint": "^7.29.0",
|
|
43
|
+
"eslint-config-prettier": "^8.3.0",
|
|
44
|
+
"eslint-plugin-prettier": "^3.4.0",
|
|
45
|
+
"prettier": "^2.4.1"
|
|
46
|
+
},
|
|
37
47
|
"description": "SDK for Drift Protocol v1",
|
|
38
48
|
"engines": {
|
|
39
49
|
"node": ">=12"
|
package/src/admin.ts
CHANGED
|
@@ -178,8 +178,8 @@ export class Admin extends ClearingHouse {
|
|
|
178
178
|
public async initializeMarket(
|
|
179
179
|
marketIndex: BN,
|
|
180
180
|
priceOracle: PublicKey,
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
baseAssetReserve: BN,
|
|
182
|
+
quoteAssetReserve: BN,
|
|
183
183
|
periodicity: BN,
|
|
184
184
|
pegMultiplier: BN = PEG_PRECISION
|
|
185
185
|
): Promise<TransactionSignature> {
|
|
@@ -189,8 +189,8 @@ export class Admin extends ClearingHouse {
|
|
|
189
189
|
|
|
190
190
|
const initializeMarketTx = await this.program.transaction.initializeMarket(
|
|
191
191
|
marketIndex,
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
baseAssetReserve,
|
|
193
|
+
quoteAssetReserve,
|
|
194
194
|
periodicity,
|
|
195
195
|
pegMultiplier,
|
|
196
196
|
{
|
package/src/clearingHouseUser.ts
CHANGED
|
@@ -86,8 +86,15 @@ export class ClearingHouseUser {
|
|
|
86
86
|
* @returns userPosition
|
|
87
87
|
*/
|
|
88
88
|
public getUserPosition(marketIndex: BN): UserPosition {
|
|
89
|
-
return
|
|
90
|
-
|
|
89
|
+
return (
|
|
90
|
+
this.getUserPositionsAccount().positions.find((position) =>
|
|
91
|
+
position.marketIndex.eq(marketIndex)
|
|
92
|
+
) ?? {
|
|
93
|
+
baseAssetAmount: ZERO,
|
|
94
|
+
lastCumulativeFundingRate: ZERO,
|
|
95
|
+
marketIndex,
|
|
96
|
+
quoteAssetAmount: ZERO,
|
|
97
|
+
}
|
|
91
98
|
);
|
|
92
99
|
}
|
|
93
100
|
|
|
@@ -217,8 +224,24 @@ export class ClearingHouseUser {
|
|
|
217
224
|
* calculates average exit price for closing 100% of position
|
|
218
225
|
* @returns : Precision MARK_PRICE_PRECISION
|
|
219
226
|
*/
|
|
220
|
-
public getPositionEstimatedExitPrice(
|
|
227
|
+
public getPositionEstimatedExitPrice(
|
|
228
|
+
position: UserPosition,
|
|
229
|
+
amountToClose?: BN
|
|
230
|
+
): BN {
|
|
221
231
|
const market = this.clearingHouse.getMarket(position.marketIndex);
|
|
232
|
+
|
|
233
|
+
if (amountToClose) {
|
|
234
|
+
if (amountToClose.eq(ZERO)) {
|
|
235
|
+
return calculateMarkPrice(market);
|
|
236
|
+
}
|
|
237
|
+
position = {
|
|
238
|
+
baseAssetAmount: amountToClose,
|
|
239
|
+
lastCumulativeFundingRate: position.lastCumulativeFundingRate,
|
|
240
|
+
marketIndex: position.marketIndex,
|
|
241
|
+
quoteAssetAmount: position.quoteAssetAmount,
|
|
242
|
+
} as UserPosition;
|
|
243
|
+
}
|
|
244
|
+
|
|
222
245
|
const baseAssetValue = calculateBaseAssetValue(market, position);
|
|
223
246
|
if (position.baseAssetAmount.eq(ZERO)) {
|
|
224
247
|
return ZERO;
|
|
@@ -388,7 +411,7 @@ export class ClearingHouseUser {
|
|
|
388
411
|
);
|
|
389
412
|
|
|
390
413
|
// if the position value after the trade is less than total collateral, there is no liq price
|
|
391
|
-
if (targetTotalPositionValueUSDC.lte(totalCollateralUSDC)) {
|
|
414
|
+
if (targetTotalPositionValueUSDC.lte(totalCollateralUSDC) && proposedMarketPosition.baseAssetAmount.gt(ZERO)) {
|
|
392
415
|
return new BN(-1);
|
|
393
416
|
}
|
|
394
417
|
|
package/src/config.ts
CHANGED
|
@@ -11,7 +11,7 @@ export const configs: { [key in DriftEnv]: DriftConfig } = {
|
|
|
11
11
|
devnet: {
|
|
12
12
|
ENV: 'devnet',
|
|
13
13
|
PYTH_ORACLE_MAPPING_ADDRESS: 'BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2',
|
|
14
|
-
CLEARING_HOUSE_PROGRAM_ID: '
|
|
14
|
+
CLEARING_HOUSE_PROGRAM_ID: 'AsW7LnXB9UA1uec9wi9MctYTgTz7YH9snhxd16GsFaGX',
|
|
15
15
|
USDC_MINT_ADDRESS: '8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2',
|
|
16
16
|
},
|
|
17
17
|
'mainnet-beta': {
|
package/src/constants/markets.ts
CHANGED
|
@@ -16,25 +16,32 @@ export const Markets: Market[] = [
|
|
|
16
16
|
devnetPythOracle: 'J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix',
|
|
17
17
|
mainnetPythOracle: 'H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG',
|
|
18
18
|
},
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
19
|
+
{
|
|
20
|
+
symbol: 'BTC-PERP',
|
|
21
|
+
baseAssetSymbol: 'BTC',
|
|
22
|
+
marketIndex: new BN(1),
|
|
23
|
+
devnetPythOracle: 'HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J',
|
|
24
|
+
mainnetPythOracle: 'GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
symbol: 'ETH-PERP',
|
|
28
|
+
baseAssetSymbol: 'ETH',
|
|
29
|
+
marketIndex: new BN(2),
|
|
30
|
+
devnetPythOracle: 'EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw',
|
|
31
|
+
mainnetPythOracle: 'JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
symbol: 'LUNA-PERP',
|
|
35
|
+
baseAssetSymbol: 'LUNA',
|
|
36
|
+
marketIndex: new BN(3),
|
|
37
|
+
devnetPythOracle: '8PugCXTAHLM9kfLSQWe2njE5pzAgUdpPk3Nx5zSm7BD3',
|
|
38
|
+
mainnetPythOracle: '5bmWuR1dgP4avtGYMNKLuxumZTVKGgoN2BCMXWDNL9nY',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
symbol: 'AVAX-PERP',
|
|
42
|
+
baseAssetSymbol: 'AVAX',
|
|
43
|
+
marketIndex: new BN(4),
|
|
44
|
+
devnetPythOracle: 'FVb5h1VmHPfVb1RfqZckchq18GxRv4iKt8T4eVTQAqdz',
|
|
45
|
+
mainnetPythOracle: 'Ax9ujW5B9oqcv59N8m6f1BpTBq2rGeGaBcpKjC5UYsXU',
|
|
46
|
+
},
|
|
40
47
|
];
|