@drift-labs/sdk 0.1.26 → 0.1.29-master.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/lib/accounts/bulkAccountLoader.js +8 -3
  2. package/lib/accounts/pollingOracleSubscriber.d.ts +26 -0
  3. package/lib/accounts/pollingOracleSubscriber.js +79 -0
  4. package/lib/accounts/types.d.ts +14 -1
  5. package/lib/clearingHouse.d.ts +6 -4
  6. package/lib/clearingHouse.js +56 -7
  7. package/lib/constants/markets.d.ts +2 -2
  8. package/lib/constants/markets.js +50 -28
  9. package/lib/idl/clearing_house.json +60 -1
  10. package/lib/index.d.ts +1 -0
  11. package/lib/index.js +1 -0
  12. package/lib/math/market.d.ts +2 -0
  13. package/lib/math/market.js +6 -1
  14. package/lib/orderParams.d.ts +1 -1
  15. package/lib/orderParams.js +2 -2
  16. package/lib/orders.d.ts +3 -2
  17. package/lib/orders.js +11 -4
  18. package/lib/types.d.ts +3 -0
  19. package/lib/types.js +1 -0
  20. package/package.json +1 -1
  21. package/src/accounts/bulkAccountLoader.ts +10 -4
  22. package/src/accounts/bulkUserSubscription.js +56 -0
  23. package/src/accounts/bulkUserSubscription.js.map +1 -0
  24. package/src/accounts/pollingClearingHouseAccountSubscriber.js +210 -0
  25. package/src/accounts/pollingClearingHouseAccountSubscriber.js.map +1 -0
  26. package/src/accounts/pollingOracleSubscriber.js +65 -0
  27. package/src/accounts/pollingOracleSubscriber.js.map +1 -0
  28. package/src/accounts/pollingOracleSubscriber.ts +103 -0
  29. package/src/accounts/pollingTokenAccountSubscriber.js +65 -0
  30. package/src/accounts/pollingTokenAccountSubscriber.js.map +1 -0
  31. package/src/accounts/pollingUserAccountSubscriber.js +139 -0
  32. package/src/accounts/pollingUserAccountSubscriber.js.map +1 -0
  33. package/src/accounts/types.js +1 -0
  34. package/src/accounts/types.js.map +1 -0
  35. package/src/accounts/types.ts +22 -1
  36. package/src/accounts/utils.js +1 -0
  37. package/src/accounts/utils.js.map +1 -0
  38. package/src/accounts/webSocketAccountSubscriber.js +15 -27
  39. package/src/accounts/webSocketAccountSubscriber.js.map +1 -0
  40. package/src/accounts/webSocketClearingHouseAccountSubscriber.js +212 -0
  41. package/src/accounts/webSocketClearingHouseAccountSubscriber.js.map +1 -0
  42. package/src/accounts/webSocketUserAccountSubscriber.js +78 -0
  43. package/src/accounts/webSocketUserAccountSubscriber.js.map +1 -0
  44. package/src/addresses.js +20 -44
  45. package/src/addresses.js.map +1 -0
  46. package/src/admin.js +443 -0
  47. package/src/admin.js.map +1 -0
  48. package/src/assert/assert.js +10 -0
  49. package/src/assert/assert.js.map +1 -0
  50. package/src/clearingHouse.ts +85 -7
  51. package/src/clearingHouseUser.js +581 -0
  52. package/src/clearingHouseUser.js.map +1 -0
  53. package/src/config.js +37 -0
  54. package/src/config.js.map +1 -0
  55. package/src/constants/markets.js +167 -0
  56. package/src/constants/markets.js.map +1 -0
  57. package/src/constants/markets.ts +52 -30
  58. package/src/constants/numericConstants.js +22 -0
  59. package/src/constants/numericConstants.js.map +1 -0
  60. package/src/factory/clearingHouse.js +65 -0
  61. package/src/factory/clearingHouse.js.map +1 -0
  62. package/src/factory/clearingHouseUser.js +35 -0
  63. package/src/factory/clearingHouseUser.js.map +1 -0
  64. package/src/factory/oracleClient.js +17 -0
  65. package/src/factory/oracleClient.js.map +1 -0
  66. package/src/idl/clearing_house.json +60 -1
  67. package/src/index.js +56 -0
  68. package/src/index.js.map +1 -0
  69. package/src/index.ts +1 -0
  70. package/src/math/amm.js +285 -0
  71. package/src/math/amm.js.map +1 -0
  72. package/src/math/conversion.js +16 -0
  73. package/src/math/conversion.js.map +1 -0
  74. package/src/math/funding.js +223 -0
  75. package/src/math/funding.js.map +1 -0
  76. package/src/math/insuranceFund.js +23 -0
  77. package/src/math/insuranceFund.js.map +1 -0
  78. package/src/math/market.js +30 -0
  79. package/src/math/market.js.map +1 -0
  80. package/src/math/market.ts +9 -0
  81. package/src/math/orders.js +73 -0
  82. package/src/math/orders.js.map +1 -0
  83. package/src/math/position.js +121 -0
  84. package/src/math/position.js.map +1 -0
  85. package/src/math/trade.js +182 -0
  86. package/src/math/trade.js.map +1 -0
  87. package/src/math/utils.js +27 -0
  88. package/src/math/utils.js.map +1 -0
  89. package/src/mockUSDCFaucet.js +88 -116
  90. package/src/mockUSDCFaucet.js.map +1 -0
  91. package/src/oracles/pythClient.js +39 -0
  92. package/src/oracles/pythClient.js.map +1 -0
  93. package/src/oracles/switchboardClient.js +60 -0
  94. package/src/oracles/switchboardClient.js.map +1 -0
  95. package/src/oracles/types.js +3 -0
  96. package/src/oracles/types.js.map +1 -0
  97. package/src/orderParams.js +109 -0
  98. package/src/orderParams.js.map +1 -0
  99. package/src/orderParams.ts +3 -2
  100. package/src/orders.js +172 -0
  101. package/src/orders.js.map +1 -0
  102. package/src/orders.ts +17 -4
  103. package/src/token/index.js +39 -0
  104. package/src/token/index.js.map +1 -0
  105. package/src/tx/defaultTxSender.js +13 -0
  106. package/src/tx/defaultTxSender.js.map +1 -0
  107. package/src/tx/retryTxSender.js +137 -0
  108. package/src/tx/retryTxSender.js.map +1 -0
  109. package/src/tx/types.js +3 -0
  110. package/src/tx/types.js.map +1 -0
  111. package/src/tx/utils.js +9 -0
  112. package/src/tx/utils.js.map +1 -0
  113. package/src/types.js +1 -0
  114. package/src/types.js.map +1 -0
  115. package/src/types.ts +1 -0
  116. package/src/util/computeUnits.js +17 -0
  117. package/src/util/computeUnits.js.map +1 -0
  118. package/src/util/tps.js +17 -0
  119. package/src/util/tps.js.map +1 -0
  120. package/src/wallet.js +23 -0
  121. package/src/wallet.js.map +1 -0
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getMarketOrderParams = exports.getTriggerLimitOrderParams = exports.getTriggerMarketOrderParams = exports.getLimitOrderParams = void 0;
4
4
  const types_1 = require("./types");
