@sonarwatch/portfolio-plugins 0.12.36 → 0.12.38

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. package/CHANGELOG.md +1847 -1839
  2. package/README.md +3 -3
  3. package/package.json +1 -1
  4. package/src/plugins/allbridge/constants.d.ts +0 -1
  5. package/src/plugins/allbridge/constants.js +1 -2
  6. package/src/plugins/allbridge/constants.js.map +1 -1
  7. package/src/plugins/allbridge/positionsFetcher.js +6 -2
  8. package/src/plugins/allbridge/positionsFetcher.js.map +1 -1
  9. package/src/plugins/balancer/helpers/pools.js +21 -21
  10. package/src/plugins/banx/constants.d.ts +0 -1
  11. package/src/plugins/banx/constants.js +1 -2
  12. package/src/plugins/banx/constants.js.map +1 -1
  13. package/src/plugins/banx/idl.d.ts +15 -7
  14. package/src/plugins/banx/idl.js +199 -268
  15. package/src/plugins/banx/idl.js.map +1 -1
  16. package/src/plugins/banx/loansFetcher.js +19 -23
  17. package/src/plugins/banx/loansFetcher.js.map +1 -1
  18. package/src/plugins/banx/offersFetcher.js +10 -15
  19. package/src/plugins/banx/offersFetcher.js.map +1 -1
  20. package/src/plugins/citrus/collectionsJob.js.map +1 -1
  21. package/src/plugins/citrus/constants.d.ts +0 -1
  22. package/src/plugins/citrus/constants.js +1 -2
  23. package/src/plugins/citrus/constants.js.map +1 -1
  24. package/src/plugins/citrus/loansFetcher.js +14 -20
  25. package/src/plugins/citrus/loansFetcher.js.map +1 -1
  26. package/src/plugins/drift/constants.d.ts +1 -0
  27. package/src/plugins/drift/constants.js +2 -1
  28. package/src/plugins/drift/constants.js.map +1 -1
  29. package/src/plugins/drift/depositsFetcher.js +63 -1
  30. package/src/plugins/drift/depositsFetcher.js.map +1 -1
  31. package/src/plugins/drift/filters.d.ts +1 -0
  32. package/src/plugins/drift/filters.js +4 -1
  33. package/src/plugins/drift/filters.js.map +1 -1
  34. package/src/plugins/drift/index.js +2 -1
  35. package/src/plugins/drift/index.js.map +1 -1
  36. package/src/plugins/drift/perpHelpers/amm.d.ts +74 -0
  37. package/src/plugins/drift/perpHelpers/amm.js +567 -0
  38. package/src/plugins/drift/perpHelpers/amm.js.map +1 -0
  39. package/src/plugins/drift/perpHelpers/assert.d.ts +1 -0
  40. package/src/plugins/drift/perpHelpers/assert.js +10 -0
  41. package/src/plugins/drift/perpHelpers/assert.js.map +1 -0
  42. package/src/plugins/drift/perpHelpers/constants.d.ts +27 -0
  43. package/src/plugins/drift/perpHelpers/constants.js +35 -0
  44. package/src/plugins/drift/perpHelpers/constants.js.map +1 -0
  45. package/src/plugins/drift/perpHelpers/convert.d.ts +0 -0
  46. package/src/plugins/drift/perpHelpers/convert.js +2 -0
  47. package/src/plugins/drift/perpHelpers/convert.js.map +1 -0
  48. package/src/plugins/drift/perpHelpers/getOraclePrice.d.ts +4 -0
  49. package/src/plugins/drift/perpHelpers/getOraclePrice.js +61 -0
  50. package/src/plugins/drift/perpHelpers/getOraclePrice.js.map +1 -0
  51. package/src/plugins/drift/perpHelpers/getPerpMarket.d.ts +4 -0
  52. package/src/plugins/drift/perpHelpers/getPerpMarket.js +33 -0
  53. package/src/plugins/drift/perpHelpers/getPerpMarket.js.map +1 -0
  54. package/src/plugins/drift/perpHelpers/margin.d.ts +10 -0
  55. package/src/plugins/drift/perpHelpers/margin.js +82 -0
  56. package/src/plugins/drift/perpHelpers/margin.js.map +1 -0
  57. package/src/plugins/drift/perpHelpers/math.d.ts +4 -0
  58. package/src/plugins/drift/perpHelpers/math.js +29 -0
  59. package/src/plugins/drift/perpHelpers/math.js.map +1 -0
  60. package/src/plugins/drift/perpHelpers/oracle.d.ts +6 -0
  61. package/src/plugins/drift/perpHelpers/oracle.js +54 -0
  62. package/src/plugins/drift/perpHelpers/oracle.js.map +1 -0
  63. package/src/plugins/drift/perpHelpers/orders.d.ts +2 -0
  64. package/src/plugins/drift/perpHelpers/orders.js +9 -0
  65. package/src/plugins/drift/perpHelpers/orders.js.map +1 -0
  66. package/src/plugins/drift/perpHelpers/position.d.ts +44 -0
  67. package/src/plugins/drift/perpHelpers/position.js +184 -0
  68. package/src/plugins/drift/perpHelpers/position.js.map +1 -0
  69. package/src/plugins/drift/perpHelpers/prelaunchOracle.d.ts +3 -0
  70. package/src/plugins/drift/perpHelpers/prelaunchOracle.js +20 -0
  71. package/src/plugins/drift/perpHelpers/prelaunchOracle.js.map +1 -0
  72. package/src/plugins/drift/perpHelpers/pyth.d.ts +5 -0
  73. package/src/plugins/drift/perpHelpers/pyth.js +42 -0
  74. package/src/plugins/drift/perpHelpers/pyth.js.map +1 -0
  75. package/src/plugins/drift/perpHelpers/repeg.d.ts +14 -0
  76. package/src/plugins/drift/perpHelpers/repeg.js +162 -0
  77. package/src/plugins/drift/perpHelpers/repeg.js.map +1 -0
  78. package/src/plugins/drift/perpHelpers/switchboard.d.ts +3 -0
  79. package/src/plugins/drift/perpHelpers/switchboard.js +31 -0
  80. package/src/plugins/drift/perpHelpers/switchboard.js.map +1 -0
  81. package/src/plugins/drift/perpHelpers/types.d.ts +28 -0
  82. package/src/plugins/drift/perpHelpers/types.js +19 -0
  83. package/src/plugins/drift/perpHelpers/types.js.map +1 -0
  84. package/src/plugins/drift/prepMarketsJob.d.ts +3 -0
  85. package/src/plugins/drift/prepMarketsJob.js +38 -0
  86. package/src/plugins/drift/prepMarketsJob.js.map +1 -0
  87. package/src/plugins/drift/struct.d.ts +82 -76
  88. package/src/plugins/drift/struct.js +79 -74
  89. package/src/plugins/drift/struct.js.map +1 -1
  90. package/src/plugins/drift/types.d.ts +1 -0
  91. package/src/plugins/jupiter/exchange/constants.d.ts +1 -0
  92. package/src/plugins/jupiter/exchange/constants.js +2 -1
  93. package/src/plugins/jupiter/exchange/constants.js.map +1 -1
  94. package/src/plugins/jupiter/exchange/limitFetcher.js +9 -6
  95. package/src/plugins/jupiter/exchange/limitFetcher.js.map +1 -1
  96. package/src/plugins/jupiter/exchange/perpetualFetcher.js +3 -6
  97. package/src/plugins/jupiter/exchange/perpetualFetcher.js.map +1 -1
  98. package/src/plugins/jupiter/exchange/structs.d.ts +21 -0
  99. package/src/plugins/jupiter/exchange/structs.js +21 -1
  100. package/src/plugins/jupiter/exchange/structs.js.map +1 -1
  101. package/src/plugins/jupiter/exchange/valueAverageFetcher.js.map +1 -1
  102. package/src/plugins/jupiter/helpers.d.ts +2 -2
  103. package/src/plugins/jupiter/helpers.js.map +1 -1
  104. package/src/plugins/rain/collectionsJob.js +6 -10
  105. package/src/plugins/rain/collectionsJob.js.map +1 -1
  106. package/src/plugins/rain/helpers.js +3 -1
  107. package/src/plugins/rain/helpers.js.map +1 -1
  108. package/src/plugins/rain/index.js +2 -1
  109. package/src/plugins/rain/index.js.map +1 -1
  110. package/src/plugins/rain/loansFetcher.js +60 -25
  111. package/src/plugins/rain/loansFetcher.js.map +1 -1
  112. package/src/plugins/rain/types.d.ts +3 -0
  113. package/src/plugins/sharky/constants.d.ts +0 -1
  114. package/src/plugins/sharky/constants.js +3 -4
  115. package/src/plugins/sharky/constants.js.map +1 -1
  116. package/src/plugins/sharky/loansFetcher.js +17 -20
  117. package/src/plugins/sharky/loansFetcher.js.map +1 -1
  118. package/src/plugins/sushiswap/helpers.js +24 -24
  119. package/src/plugins/uniswap-v2/helpers.js +22 -22
  120. package/src/plugins/zeta/airdropFetcher.js +14 -14
  121. package/src/utils/misc/MemoizedCache.d.ts +12 -0
  122. package/src/utils/misc/MemoizedCache.js +35 -0
  123. package/src/utils/misc/MemoizedCache.js.map +1 -0
  124. package/src/utils/misc/arrayToMap.d.ts +1 -0
  125. package/src/utils/misc/arrayToMap.js +12 -0
  126. package/src/utils/misc/arrayToMap.js.map +1 -0
  127. package/src/utils/misc/pick.d.ts +2 -0
  128. package/src/utils/misc/pick.js +16 -0
  129. package/src/utils/misc/pick.js.map +1 -0
  130. package/src/utils/sei/constants.js +8 -8
  131. package/src/utils/sei/getQueryBalanceByOwner.js +4 -4
  132. package/src/utils/solana/getAutoParsedMultipleAccountsInfo.js +8 -3
  133. package/src/utils/solana/getAutoParsedMultipleAccountsInfo.js.map +1 -1
  134. package/src/plugins/allbridge/getPoolInfo.d.ts +0 -3
  135. package/src/plugins/allbridge/getPoolInfo.js +0 -28
  136. package/src/plugins/allbridge/getPoolInfo.js.map +0 -1
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hasOpenOrders = exports.isEmptyPosition = exports.positionCurrentDirection = exports.findDirectionToClose = exports.calculateCostBasis = exports.calculateEntryPrice = exports.calculateBreakEvenPrice = exports.positionIsAvailable = exports.calculatePositionFundingPNL = exports.calculatePositionPNL = exports.calculateBaseAssetValue = void 0;
7
+ const bn_js_1 = __importDefault(require("bn.js"));
8
+ const constants_1 = require("./constants");
9
+ const types_1 = require("./types");
10
+ const amm_1 = require("./amm");
11
+ const margin_1 = require("./margin");
12
+ function calculateBaseAssetValue(market, userPosition, oraclePriceData, useSpread = true, skipUpdate = false) {
13
+ if (userPosition.baseAssetAmount.eq(constants_1.ZERO)) {
14
+ return constants_1.ZERO;
15
+ }
16
+ const directionToClose = findDirectionToClose(userPosition);
17
+ let prepegAmm;
18
+ if (!skipUpdate) {
19
+ if (market.amm.baseSpread > 0 && useSpread) {
20
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, oraclePriceData);
21
+ prepegAmm = {
22
+ baseAssetReserve,
23
+ quoteAssetReserve,
24
+ sqrtK,
25
+ pegMultiplier: newPeg,
26
+ };
27
+ }
28
+ else {
29
+ prepegAmm = (0, amm_1.calculateUpdatedAMM)(market.amm, oraclePriceData);
30
+ }
31
+ }
32
+ else {
33
+ prepegAmm = market.amm;
34
+ }
35
+ const [newQuoteAssetReserve] = (0, amm_1.calculateAmmReservesAfterSwap)(prepegAmm, 'base', userPosition.baseAssetAmount.abs(), (0, amm_1.getSwapDirection)('base', directionToClose));
36
+ switch (directionToClose) {
37
+ case types_1.PositionDirection.SHORT:
38
+ return prepegAmm.quoteAssetReserve
39
+ .sub(newQuoteAssetReserve)
40
+ .mul(prepegAmm.pegMultiplier)
41
+ .div(constants_1.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO);
42
+ case types_1.PositionDirection.LONG:
43
+ return newQuoteAssetReserve
44
+ .sub(prepegAmm.quoteAssetReserve)
45
+ .mul(prepegAmm.pegMultiplier)
46
+ .div(constants_1.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO)
47
+ .add(constants_1.ONE);
48
+ default:
49
+ throw new Error('Failed to calculateBaseAssetValue');
50
+ }
51
+ }
52
+ exports.calculateBaseAssetValue = calculateBaseAssetValue;
53
+ /**
54
+ * calculatePositionPNL
55
+ * = BaseAssetAmount * (Avg Exit Price - Avg Entry Price)
56
+ * @param market
57
+ * @param PerpPosition
58
+ * @param withFunding (adds unrealized funding payment pnl to result)
59
+ * @param oraclePriceData
60
+ * @returns BaseAssetAmount : Precision QUOTE_PRECISION
61
+ */
62
+ function calculatePositionPNL(market, perpPosition, oraclePriceData, withFunding = false) {
63
+ if (perpPosition.baseAssetAmount.eq(constants_1.ZERO)) {
64
+ return perpPosition.quoteAssetAmount;
65
+ }
66
+ const baseAssetValue = (0, margin_1.calculateBaseAssetValueWithOracle)(market, perpPosition, oraclePriceData);
67
+ const baseAssetValueSign = perpPosition.baseAssetAmount.isNeg()
68
+ ? new bn_js_1.default(-1)
69
+ : new bn_js_1.default(1);
70
+ let pnl = baseAssetValue
71
+ .mul(baseAssetValueSign)
72
+ .add(perpPosition.quoteAssetAmount);
73
+ if (withFunding) {
74
+ const fundingRatePnL = calculatePositionFundingPNL(market, perpPosition);
75
+ pnl = pnl.add(fundingRatePnL);
76
+ }
77
+ return pnl;
78
+ }
79
+ exports.calculatePositionPNL = calculatePositionPNL;
80
+ /**
81
+ *
82
+ * @param market
83
+ * @param PerpPosition
84
+ * @returns // QUOTE_PRECISION
85
+ */
86
+ function calculatePositionFundingPNL(market, perpPosition) {
87
+ if (perpPosition.baseAssetAmount.eq(constants_1.ZERO)) {
88
+ return constants_1.ZERO;
89
+ }
90
+ let ammCumulativeFundingRate;
91
+ if (perpPosition.baseAssetAmount.gt(constants_1.ZERO)) {
92
+ ammCumulativeFundingRate = market.amm.cumulativeFundingRateLong;
93
+ }
94
+ else {
95
+ ammCumulativeFundingRate = market.amm.cumulativeFundingRateShort;
96
+ }
97
+ const perPositionFundingRate = ammCumulativeFundingRate
98
+ .sub(perpPosition.lastCumulativeFundingRate)
99
+ .mul(perpPosition.baseAssetAmount)
100
+ .div(constants_1.AMM_RESERVE_PRECISION)
101
+ .div(constants_1.FUNDING_RATE_BUFFER_PRECISION)
102
+ .mul(new bn_js_1.default(-1));
103
+ return perPositionFundingRate;
104
+ }
105
+ exports.calculatePositionFundingPNL = calculatePositionFundingPNL;
106
+ function positionIsAvailable(position) {
107
+ return (position.baseAssetAmount.eq(constants_1.ZERO) &&
108
+ position.openOrders === 0 &&
109
+ position.quoteAssetAmount.eq(constants_1.ZERO) &&
110
+ position.lpShares.eq(constants_1.ZERO));
111
+ }
112
+ exports.positionIsAvailable = positionIsAvailable;
113
+ /**
114
+ *
115
+ * @param userPosition
116
+ * @returns Precision: PRICE_PRECISION (10^6)
117
+ */
118
+ function calculateBreakEvenPrice(userPosition) {
119
+ if (userPosition.baseAssetAmount.eq(constants_1.ZERO)) {
120
+ return constants_1.ZERO;
121
+ }
122
+ return userPosition.quoteBreakEvenAmount
123
+ .mul(constants_1.PRICE_PRECISION)
124
+ .mul(constants_1.AMM_TO_QUOTE_PRECISION_RATIO)
125
+ .div(userPosition.baseAssetAmount)
126
+ .abs();
127
+ }
128
+ exports.calculateBreakEvenPrice = calculateBreakEvenPrice;
129
+ /**
130
+ *
131
+ * @param userPosition
132
+ * @returns Precision: PRICE_PRECISION (10^6)
133
+ */
134
+ function calculateEntryPrice(userPosition) {
135
+ if (userPosition.baseAssetAmount.eq(constants_1.ZERO)) {
136
+ return constants_1.ZERO;
137
+ }
138
+ return userPosition.quoteEntryAmount
139
+ .mul(constants_1.PRICE_PRECISION)
140
+ .mul(constants_1.AMM_TO_QUOTE_PRECISION_RATIO)
141
+ .div(userPosition.baseAssetAmount)
142
+ .abs();
143
+ }
144
+ exports.calculateEntryPrice = calculateEntryPrice;
145
+ /**
146
+ *
147
+ * @param userPosition
148
+ * @returns Precision: PRICE_PRECISION (10^10)
149
+ */
150
+ function calculateCostBasis(userPosition, includeSettledPnl = false) {
151
+ if (userPosition.baseAssetAmount.eq(constants_1.ZERO)) {
152
+ return constants_1.ZERO;
153
+ }
154
+ return userPosition.quoteAssetAmount
155
+ .add(includeSettledPnl ? userPosition.settledPnl : constants_1.ZERO)
156
+ .mul(constants_1.PRICE_PRECISION)
157
+ .mul(constants_1.AMM_TO_QUOTE_PRECISION_RATIO)
158
+ .div(userPosition.baseAssetAmount)
159
+ .abs();
160
+ }
161
+ exports.calculateCostBasis = calculateCostBasis;
162
+ function findDirectionToClose(userPosition) {
163
+ return userPosition.baseAssetAmount.gt(constants_1.ZERO)
164
+ ? types_1.PositionDirection.SHORT
165
+ : types_1.PositionDirection.LONG;
166
+ }
167
+ exports.findDirectionToClose = findDirectionToClose;
168
+ function positionCurrentDirection(userPosition) {
169
+ return userPosition.baseAssetAmount.gte(constants_1.ZERO)
170
+ ? types_1.PositionDirection.LONG
171
+ : types_1.PositionDirection.SHORT;
172
+ }
173
+ exports.positionCurrentDirection = positionCurrentDirection;
174
+ function isEmptyPosition(userPosition) {
175
+ return userPosition.baseAssetAmount.eq(constants_1.ZERO) && userPosition.openOrders === 0;
176
+ }
177
+ exports.isEmptyPosition = isEmptyPosition;
178
+ function hasOpenOrders(position) {
179
+ return (position.openOrders !== 0 ||
180
+ !position.openBids.eq(constants_1.ZERO) ||
181
+ !position.openAsks.eq(constants_1.ZERO));
182
+ }
183
+ exports.hasOpenOrders = hasOpenOrders;
184
+ //# sourceMappingURL=position.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../../../../../../../packages/plugins/src/plugins/drift/perpHelpers/position.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ import { OraclePriceData } from './types';
3
+ export declare function getPreLaunchOraclePriceDataFromBuffer(buffer: Buffer): OraclePriceData;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPreLaunchOraclePriceDataFromBuffer = void 0;
7
+ const bn_js_1 = __importDefault(require("bn.js"));
8
+ const struct_1 = require("../struct");
9
+ function getPreLaunchOraclePriceDataFromBuffer(buffer) {
10
+ const [prelaunchOracle] = struct_1.preLaunchOracleStruct.deserialize(buffer);
11
+ return {
12
+ price: new bn_js_1.default(prelaunchOracle.price.toString(10), 10),
13
+ slot: new bn_js_1.default(prelaunchOracle.ammLastUpdateSlot.toString(10), 10),
14
+ confidence: new bn_js_1.default(prelaunchOracle.confidence.toString(10), 10),
15
+ hasSufficientNumberOfDataPoints: true,
16
+ maxPrice: new bn_js_1.default(prelaunchOracle.maxPrice.toString(10), 10),
17
+ };
18
+ }
19
+ exports.getPreLaunchOraclePriceDataFromBuffer = getPreLaunchOraclePriceDataFromBuffer;
20
+ //# sourceMappingURL=prelaunchOracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prelaunchOracle.js","sourceRoot":"","sources":["../../../../../../../packages/plugins/src/plugins/drift/perpHelpers/prelaunchOracle.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAuB;AAEvB,sCAAkD;AAElD,SAAgB,qCAAqC,CACnD,MAAc;IAEd,MAAM,CAAC,eAAe,CAAC,GAAG,8BAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAEpE,OAAO;QACL,KAAK,EAAE,IAAI,eAAE,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,IAAI,EAAE,IAAI,eAAE,CAAC,eAAe,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChE,UAAU,EAAE,IAAI,eAAE,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/D,+BAA+B,EAAE,IAAI;QACrC,QAAQ,EAAE,IAAI,eAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAZD,sFAYC"}
@@ -0,0 +1,5 @@
1
+ /// <reference types="node" />
2
+ import BN from 'bn.js';
3
+ import { OraclePriceData } from './types';
4
+ export declare function getPythOraclePriceDataFromBuffer(buffer: Buffer, multiple: BN, stableCoin: boolean): OraclePriceData;
5
+ export declare function convertPythPrice(price: number, exponent: number, multiple: BN): BN;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.convertPythPrice = exports.getPythOraclePriceDataFromBuffer = void 0;
7
+ /* eslint-disable no-param-reassign */
8
+ const bn_js_1 = __importDefault(require("bn.js"));
9
+ const helpers_1 = require("../../../utils/solana/pyth/helpers");
10
+ const constants_1 = require("./constants");
11
+ function getPythOraclePriceDataFromBuffer(buffer, multiple, stableCoin) {
12
+ const priceData = (0, helpers_1.parsePriceData)(buffer);
13
+ const confidence = convertPythPrice(priceData.confidence || 0, priceData.exponent, multiple);
14
+ const minPublishers = Math.min(priceData.numComponentPrices, 3);
15
+ let price = convertPythPrice(priceData.aggregate.price, priceData.exponent, multiple);
16
+ if (stableCoin) {
17
+ price = getStableCoinPrice(price, confidence);
18
+ }
19
+ return {
20
+ price,
21
+ slot: new bn_js_1.default(priceData.lastSlot.toString()),
22
+ confidence,
23
+ twap: convertPythPrice(priceData.emaPrice.value, priceData.exponent, multiple),
24
+ twapConfidence: convertPythPrice(priceData.emaConfidence.value, priceData.exponent, multiple),
25
+ hasSufficientNumberOfDataPoints: priceData.numQuoters >= minPublishers,
26
+ };
27
+ }
28
+ exports.getPythOraclePriceDataFromBuffer = getPythOraclePriceDataFromBuffer;
29
+ function convertPythPrice(price, exponent, multiple) {
30
+ exponent = Math.abs(exponent);
31
+ const pythPrecision = constants_1.TEN.pow(new bn_js_1.default(exponent).abs()).div(multiple);
32
+ return new bn_js_1.default(price * Math.pow(10, exponent)).mul(constants_1.PRICE_PRECISION).div(pythPrecision);
33
+ }
34
+ exports.convertPythPrice = convertPythPrice;
35
+ const fiveBPS = new bn_js_1.default(500);
36
+ function getStableCoinPrice(price, confidence) {
37
+ if (price.sub(constants_1.QUOTE_PRECISION).abs().lt(bn_js_1.default.min(confidence, fiveBPS))) {
38
+ return constants_1.QUOTE_PRECISION;
39
+ }
40
+ return price;
41
+ }
42
+ //# sourceMappingURL=pyth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyth.js","sourceRoot":"","sources":["../../../../../../../packages/plugins/src/plugins/drift/perpHelpers/pyth.ts"],"names":[],"mappings":";;;;;;AAAA,sCAAsC;AACtC,kDAAuB;AACvB,gEAAoE;AACpE,2CAAoE;AAGpE,SAAgB,gCAAgC,CAC9C,MAAc,EACd,QAAY,EACZ,UAAmB;IAEnB,MAAM,SAAS,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,gBAAgB,CACjC,SAAS,CAAC,UAAU,IAAI,CAAC,EACzB,SAAS,CAAC,QAAQ,EAClB,QAAQ,CACT,CAAC;IACF,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,GAAG,gBAAgB,CAC1B,SAAS,CAAC,SAAS,CAAC,KAAK,EACzB,SAAS,CAAC,QAAQ,EAClB,QAAQ,CACT,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,KAAK;QACL,IAAI,EAAE,IAAI,eAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC3C,UAAU;QACV,IAAI,EAAE,gBAAgB,CACpB,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB,SAAS,CAAC,QAAQ,EAClB,QAAQ,CACT;QACD,cAAc,EAAE,gBAAgB,CAC9B,SAAS,CAAC,aAAa,CAAC,KAAK,EAC7B,SAAS,CAAC,QAAQ,EAClB,QAAQ,CACT;QACD,+BAA+B,EAAE,SAAS,CAAC,UAAU,IAAI,aAAa;KACvE,CAAC;AACJ,CAAC;AArCD,4EAqCC;AAED,SAAgB,gBAAgB,CAC9B,KAAa,EACb,QAAgB,EAChB,QAAY;IAEZ,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,aAAa,GAAG,eAAG,CAAC,GAAG,CAAC,IAAI,eAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpE,OAAO,IAAI,eAAE,CAAC,KAAK,GAAG,SAAA,EAAE,EAAI,QAAQ,CAAA,CAAC,CAAC,GAAG,CAAC,2BAAe,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAChF,CAAC;AARD,4CAQC;AAED,MAAM,OAAO,GAAG,IAAI,eAAE,CAAC,GAAG,CAAC,CAAC;AAC5B,SAAS,kBAAkB,CAAC,KAAS,EAAE,UAAc;IACnD,IAAI,KAAK,CAAC,GAAG,CAAC,2BAAe,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAE,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,2BAAe,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,14 @@
1
+ import BN from 'bn.js';
2
+ import { AMM } from '../struct';
3
+ export declare function calculateAdjustKCost(amm: AMM, numerator: BN, denomenator: BN): BN;
4
+ /**
5
+ * Helper function calculating adjust pegMultiplier (repeg) cost
6
+ *
7
+ * @param amm
8
+ * @param newPeg
9
+ * @returns cost : Precision QUOTE_ASSET_PRECISION
10
+ */
11
+ export declare function calculateRepegCost(amm: AMM, newPeg: BN): BN;
12
+ export declare function calculateBudgetedKBN(x: BN, y: BN, budget: BN, Q: BN, d: BN): [BN, BN];
13
+ export declare function calculateBudgetedK(amm: AMM, cost: BN): [BN, BN];
14
+ export declare function calculateBudgetedPeg(amm: AMM, budget: BN, targetPrice: BN): BN;
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.calculateBudgetedPeg = exports.calculateBudgetedK = exports.calculateBudgetedKBN = exports.calculateRepegCost = exports.calculateAdjustKCost = void 0;
7
+ /* eslint-disable @typescript-eslint/naming-convention */
8
+ const bn_js_1 = __importDefault(require("bn.js"));
9
+ const constants_1 = require("./constants");
10
+ const assert_1 = require("./assert");
11
+ function calculateAdjustKCost(amm, numerator, denomenator) {
12
+ // const k = market.amm.sqrtK.mul(market.amm.sqrtK);
13
+ const x = amm.baseAssetReserve;
14
+ const y = amm.quoteAssetReserve;
15
+ const d = amm.baseAssetAmountWithAmm;
16
+ const Q = amm.pegMultiplier;
17
+ const quoteScale = y.mul(d).mul(Q); // .div(AMM_RESERVE_PRECISION);
18
+ const p = numerator.mul(constants_1.PRICE_PRECISION).div(denomenator);
19
+ const cost = quoteScale
20
+ .mul(constants_1.PERCENTAGE_PRECISION)
21
+ .mul(constants_1.PERCENTAGE_PRECISION)
22
+ .div(x.add(d))
23
+ .sub(quoteScale
24
+ .mul(p)
25
+ .mul(constants_1.PERCENTAGE_PRECISION)
26
+ .mul(constants_1.PERCENTAGE_PRECISION)
27
+ .div(constants_1.PRICE_PRECISION)
28
+ .div(x.mul(p).div(constants_1.PRICE_PRECISION).add(d)))
29
+ .div(constants_1.PERCENTAGE_PRECISION)
30
+ .div(constants_1.PERCENTAGE_PRECISION)
31
+ .div(constants_1.AMM_TO_QUOTE_PRECISION_RATIO)
32
+ .div(constants_1.PEG_PRECISION);
33
+ return cost.mul(new bn_js_1.default(-1));
34
+ }
35
+ exports.calculateAdjustKCost = calculateAdjustKCost;
36
+ // /**
37
+ // * Helper function calculating adjust k cost
38
+ // * @param amm
39
+ // * @param numerator
40
+ // * @param denomenator
41
+ // * @returns cost : Precision QUOTE_ASSET_PRECISION
42
+ // */
43
+ // export function calculateAdjustKCost2(
44
+ // amm: AMM,
45
+ // numerator: BN,
46
+ // denomenator: BN
47
+ // ): BN {
48
+ // // const k = market.amm.sqrtK.mul(market.amm.sqrtK);
49
+ // const directionToClose = amm.baseAssetAmountWithAmm.gt(ZERO)
50
+ // ? PositionDirection.SHORT
51
+ // : PositionDirection.LONG;
52
+ // const [newQuoteAssetReserve, _newBaseAssetReserve] =
53
+ // calculateAmmReservesAfterSwap(
54
+ // amm,
55
+ // 'base',
56
+ // amm.baseAssetAmountWithAmm.abs(),
57
+ // getSwapDirection('base', directionToClose)
58
+ // );
59
+ // }
60
+ /**
61
+ * Helper function calculating adjust pegMultiplier (repeg) cost
62
+ *
63
+ * @param amm
64
+ * @param newPeg
65
+ * @returns cost : Precision QUOTE_ASSET_PRECISION
66
+ */
67
+ function calculateRepegCost(amm, newPeg) {
68
+ const dqar = amm.quoteAssetReserve.sub(amm.terminalQuoteAssetReserve);
69
+ const cost = dqar
70
+ .mul(newPeg.sub(amm.pegMultiplier))
71
+ .div(constants_1.AMM_TO_QUOTE_PRECISION_RATIO)
72
+ .div(constants_1.PEG_PRECISION);
73
+ return cost;
74
+ }
75
+ exports.calculateRepegCost = calculateRepegCost;
76
+ function calculateBudgetedKBN(x, y, budget, Q, d) {
77
+ (0, assert_1.assert)(Q.gt(new bn_js_1.default(0)));
78
+ const C = budget.mul(new bn_js_1.default(-1));
79
+ let dSign = new bn_js_1.default(1);
80
+ if (d.lt(new bn_js_1.default(0))) {
81
+ dSign = new bn_js_1.default(-1);
82
+ }
83
+ const pegged_y_d_d = y
84
+ .mul(d)
85
+ .mul(d)
86
+ .mul(Q)
87
+ .div(constants_1.AMM_RESERVE_PRECISION)
88
+ .div(constants_1.AMM_RESERVE_PRECISION)
89
+ .div(constants_1.PEG_PRECISION);
90
+ const numer1 = pegged_y_d_d;
91
+ const numer2 = C.mul(d)
92
+ .div(constants_1.QUOTE_PRECISION)
93
+ .mul(x.add(d))
94
+ .div(constants_1.AMM_RESERVE_PRECISION)
95
+ .mul(dSign);
96
+ const denom1 = C.mul(x)
97
+ .mul(x.add(d))
98
+ .div(constants_1.AMM_RESERVE_PRECISION)
99
+ .div(constants_1.QUOTE_PRECISION);
100
+ const denom2 = pegged_y_d_d;
101
+ // protocol is spending to increase k
102
+ if (C.lt(constants_1.ZERO)) {
103
+ // thus denom1 is negative and solution is unstable
104
+ if (denom1.abs().gt(denom2.abs())) {
105
+ // console.log('denom1 > denom2', denom1.toString(), denom2.toString());
106
+ // console.log('budget cost exceeds stable K solution');
107
+ return [new bn_js_1.default(10000), new bn_js_1.default(1)];
108
+ }
109
+ }
110
+ const numerator = numer1.sub(numer2).div(constants_1.AMM_TO_QUOTE_PRECISION_RATIO);
111
+ const denominator = denom1.add(denom2).div(constants_1.AMM_TO_QUOTE_PRECISION_RATIO);
112
+ return [numerator, denominator];
113
+ }
114
+ exports.calculateBudgetedKBN = calculateBudgetedKBN;
115
+ function calculateBudgetedK(amm, cost) {
116
+ // wolframalpha.com
117
+ // (1/(x+d) - p/(x*p+d))*y*d*Q = C solve for p
118
+ // p = (d(y*d*Q - C(x+d))) / (C*x(x+d) + y*d*d*Q)
119
+ // numer
120
+ // = y*d*d*Q - Cxd - Cdd
121
+ // = y/x*Q*d*d - Cd - Cd/x
122
+ // = mark - C/d - C/(x)
123
+ // = mark/C - 1/d - 1/x
124
+ // denom
125
+ // = C*x*x + C*x*d + y*d*d*Q
126
+ // = x/d**2 + 1 / d + mark/C
127
+ // todo: assumes k = x * y
128
+ // otherwise use: (y(1-p) + (kp^2/(x*p+d)) - k/(x+d)) * Q = C solve for p
129
+ const x = amm.baseAssetReserve;
130
+ const y = amm.quoteAssetReserve;
131
+ const d = amm.baseAssetAmountWithAmm;
132
+ const Q = amm.pegMultiplier;
133
+ const [numerator, denominator] = calculateBudgetedKBN(x, y, cost, Q, d);
134
+ return [numerator, denominator];
135
+ }
136
+ exports.calculateBudgetedK = calculateBudgetedK;
137
+ function calculateBudgetedPeg(amm, budget, targetPrice) {
138
+ let perPegCost = amm.quoteAssetReserve
139
+ .sub(amm.terminalQuoteAssetReserve)
140
+ .div(constants_1.AMM_RESERVE_PRECISION.div(constants_1.PRICE_PRECISION));
141
+ if (perPegCost.gt(constants_1.ZERO)) {
142
+ perPegCost = perPegCost.add(constants_1.ONE);
143
+ }
144
+ else if (perPegCost.lt(constants_1.ZERO)) {
145
+ perPegCost = perPegCost.sub(constants_1.ONE);
146
+ }
147
+ const targetPeg = targetPrice
148
+ .mul(amm.baseAssetReserve)
149
+ .div(amm.quoteAssetReserve)
150
+ .div(constants_1.PRICE_DIV_PEG);
151
+ const pegChangeDirection = targetPeg.sub(amm.pegMultiplier);
152
+ const useTargetPeg = (perPegCost.lt(constants_1.ZERO) && pegChangeDirection.gt(constants_1.ZERO)) ||
153
+ (perPegCost.gt(constants_1.ZERO) && pegChangeDirection.lt(constants_1.ZERO));
154
+ if (perPegCost.eq(constants_1.ZERO) || useTargetPeg) {
155
+ return targetPeg;
156
+ }
157
+ const budgetDeltaPeg = budget.mul(constants_1.PEG_PRECISION).div(perPegCost);
158
+ const newPeg = bn_js_1.default.max(constants_1.ONE, amm.pegMultiplier.add(budgetDeltaPeg));
159
+ return newPeg;
160
+ }
161
+ exports.calculateBudgetedPeg = calculateBudgetedPeg;
162
+ //# sourceMappingURL=repeg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repeg.js","sourceRoot":"","sources":["../../../../../../../packages/plugins/src/plugins/drift/perpHelpers/repeg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ import { OraclePriceData } from './types';
3
+ export declare function getSwitchboardOraclePriceDataFromBuffer(buffer: Buffer): OraclePriceData;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSwitchboardOraclePriceDataFromBuffer = void 0;
7
+ const bn_js_1 = __importDefault(require("bn.js"));
8
+ const constants_1 = require("./constants");
9
+ const structs_1 = require("../../switchboard/structs");
10
+ function getSwitchboardOraclePriceDataFromBuffer(buffer) {
11
+ const [aggregatorAccountData] = structs_1.aggregatorAccountStruct.deserialize(buffer);
12
+ const price = convertSwitchboardDecimal(aggregatorAccountData.latestConfirmedRound.result);
13
+ const confidence = bn_js_1.default.max(convertSwitchboardDecimal(aggregatorAccountData.latestConfirmedRound.stdDeviation), price.divn(1000));
14
+ const hasSufficientNumberOfDataPoints = aggregatorAccountData.latestConfirmedRound.numSuccess >=
15
+ aggregatorAccountData.minOracleResults;
16
+ const slot = new bn_js_1.default(aggregatorAccountData.latestConfirmedRound.roundOpenSlot.toString());
17
+ return {
18
+ price,
19
+ slot,
20
+ confidence,
21
+ hasSufficientNumberOfDataPoints,
22
+ };
23
+ }
24
+ exports.getSwitchboardOraclePriceDataFromBuffer = getSwitchboardOraclePriceDataFromBuffer;
25
+ function convertSwitchboardDecimal(switchboardDecimal) {
26
+ const switchboardPrecision = constants_1.TEN.pow(new bn_js_1.default(switchboardDecimal.scale));
27
+ return new bn_js_1.default(switchboardDecimal.mantissa.toString(10), 10)
28
+ .mul(constants_1.PRICE_PRECISION)
29
+ .div(switchboardPrecision);
30
+ }
31
+ //# sourceMappingURL=switchboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switchboard.js","sourceRoot":"","sources":["../../../../../../../packages/plugins/src/plugins/drift/perpHelpers/switchboard.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAuB;AAGvB,2CAAmD;AACnD,uDAAoE;AAEpE,SAAgB,uCAAuC,CACrD,MAAc;IAEd,MAAM,CAAC,qBAAqB,CAAC,GAAG,iCAAuB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,yBAAyB,CACrC,qBAAqB,CAAC,oBAAoB,CAAC,MAAM,CAClD,CAAC;IAEF,MAAM,UAAU,GAAG,eAAE,CAAC,GAAG,CACvB,yBAAyB,CACvB,qBAAqB,CAAC,oBAAoB,CAAC,YAAY,CACxD,EACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CACjB,CAAC;IAEF,MAAM,+BAA+B,GACnC,qBAAqB,CAAC,oBAAoB,CAAC,UAAU;QACrD,qBAAqB,CAAC,gBAAgB,CAAC;IAEzC,MAAM,IAAI,GAAG,IAAI,eAAE,CACjB,qBAAqB,CAAC,oBAAoB,CAAC,aAAa,CAAC,QAAQ,EAAE,CACpE,CAAC;IACF,OAAO;QACL,KAAK;QACL,IAAI;QACJ,UAAU;QACV,+BAA+B;KAChC,CAAC;AACJ,CAAC;AA7BD,0FA6BC;AAED,SAAS,yBAAyB,CAAC,kBAGlC;IACC,MAAM,oBAAoB,GAAG,eAAG,CAAC,GAAG,CAAC,IAAI,eAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,OAAO,IAAI,eAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;SACxD,GAAG,CAAC,2BAAe,CAAC;SACpB,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import BN from 'bn.js';
2
+ export type OraclePriceData = {
3
+ price: BN;
4
+ slot: BN;
5
+ confidence: BN;
6
+ hasSufficientNumberOfDataPoints: boolean;
7
+ twap?: BN;
8
+ twapConfidence?: BN;
9
+ maxPrice?: BN;
10
+ };
11
+ export declare class PositionDirection {
12
+ static readonly LONG: {
13
+ long: {};
14
+ };
15
+ static readonly SHORT: {
16
+ short: {};
17
+ };
18
+ }
19
+ export declare class SwapDirection {
20
+ static readonly ADD: {
21
+ add: {};
22
+ };
23
+ static readonly REMOVE: {
24
+ remove: {};
25
+ };
26
+ }
27
+ export type AssetType = 'quote' | 'base';
28
+ export declare function isVariant(object: object, type: string): boolean;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isVariant = exports.SwapDirection = exports.PositionDirection = void 0;
4
+ class PositionDirection {
5
+ }
6
+ exports.PositionDirection = PositionDirection;
7
+ PositionDirection.LONG = { long: {} };
8
+ PositionDirection.SHORT = { short: {} };
9
+ class SwapDirection {
10
+ }
11
+ exports.SwapDirection = SwapDirection;
12
+ SwapDirection.ADD = { add: {} };
13
+ SwapDirection.REMOVE = { remove: {} };
14
+ function isVariant(object, type) {
15
+ // eslint-disable-next-line no-prototype-builtins
16
+ return object.hasOwnProperty(type);
17
+ }
18
+ exports.isVariant = isVariant;
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../packages/plugins/src/plugins/drift/perpHelpers/types.ts"],"names":[],"mappings":";;;AAaA,MAAa,iBAAiB;;AAA9B,8CAGC;AAFiB,sBAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACpB,uBAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAGxC,MAAa,aAAa;;AAA1B,sCAGC;AAFiB,iBAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;AAClB,oBAAM,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAK1C,SAAgB,SAAS,CAAC,MAAc,EAAE,IAAY;IACpD,iDAAiD;IACjD,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAHD,8BAGC"}
@@ -0,0 +1,3 @@
1
+ import { Job } from '../../Job';
2
+ declare const job: Job;
3
+ export default job;
@@ -0,0 +1,38 @@
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
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
13
+ const constants_1 = require("./constants");
14
+ const struct_1 = require("./struct");
15
+ const clients_1 = require("../../utils/clients");
16
+ const solana_1 = require("../../utils/solana");
17
+ const filters_1 = require("./filters");
18
+ const getOraclePrice_1 = require("./perpHelpers/getOraclePrice");
19
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const client = (0, clients_1.getClientSolana)();
21
+ const marketAccounts = yield (0, solana_1.getParsedProgramAccounts)(client, struct_1.perpMarketStruct, constants_1.driftProgram, filters_1.perpMarketsFilters);
22
+ const indexes = marketAccounts.map((m) => [m.marketIndex, m.pubkey.toString()]);
23
+ yield cache.setItem(constants_1.perpMarketsIndexesKey, indexes, {
24
+ prefix: constants_1.platformId,
25
+ networkId: portfolio_core_1.NetworkId.solana,
26
+ });
27
+ for (let i = 0; i < marketAccounts.length; i++) {
28
+ const acc = marketAccounts[i];
29
+ yield (0, getOraclePrice_1.getOraclePrice)(acc.amm.oracle.toString(), acc.amm.oracleSource, client);
30
+ }
31
+ });
32
+ const job = {
33
+ id: `${constants_1.platformId}-perp-markets`,
34
+ executor,
35
+ label: 'normal',
36
+ };
37
+ exports.default = job;
38
+ //# sourceMappingURL=prepMarketsJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepMarketsJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/prepMarketsJob.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAuD;AAGvD,2CAA8E;AAC9E,qCAA4C;AAC5C,iDAAsD;AACtD,+CAA8D;AAC9D,uCAA+C;AAC/C,iEAA8D;AAE9D,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAA,yBAAe,GAAE,CAAC;IAEjC,MAAM,cAAc,GAAG,MAAM,IAAA,iCAAwB,EACnD,MAAM,EACN,yBAAgB,EAChB,wBAAY,EACZ,4BAAkB,CACnB,CAAC;IACF,MAAM,OAAO,GAA4B,cAAc,CAAC,GAAG,CACzD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAU,CACrD,CAAC;IACF,MAAM,KAAK,CAAC,OAAO,CAAC,iCAAqB,EAAE,OAAO,EAAE;QAClD,MAAM,EAAE,sBAAU;QAClB,SAAS,EAAE,0BAAS,CAAC,MAAM;KAC5B,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAA,+BAAc,EAClB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,GAAG,CAAC,GAAG,CAAC,YAAY,EACpB,MAAM,CACP,CAAC;IACJ,CAAC;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,GAAG,sBAAU,eAAe;IAChC,QAAQ;IACR,KAAK,EAAE,QAAQ;CAChB,CAAC;AACF,kBAAe,GAAG,CAAC"}