5
5
  const numericConstants_1 = require("./constants/numericConstants");
6
- function getLimitOrderParams(marketIndex, direction, baseAssetAmount, price, reduceOnly, discountToken = false, referrer = false, userOrderId = 0, postOnly = false) {
6
+ function getLimitOrderParams(marketIndex, direction, baseAssetAmount, price, reduceOnly, discountToken = false, referrer = false, userOrderId = 0, postOnly = false, oraclePriceOffset = numericConstants_1.ZERO) {
7
7
  return {
8
8
  orderType: types_1.OrderType.LIMIT,
9
9
  userOrderId,
@@ -24,7 +24,7 @@ function getLimitOrderParams(marketIndex, direction, baseAssetAmount, price, red
24
24
  },
25
25
  triggerCondition: types_1.OrderTriggerCondition.ABOVE,
26
26
  triggerPrice: numericConstants_1.ZERO,
27
- oraclePriceOffset: numericConstants_1.ZERO,
27
+ oraclePriceOffset,
28
28
  };
29
29
  }
30
30
  exports.getLimitOrderParams = getLimitOrderParams;
package/lib/orders.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  /// <reference types="bn.js" />
2
2
  import { Market, Order, UserAccount, UserPosition } from './types';
3
3
  import { BN, ClearingHouseUser } from '.';
4
+ import { OraclePriceData } from '.';
4
5
  export declare function calculateNewStateAfterOrder(userAccount: UserAccount, userPosition: UserPosition, market: Market, order: Order): [UserAccount, UserPosition, Market] | null;
5
- export declare function calculateBaseAssetAmountMarketCanExecute(market: Market, order: Order): BN;
6
- export declare function calculateAmountToTradeForLimit(market: Market, order: Order): BN;
6
+ export declare function calculateBaseAssetAmountMarketCanExecute(market: Market, order: Order, oraclePriceData?: OraclePriceData): BN;
7
+ export declare function calculateAmountToTradeForLimit(market: Market, order: Order, oraclePriceData?: OraclePriceData): BN;
7
8
  export declare function calculateAmountToTradeForTriggerLimit(market: Market, order: Order): BN;
8
9
  export declare function calculateBaseAssetAmountUserCanExecute(market: Market, order: Order, user: ClearingHouseUser): BN;
package/lib/orders.js CHANGED
@@ -80,9 +80,9 @@ function calculateAmountSwapped(marketBefore, marketAfter) {
80
80
  baseAssetAmountSwapped: marketBefore.amm.baseAssetReserve.sub(marketAfter.amm.baseAssetReserve),
81
81
  };
82
82
  }
83
- function calculateBaseAssetAmountMarketCanExecute(market, order) {
83
+ function calculateBaseAssetAmountMarketCanExecute(market, order, oraclePriceData) {
84
84
  if ((0, types_1.isVariant)(order.orderType, 'limit')) {
85
- return calculateAmountToTradeForLimit(market, order);
85
+ return calculateAmountToTradeForLimit(market, order, oraclePriceData);
86
86
  }
87
87
  else if ((0, types_1.isVariant)(order.orderType, 'triggerLimit')) {
88
88
  return calculateAmountToTradeForTriggerLimit(market, order);
@@ -96,8 +96,15 @@ function calculateBaseAssetAmountMarketCanExecute(market, order) {
96
96
  }
97
97
  }
98
98
  exports.calculateBaseAssetAmountMarketCanExecute = calculateBaseAssetAmountMarketCanExecute;
99
- function calculateAmountToTradeForLimit(market, order) {
100
- const [maxAmountToTrade, direction] = (0, amm_1.calculateMaxBaseAssetAmountToTrade)(market.amm, order.price);
99
+ function calculateAmountToTradeForLimit(market, order, oraclePriceData) {
100
+ let limitPrice = order.price;
101
+ if (!order.oraclePriceOffset.eq(numericConstants_1.ZERO)) {
102
+ if (!oraclePriceData) {
103
+ throw Error('Cant calculate limit price for oracle offset oracle without OraclePriceData');
104
+ }
105
+ limitPrice = oraclePriceData.price.add(order.oraclePriceOffset);
106
+ }
107
+ const [maxAmountToTrade, direction] = (0, amm_1.calculateMaxBaseAssetAmountToTrade)(market.amm, limitPrice);
101
108
  // Check that directions are the same
102
109
  const sameDirection = isSameDirection(direction, order.direction);
103
110
  if (!sameDirection) {
package/lib/types.d.ts CHANGED
@@ -71,6 +71,9 @@ export declare class OrderAction {
71
71
  static readonly CANCEL: {
72
72
  cancel: {};
73
73
  };
74
+ static readonly EXPIRE: {
75
+ expire: {};
76
+ };
74
77
  static readonly FILL: {
75
78
  fill: {};
76
79
  };
package/lib/types.js CHANGED
@@ -42,6 +42,7 @@ class OrderAction {
42
42
  exports.OrderAction = OrderAction;
43
43
  OrderAction.PLACE = { place: {} };
44
44
  OrderAction.CANCEL = { cancel: {} };
45
+ OrderAction.EXPIRE = { expire: {} };
45
46
  OrderAction.FILL = { fill: {} };
46
47
  class OrderTriggerCondition {
47
48
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "0.1.26",
3
+ "version": "0.1.29-master.0",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",
@@ -9,6 +9,7 @@ type AccountToLoad = {
9
9
 
10
10
  const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
11
11
 
12
+ const oneMinute = 60 * 1000;
12
13
  const fiveMinutes = 5 * 60 * 1000;
13
14
 
14
15
  export class BulkAccountLoader {
@@ -104,10 +105,6 @@ export class BulkAccountLoader {
104
105
  this.loadPromiseResolver = resolver;
105
106
  });
106
107
 
107
- if (this.loggingEnabled) {
108
- console.log('Loading accounts');
109
- }
110
-
111
108
  try {
112
109
  const chunks = this.chunks(
113
110
  Array.from(this.accountsToLoad.values()),
@@ -163,6 +160,11 @@ export class BulkAccountLoader {
163
160
  args
164
161
  );
165
162
 
163
+ const oneMinuteSinceLastUpdate = Date.now() - this.lastUpdate > oneMinute;
164
+ if (this.loggingEnabled && oneMinuteSinceLastUpdate) {
165
+ console.log('rpcResponse', JSON.stringify(rpcResponse));
166
+ }
167
+
166
168
  const newSlot = rpcResponse.result.context.slot;
167
169
 
168
170
  for (const i in accountsToLoad) {
@@ -177,6 +179,10 @@ export class BulkAccountLoader {
177
179
  newBuffer = Buffer.from(raw, dataType);
178
180
  }
179
181
 
182
+ if (this.loggingEnabled && oneMinuteSinceLastUpdate) {
183
+ console.log('oldRPCResponse', oldRPCResponse);
184
+ }
185
+
180
186
  if (!oldRPCResponse) {
181
187
  this.accountData.set(key, {
182
188
  slot: newSlot,
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bulkPollingUserSubscribe = void 0;
4
+ /**
5
+ * @param users
6
+ * @param accountLoader
7
+ */
8
+ async function bulkPollingUserSubscribe(users, accountLoader) {
9
+ if (users.length === 0) {
10
+ await accountLoader.load();
11
+ return;
12
+ }
13
+ // Fetch all the accounts first
14
+ const program = users[0].clearingHouse.program;
15
+ let userProgramAccounts;
16
+ let orderProgramAccounts;
17
+ await Promise.all([
18
+ (async () => {
19
+ userProgramAccounts = await program.account.user.all();
20
+ })(),
21
+ (async () => {
22
+ orderProgramAccounts = await program.account.userOrders.all();
23
+ })(),
24
+ ]);
25
+ // Create a map of the authority to keys
26
+ const authorityToKeys = new Map();
27
+ const userToAuthority = new Map();
28
+ for (const userProgramAccount of userProgramAccounts) {
29
+ const userAccountPublicKey = userProgramAccount.publicKey;
30
+ const userAccount = userProgramAccount.account;
31
+ authorityToKeys.set(userAccount.authority.toString(), {
32
+ user: userAccountPublicKey,
33
+ userPositions: userAccount.positions,
34
+ userOrders: undefined,
35
+ });
36
+ userToAuthority.set(userAccountPublicKey.toString(), userAccount.authority.toString());
37
+ }
38
+ for (const orderProgramAccount of orderProgramAccounts) {
39
+ const userOrderAccountPublicKey = orderProgramAccount.publicKey;
40
+ const userOrderAccount = orderProgramAccount.account;
41
+ const authority = userToAuthority.get(userOrderAccount.user.toString());
42
+ const userPublicKeys = authorityToKeys.get(authority);
43
+ userPublicKeys.userOrders = userOrderAccountPublicKey;
44
+ }
45
+ await Promise.all(users.map((user) => {
46
+ // Pull the keys from the authority map so we can skip fetching them in addToAccountLoader
47
+ const userPublicKeys = authorityToKeys.get(user.authority.toString());
48
+ return user.accountSubscriber.addToAccountLoader(userPublicKeys);
49
+ }));
50
+ await accountLoader.load();
51
+ await Promise.all(users.map(async (user) => {
52
+ return user.subscribe();
53
+ }));
54
+ }
55
+ exports.bulkPollingUserSubscribe = bulkPollingUserSubscribe;
56
+ //# sourceMappingURL=bulkUserSubscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulkUserSubscription.js","sourceRoot":"","sources":["bulkUserSubscription.ts"],"names":[],"mappings":";;;AAOA;;;GAGG;AACI,KAAK,UAAU,wBAAwB,CAC7C,KAA0B,EAC1B,aAAgC;IAEhC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO;KACP;IAED,+BAA+B;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC;IAC/C,IAAI,mBAAqC,CAAC;IAC1C,IAAI,oBAAsC,CAAC;IAC3C,MAAM,OAAO,CAAC,GAAG,CAAC;QACjB,CAAC,KAAK,IAAI,EAAE;YACX,mBAAmB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACxD,CAAC,CAAC,EAAE;QACJ,CAAC,KAAK,IAAI,EAAE;YACX,oBAAoB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;QAC/D,CAAC,CAAC,EAAE;KACJ,CAAC,CAAC;IAEH,wCAAwC;IACxC,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC1D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAClD,KAAK,MAAM,kBAAkB,IAAI,mBAAmB,EAAE;QACrD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,SAAS,CAAC;QAC1D,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAsB,CAAC;QAE9D,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE;YACrD,IAAI,EAAE,oBAAoB;YAC1B,aAAa,EAAE,WAAW,CAAC,SAAS;YACpC,UAAU,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,eAAe,CAAC,GAAG,CAClB,oBAAoB,CAAC,QAAQ,EAAE,EAC/B,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,CAChC,CAAC;KACF;IACD,KAAK,MAAM,mBAAmB,IAAI,oBAAoB,EAAE;QACvD,MAAM,yBAAyB,GAAG,mBAAmB,CAAC,SAAS,CAAC;QAChE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,OAA4B,CAAC;QAE1E,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,cAAc,CAAC,UAAU,GAAG,yBAAyB,CAAC;KACtD;IAED,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClB,0FAA0F;QAC1F,MAAM,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,OACC,IAAI,CAAC,iBACL,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC,CAAC,CACF,CAAC;IAEF,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAE3B,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACxB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IACzB,CAAC,CAAC,CACF,CAAC;AACH,CAAC;AAlED,4DAkEC"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PollingClearingHouseAccountSubscriber = void 0;
4
+ const types_1 = require("./types");
5
+ const events_1 = require("events");
6
+ const addresses_1 = require("../addresses");
7
+ const utils_1 = require("./utils");
8
+ class PollingClearingHouseAccountSubscriber {
9
+ constructor(program, accountLoader) {
10
+ this.accountsToPoll = new Map();
11
+ this.optionalExtraSubscriptions = [];
12
+ this.type = 'polling';
13
+ this.isSubscribing = false;
14
+ this.isSubscribed = false;
15
+ this.program = program;
16
+ this.eventEmitter = new events_1.EventEmitter();
17
+ this.accountLoader = accountLoader;
18
+ }
19
+ async subscribe(optionalSubscriptions) {
20
+ if (this.isSubscribed) {
21
+ return true;
22
+ }
23
+ if (this.isSubscribing) {
24
+ return await this.subscriptionPromise;
25
+ }
26
+ this.optionalExtraSubscriptions = optionalSubscriptions;
27
+ this.isSubscribing = true;
28
+ this.subscriptionPromise = new Promise((res) => {
29
+ this.subscriptionPromiseResolver = res;
30
+ });
31
+ await this.updateAccountsToPoll();
32
+ await this.addToAccountLoader();
33
+ await this.fetch();
34
+ this.eventEmitter.emit('update');
35
+ this.isSubscribing = false;
36
+ this.isSubscribed = true;
37
+ this.subscriptionPromiseResolver(true);
38
+ return true;
39
+ }
40
+ async updateAccountsToPoll() {
41
+ var _a, _b, _c, _d, _e, _f, _g;
42
+ if (this.accountsToPoll.size > 0) {
43
+ return;
44
+ }
45
+ const statePublicKey = await (0, addresses_1.getClearingHouseStateAccountPublicKey)(this.program.programId);
46
+ const state = (await this.program.account.state.fetch(statePublicKey));
47
+ this.accountsToPoll.set(statePublicKey.toString(), {
48
+ key: 'state',
49
+ publicKey: statePublicKey,
50
+ eventType: 'stateAccountUpdate',
51
+ });
52
+ this.accountsToPoll.set(state.markets.toString(), {
53
+ key: 'markets',
54
+ publicKey: state.markets,
55
+ eventType: 'marketsAccountUpdate',
56
+ });
57
+ this.accountsToPoll.set(state.orderState.toString(), {
58
+ key: 'orderState',
59
+ publicKey: state.orderState,
60
+ eventType: 'orderStateAccountUpdate',
61
+ });
62
+ if ((_a = this.optionalExtraSubscriptions) === null || _a === void 0 ? void 0 : _a.includes('tradeHistoryAccount')) {
63
+ this.accountsToPoll.set(state.tradeHistory.toString(), {
64
+ key: 'tradeHistory',
65
+ publicKey: state.tradeHistory,
66
+ eventType: 'tradeHistoryAccountUpdate',
67
+ });
68
+ }
69
+ if ((_b = this.optionalExtraSubscriptions) === null || _b === void 0 ? void 0 : _b.includes('depositHistoryAccount')) {
70
+ this.accountsToPoll.set(state.depositHistory.toString(), {
71
+ key: 'depositHistory',
72
+ publicKey: state.depositHistory,
73
+ eventType: 'depositHistoryAccountUpdate',
74
+ });
75
+ }
76
+ if ((_c = this.optionalExtraSubscriptions) === null || _c === void 0 ? void 0 : _c.includes('fundingPaymentHistoryAccount')) {
77
+ this.accountsToPoll.set(state.fundingPaymentHistory.toString(), {
78
+ key: 'fundingPaymentHistory',
79
+ publicKey: state.fundingPaymentHistory,
80
+ eventType: 'fundingPaymentHistoryAccountUpdate',
81
+ });
82
+ }
83
+ if ((_d = this.optionalExtraSubscriptions) === null || _d === void 0 ? void 0 : _d.includes('fundingRateHistoryAccount')) {
84
+ this.accountsToPoll.set(state.fundingRateHistory.toString(), {
85
+ key: 'fundingRateHistory',
86
+ publicKey: state.fundingRateHistory,
87
+ eventType: 'fundingRateHistoryAccountUpdate',
88
+ });
89
+ }
90
+ if ((_e = this.optionalExtraSubscriptions) === null || _e === void 0 ? void 0 : _e.includes('curveHistoryAccount')) {
91
+ this.accountsToPoll.set(state.extendedCurveHistory.toString(), {
92
+ key: 'extendedCurveHistory',
93
+ publicKey: state.extendedCurveHistory,
94
+ eventType: 'curveHistoryAccountUpdate',
95
+ });
96
+ }
97
+ if ((_f = this.optionalExtraSubscriptions) === null || _f === void 0 ? void 0 : _f.includes('liquidationHistoryAccount')) {
98
+ this.accountsToPoll.set(state.liquidationHistory.toString(), {
99
+ key: 'liquidationHistory',
100
+ publicKey: state.liquidationHistory,
101
+ eventType: 'liquidationHistoryAccountUpdate',
102
+ });
103
+ }
104
+ if ((_g = this.optionalExtraSubscriptions) === null || _g === void 0 ? void 0 : _g.includes('orderHistoryAccount')) {
105
+ const orderState = (await this.program.account.orderState.fetch(state.orderState));
106
+ this.accountsToPoll.set(orderState.orderHistory.toString(), {
107
+ key: 'orderHistory',
108
+ publicKey: orderState.orderHistory,
109
+ eventType: 'orderHistoryAccountUpdate',
110
+ });
111
+ }
112
+ }
113
+ async addToAccountLoader() {
114
+ for (const [_, accountToPoll] of this.accountsToPoll) {
115
+ accountToPoll.callbackId = this.accountLoader.addAccount(accountToPoll.publicKey, (buffer) => {
116
+ const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
117
+ this[accountToPoll.key] = account;
118
+ // @ts-ignore
119
+ this.eventEmitter.emit(accountToPoll.eventType, account);
120
+ this.eventEmitter.emit('update');
121
+ });
122
+ }
123
+ this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
124
+ this.eventEmitter.emit('error', error);
125
+ });
126
+ }
127
+ async fetch() {
128
+ await this.accountLoader.load();
129
+ for (const [_, accountToPoll] of this.accountsToPoll) {
130
+ const buffer = this.accountLoader.getAccountData(accountToPoll.publicKey);
131
+ if (buffer) {
132
+ this[accountToPoll.key] = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
133
+ }
134
+ }
135
+ }
136
+ async unsubscribe() {
137
+ if (!this.isSubscribed) {
138
+ return;
139
+ }
140
+ for (const [_, accountToPoll] of this.accountsToPoll) {
141
+ this.accountLoader.removeAccount(accountToPoll.publicKey, accountToPoll.callbackId);
142
+ }
143
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
144
+ this.errorCallbackId = undefined;
145
+ this.accountsToPoll.clear();
146
+ this.isSubscribed = false;
147
+ }
148
+ assertIsSubscribed() {
149
+ if (!this.isSubscribed) {
150
+ throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
151
+ }
152
+ }
153
+ assertOptionalIsSubscribed(optionalSubscription) {
154
+ if (!this.isSubscribed) {
155
+ throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
156
+ }
157
+ if (!this.optionalExtraSubscriptions.includes(optionalSubscription)) {
158
+ throw new types_1.NotSubscribedError(`You need to subscribe to the optional Clearing House account "${optionalSubscription}" to use this method`);
159
+ }
160
+ }
161
+ getStateAccount() {
162
+ this.assertIsSubscribed();
163
+ return this.state;
164
+ }
165
+ getMarketsAccount() {
166
+ this.assertIsSubscribed();
167
+ return this.markets;
168
+ }
169
+ getOrderStateAccount() {
170
+ this.assertIsSubscribed();
171
+ return this.orderState;
172
+ }
173
+ getTradeHistoryAccount() {
174
+ this.assertIsSubscribed();
175
+ this.assertOptionalIsSubscribed('tradeHistoryAccount');
176
+ return this.tradeHistory;
177
+ }
178
+ getDepositHistoryAccount() {
179
+ this.assertIsSubscribed();
180
+ this.assertOptionalIsSubscribed('depositHistoryAccount');
181
+ return this.depositHistory;
182
+ }
183
+ getFundingPaymentHistoryAccount() {
184
+ this.assertIsSubscribed();
185
+ this.assertOptionalIsSubscribed('fundingPaymentHistoryAccount');
186
+ return this.fundingPaymentHistory;
187
+ }
188
+ getFundingRateHistoryAccount() {
189
+ this.assertIsSubscribed();
190
+ this.assertOptionalIsSubscribed('fundingRateHistoryAccount');
191
+ return this.fundingRateHistory;
192
+ }
193
+ getCurveHistoryAccount() {
194
+ this.assertIsSubscribed();
195
+ this.assertOptionalIsSubscribed('curveHistoryAccount');
196
+ return this.extendedCurveHistory;
197
+ }
198
+ getLiquidationHistoryAccount() {
199
+ this.assertIsSubscribed();
200
+ this.assertOptionalIsSubscribed('liquidationHistoryAccount');
201
+ return this.liquidationHistory;
202
+ }
203
+ getOrderHistoryAccount() {
204
+ this.assertIsSubscribed();
205
+ this.assertOptionalIsSubscribed('orderHistoryAccount');
206
+ return this.orderHistory;
207
+ }
208
+ }
209
+ exports.PollingClearingHouseAccountSubscriber = PollingClearingHouseAccountSubscriber;
210
+ //# sourceMappingURL=pollingClearingHouseAccountSubscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pollingClearingHouseAccountSubscriber.js","sourceRoot":"","sources":["pollingClearingHouseAccountSubscriber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PollingOracleSubscriber = void 0;
4
+ const types_1 = require("./types");
5
+ const events_1 = require("events");
6
+ class PollingOracleSubscriber {
7
+ constructor(publicKey, oracleClient, accountLoader) {
8
+ this.isSubscribed = false;
9
+ this.publicKey = publicKey;
10
+ this.oracleClient = oracleClient;
11
+ this.accountLoader = accountLoader;
12
+ this.eventEmitter = new events_1.EventEmitter();
13
+ }
14
+ async subscribe() {
15
+ if (this.isSubscribed) {
16
+ return true;
17
+ }
18
+ this.addToAccountLoader();
19
+ await this.fetch();
20
+ this.eventEmitter.emit('update');
21
+ this.isSubscribed = true;
22
+ return true;
23
+ }
24
+ addToAccountLoader() {
25
+ if (this.callbackId) {
26
+ return;
27
+ }
28
+ this.callbackId = this.accountLoader.addAccount(this.publicKey, async (buffer) => {
29
+ const oraclePriceData = await this.oracleClient.getOraclePriceDataFromBuffer(buffer);
30
+ this.oraclePriceData = oraclePriceData;
31
+ // @ts-ignore
32
+ this.eventEmitter.emit('oracleUpdate', oraclePriceData);
33
+ this.eventEmitter.emit('update');
34
+ });
35
+ this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
36
+ this.eventEmitter.emit('error', error);
37
+ });
38
+ }
39
+ async fetch() {
40
+ await this.accountLoader.load();
41
+ const buffer = this.accountLoader.getAccountData(this.publicKey);
42
+ this.oraclePriceData = await this.oracleClient.getOraclePriceDataFromBuffer(buffer);
43
+ }
44
+ async unsubscribe() {
45
+ if (!this.isSubscribed) {
46
+ return;
47
+ }
48
+ this.accountLoader.removeAccount(this.publicKey, this.callbackId);
49
+ this.callbackId = undefined;
50
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
51
+ this.errorCallbackId = undefined;
52
+ this.isSubscribed = false;
53
+ }
54
+ assertIsSubscribed() {
55
+ if (!this.isSubscribed) {
56
+ throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
57
+ }
58
+ }
59
+ getOraclePriceData() {
60
+ this.assertIsSubscribed();
61
+ return this.oraclePriceData;
62
+ }
63
+ }
64
+ exports.PollingOracleSubscriber = PollingOracleSubscriber;
65
+ //# sourceMappingURL=pollingOracleSubscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pollingOracleSubscriber.js","sourceRoot":"","sources":["pollingOracleSubscriber.ts"],"names":[],"mappings":";;;AAAA,mCAA6E;AAG7E,mCAAsC;AAKtC,MAAa,uBAAuB;IAanC,YACC,SAAoB,EACpB,YAA0B,EAC1B,aAAgC;QAEhC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS;QACd,IAAI,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO,IAAI,CAAC;SACZ;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,kBAAkB;QACjB,IAAI,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO;SACP;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAC9C,IAAI,CAAC,SAAS,EACd,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,MAAM,eAAe,GACpB,MAAM,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;YACvC,aAAa;YACb,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YACxD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CACD,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE;YACrE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAC1E,MAAM,CACN,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvB,OAAO;SACP;QAED,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,kBAAkB;QACjB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvB,MAAM,IAAI,0BAAkB,CAC3B,sDAAsD,CACtD,CAAC;SACF;IACF,CAAC;IAEM,kBAAkB;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;CACD;AA9FD,0DA8FC"}
@@ -0,0 +1,103 @@
1
+ import { NotSubscribedError, OracleEvents, OracleSubscriber } from './types';
2
+ import { Program } from '@project-serum/anchor';
3
+ import StrictEventEmitter from 'strict-event-emitter-types';
4
+ import { EventEmitter } from 'events';
5
+ import { PublicKey } from '@solana/web3.js';
6
+ import { BulkAccountLoader } from './bulkAccountLoader';
7
+ import { OracleClient, OraclePriceData } from '../oracles/types';
8
+
9
+ export class PollingOracleSubscriber implements OracleSubscriber {
10
+ isSubscribed: boolean;
11
+ program: Program;
12
+ eventEmitter: StrictEventEmitter<EventEmitter, OracleEvents>;
13
+ publicKey: PublicKey;
14
+
15
+ accountLoader: BulkAccountLoader;
16
+ oracleClient: OracleClient;
17
+ callbackId?: string;
18
+ errorCallbackId?: string;
19
+
20
+ oraclePriceData?: OraclePriceData;
21
+
22
+ public constructor(
23
+ publicKey: PublicKey,
24
+ oracleClient: OracleClient,
25
+ accountLoader: BulkAccountLoader
26
+ ) {
27
+ this.isSubscribed = false;
28
+ this.publicKey = publicKey;
29
+ this.oracleClient = oracleClient;
30
+ this.accountLoader = accountLoader;
31
+ this.eventEmitter = new EventEmitter();
32
+ }
33
+
34
+ async subscribe(): Promise<boolean> {
35
+ if (this.isSubscribed) {
36
+ return true;
37
+ }
38
+
39
+ this.addToAccountLoader();
40
+ await this.fetch();
41
+ this.eventEmitter.emit('update');
42
+
43
+ this.isSubscribed = true;
44
+ return true;
45
+ }
46
+
47
+ addToAccountLoader(): void {
48
+ if (this.callbackId) {
49
+ return;
50
+ }
51
+
52
+ this.callbackId = this.accountLoader.addAccount(
53
+ this.publicKey,
54
+ async (buffer) => {
55
+ const oraclePriceData =
56
+ await this.oracleClient.getOraclePriceDataFromBuffer(buffer);
57
+ this.oraclePriceData = oraclePriceData;
58
+ // @ts-ignore
59
+ this.eventEmitter.emit('oracleUpdate', oraclePriceData);
60
+ this.eventEmitter.emit('update');
61
+ }
62
+ );
63
+
64
+ this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
65
+ this.eventEmitter.emit('error', error);
66
+ });
67
+ }
68
+
69
+ async fetch(): Promise<void> {
70
+ await this.accountLoader.load();
71
+ const buffer = this.accountLoader.getAccountData(this.publicKey);
72
+ this.oraclePriceData = await this.oracleClient.getOraclePriceDataFromBuffer(
73
+ buffer
74
+ );
75
+ }
76
+
77
+ async unsubscribe(): Promise<void> {
78
+ if (!this.isSubscribed) {
79
+ return;
80
+ }
81
+
82
+ this.accountLoader.removeAccount(this.publicKey, this.callbackId);
83
+ this.callbackId = undefined;
84
+
85
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
86
+ this.errorCallbackId = undefined;
87
+
88
+ this.isSubscribed = false;
89
+ }
90
+
91
+ assertIsSubscribed(): void {
92
+ if (!this.isSubscribed) {
93
+ throw new NotSubscribedError(
94
+ 'You must call `subscribe` before using this function'
95
+ );
96
+ }
97
+ }
98
+
99
+ public getOraclePriceData(): OraclePriceData {
100
+ this.assertIsSubscribed();
101
+ return this.oraclePriceData;
102
+ }
103
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PollingTokenAccountSubscriber = void 0;
4
+ const types_1 = require("./types");
5
+ const events_1 = require("events");
6
+ const token_1 = require("../token");
7
+ class PollingTokenAccountSubscriber {
8
+ constructor(publicKey, accountLoader) {
9
+ this.isSubscribed = false;
10
+ this.publicKey = publicKey;
11
+ this.accountLoader = accountLoader;
12
+ this.eventEmitter = new events_1.EventEmitter();
13
+ }
14
+ async subscribe() {
15
+ if (this.isSubscribed) {
16
+ return true;
17
+ }
18
+ this.addToAccountLoader();
19
+ await this.fetch();
20
+ this.eventEmitter.emit('update');
21
+ this.isSubscribed = true;
22
+ return true;
23
+ }
24
+ addToAccountLoader() {
25
+ if (this.callbackId) {
26
+ return;
27
+ }
28
+ this.callbackId = this.accountLoader.addAccount(this.publicKey, (buffer) => {
29
+ const tokenAccount = (0, token_1.parseTokenAccount)(buffer);
30
+ this.tokenAccount = tokenAccount;
31
+ // @ts-ignore
32
+ this.eventEmitter.emit('tokenAccountUpdate', tokenAccount);
33
+ this.eventEmitter.emit('update');
34
+ });
35
+ this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
36
+ this.eventEmitter.emit('error', error);
37
+ });
38
+ }
39
+ async fetch() {
40
+ await this.accountLoader.load();
41
+ const buffer = this.accountLoader.getAccountData(this.publicKey);
42
+ this.tokenAccount = (0, token_1.parseTokenAccount)(buffer);
43
+ }
44
+ async unsubscribe() {
45
+ if (!this.isSubscribed) {
46
+ return;
47
+ }
48
+ this.accountLoader.removeAccount(this.publicKey, this.callbackId);
49
+ this.callbackId = undefined;
50
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
51
+ this.errorCallbackId = undefined;
52
+ this.isSubscribed = false;
53
+ }
54
+ assertIsSubscribed() {
55
+ if (!this.isSubscribed) {
56
+ throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
57
+ }
58
+ }
59
+ getTokenAccount() {
60
+ this.assertIsSubscribed();
61
+ return this.tokenAccount;
62
+ }
63
+ }
64
+ exports.PollingTokenAccountSubscriber = PollingTokenAccountSubscriber;
65
+ //# sourceMappingURL=pollingTokenAccountSubscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pollingTokenAccountSubscriber.js","sourceRoot":"","sources":["pollingTokenAccountSubscriber.ts"],"names":[],"mappings":";;;AAAA,mCAIiB;AAGjB,mCAAsC;AAItC,oCAA6C;AAE7C,MAAa,6BAA6B;IAYzC,YAAmB,SAAoB,EAAE,aAAgC;QACxE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS;QACd,IAAI,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO,IAAI,CAAC;SACZ;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,kBAAkB;QACjB,IAAI,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO;SACP;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAC9C,IAAI,CAAC,SAAS,EACd,CAAC,MAAM,EAAE,EAAE;YACV,MAAM,YAAY,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YACjC,aAAa;YACb,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;YAC3D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CACD,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE;YACrE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,GAAG,IAAA,yBAAiB,EAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvB,OAAO;SACP;QAED,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,kBAAkB;QACjB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACvB,MAAM,IAAI,0BAAkB,CAC3B,sDAAsD,CACtD,CAAC;SACF;IACF,CAAC;IAEM,eAAe;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;CACD;AArFD,sEAqFC"}