@drift-labs/sdk 0.2.0-master.24 → 0.2.0-master.26

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 (193) hide show
  1. package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +13 -13
  2. package/lib/accounts/pollingClearingHouseAccountSubscriber.js +27 -27
  3. package/lib/accounts/types.d.ts +8 -9
  4. package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +14 -14
  5. package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +35 -34
  6. package/lib/addresses/pda.d.ts +8 -6
  7. package/lib/addresses/pda.js +35 -27
  8. package/lib/admin.d.ts +9 -6
  9. package/lib/admin.js +90 -54
  10. package/lib/clearingHouse.d.ts +71 -42
  11. package/lib/clearingHouse.js +765 -282
  12. package/lib/clearingHouseConfig.d.ts +2 -2
  13. package/lib/clearingHouseUser.d.ts +19 -17
  14. package/lib/clearingHouseUser.js +145 -123
  15. package/lib/config.d.ts +7 -7
  16. package/lib/config.js +21 -21
  17. package/lib/constants/numericConstants.d.ts +12 -12
  18. package/lib/constants/numericConstants.js +13 -13
  19. package/lib/constants/{markets.d.ts → perpMarkets.d.ts} +5 -5
  20. package/{src/constants/markets.js → lib/constants/perpMarkets.js} +4 -4
  21. package/lib/constants/{banks.d.ts → spotMarkets.d.ts} +6 -6
  22. package/lib/constants/{banks.js → spotMarkets.js} +16 -16
  23. package/lib/events/eventSubscriber.d.ts +4 -2
  24. package/lib/events/eventSubscriber.js +16 -9
  25. package/lib/events/fetchLogs.d.ts +10 -1
  26. package/lib/events/fetchLogs.js +27 -7
  27. package/lib/events/pollingLogProvider.d.ts +2 -1
  28. package/lib/events/pollingLogProvider.js +6 -2
  29. package/lib/events/types.d.ts +4 -2
  30. package/lib/events/types.js +2 -0
  31. package/lib/examples/makeTradeExample.js +18 -6
  32. package/lib/idl/clearing_house.json +1128 -347
  33. package/lib/index.d.ts +6 -3
  34. package/lib/index.js +6 -3
  35. package/lib/math/amm.d.ts +5 -3
  36. package/lib/math/amm.js +42 -4
  37. package/lib/math/funding.d.ts +6 -6
  38. package/lib/math/funding.js +2 -1
  39. package/lib/math/margin.d.ts +4 -4
  40. package/lib/math/margin.js +18 -11
  41. package/lib/math/market.d.ts +10 -9
  42. package/lib/math/market.js +29 -6
  43. package/lib/math/oracles.d.ts +2 -1
  44. package/lib/math/oracles.js +11 -1
  45. package/lib/math/orders.d.ts +5 -5
  46. package/lib/math/position.d.ts +13 -13
  47. package/lib/math/position.js +19 -19
  48. package/lib/math/spotBalance.d.ts +19 -0
  49. package/lib/math/spotBalance.js +176 -0
  50. package/lib/math/spotMarket.d.ts +4 -0
  51. package/lib/math/spotMarket.js +8 -0
  52. package/lib/math/spotPosition.d.ts +2 -0
  53. package/lib/math/spotPosition.js +8 -0
  54. package/lib/math/state.js +2 -2
  55. package/lib/math/trade.d.ts +4 -4
  56. package/lib/orderParams.d.ts +4 -4
  57. package/lib/orderParams.js +12 -4
  58. package/lib/serum/serumSubscriber.d.ts +23 -0
  59. package/lib/serum/serumSubscriber.js +41 -0
  60. package/lib/serum/types.d.ts +11 -0
  61. package/lib/serum/types.js +2 -0
  62. package/lib/tx/retryTxSender.d.ts +1 -1
  63. package/lib/tx/retryTxSender.js +4 -2
  64. package/lib/tx/types.d.ts +1 -1
  65. package/lib/types.d.ts +148 -39
  66. package/lib/types.js +37 -9
  67. package/my-script/.env +7 -0
  68. package/my-script/getUserStats.ts +106 -0
  69. package/my-script/multiConnections.ts +119 -0
  70. package/my-script/test-regex.ts +11 -0
  71. package/my-script/utils.ts +52 -0
  72. package/package.json +1 -1
  73. package/src/accounts/bulkAccountLoader.js +249 -0
  74. package/src/accounts/bulkUserStatsSubscription.js +75 -0
  75. package/src/accounts/bulkUserSubscription.js +75 -0
  76. package/src/accounts/fetch.js +92 -0
  77. package/src/accounts/pollingClearingHouseAccountSubscriber.js +465 -0
  78. package/src/accounts/pollingClearingHouseAccountSubscriber.ts +38 -38
  79. package/src/accounts/pollingOracleSubscriber.js +156 -0
  80. package/src/accounts/pollingTokenAccountSubscriber.js +141 -0
  81. package/src/accounts/pollingUserAccountSubscriber.js +208 -0
  82. package/src/accounts/pollingUserStatsAccountSubscriber.js +208 -0
  83. package/src/accounts/types.js +28 -0
  84. package/src/accounts/types.ts +11 -9
  85. package/src/accounts/utils.js +7 -0
  86. package/src/accounts/webSocketAccountSubscriber.js +138 -0
  87. package/src/accounts/webSocketClearingHouseAccountSubscriber.js +433 -0
  88. package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +59 -52
  89. package/src/accounts/webSocketUserAccountSubscriber.js +113 -0
  90. package/src/accounts/webSocketUserStatsAccountSubsriber.js +113 -0
  91. package/src/addresses/pda.js +186 -0
  92. package/src/addresses/pda.ts +56 -42
  93. package/src/admin.js +1284 -0
  94. package/src/admin.ts +149 -75
  95. package/src/assert/assert.js +1 -1
  96. package/src/clearingHouse.js +3433 -0
  97. package/src/clearingHouse.ts +1097 -380
  98. package/src/clearingHouseConfig.js +2 -0
  99. package/src/clearingHouseConfig.ts +2 -2
  100. package/src/clearingHouseUser.js +874 -0
  101. package/src/clearingHouseUser.ts +237 -172
  102. package/src/clearingHouseUserConfig.js +2 -0
  103. package/src/clearingHouseUserStats.js +115 -0
  104. package/src/clearingHouseUserStatsConfig.js +2 -0
  105. package/src/config.js +80 -0
  106. package/src/config.ts +30 -30
  107. package/src/constants/numericConstants.js +18 -11
  108. package/src/constants/numericConstants.ts +17 -15
  109. package/{lib/constants/markets.js → src/constants/perpMarkets.js} +11 -11
  110. package/src/constants/{markets.ts → perpMarkets.ts} +5 -5
  111. package/src/constants/spotMarkets.js +51 -0
  112. package/src/constants/{banks.ts → spotMarkets.ts} +19 -19
  113. package/src/events/eventList.js +66 -23
  114. package/src/events/eventSubscriber.js +202 -0
  115. package/src/events/eventSubscriber.ts +20 -12
  116. package/src/events/fetchLogs.js +117 -0
  117. package/src/events/fetchLogs.ts +35 -8
  118. package/src/events/pollingLogProvider.js +113 -0
  119. package/src/events/pollingLogProvider.ts +10 -2
  120. package/src/events/sort.js +41 -0
  121. package/src/events/txEventCache.js +22 -19
  122. package/src/events/types.js +25 -0
  123. package/src/events/types.ts +7 -1
  124. package/src/events/webSocketLogProvider.js +76 -0
  125. package/src/examples/makeTradeExample.ts +27 -6
  126. package/src/factory/bigNum.js +183 -180
  127. package/src/factory/oracleClient.js +9 -9
  128. package/src/idl/clearing_house.json +1128 -347
  129. package/src/index.js +75 -0
  130. package/src/index.ts +6 -3
  131. package/src/math/amm.js +422 -0
  132. package/src/math/amm.ts +73 -5
  133. package/src/math/auction.js +10 -10
  134. package/src/math/conversion.js +4 -3
  135. package/src/math/funding.js +223 -175
  136. package/src/math/funding.ts +7 -7
  137. package/src/math/insurance.js +27 -0
  138. package/src/math/margin.js +77 -0
  139. package/src/math/margin.ts +34 -23
  140. package/src/math/market.js +105 -0
  141. package/src/math/market.ts +71 -19
  142. package/src/math/oracles.js +40 -10
  143. package/src/math/oracles.ts +18 -1
  144. package/src/math/orders.js +153 -0
  145. package/src/math/orders.ts +5 -5
  146. package/src/math/position.js +172 -0
  147. package/src/math/position.ts +31 -31
  148. package/src/math/repeg.js +40 -40
  149. package/src/math/spotBalance.js +176 -0
  150. package/src/math/spotBalance.ts +290 -0
  151. package/src/math/spotMarket.js +8 -0
  152. package/src/math/spotMarket.ts +9 -0
  153. package/src/math/spotPosition.js +8 -0
  154. package/src/math/spotPosition.ts +6 -0
  155. package/src/math/state.ts +2 -2
  156. package/src/math/trade.js +81 -74
  157. package/src/math/trade.ts +4 -4
  158. package/src/math/utils.js +8 -7
  159. package/src/oracles/oracleClientCache.js +10 -9
  160. package/src/oracles/pythClient.js +52 -17
  161. package/src/oracles/quoteAssetOracleClient.js +44 -13
  162. package/src/oracles/switchboardClient.js +69 -37
  163. package/src/oracles/types.js +1 -1
  164. package/src/orderParams.js +14 -6
  165. package/src/orderParams.ts +16 -8
  166. package/src/serum/serumSubscriber.js +102 -0
  167. package/src/serum/serumSubscriber.ts +80 -0
  168. package/src/serum/types.js +2 -0
  169. package/src/serum/types.ts +13 -0
  170. package/src/slot/SlotSubscriber.js +67 -20
  171. package/src/token/index.js +4 -4
  172. package/src/tokenFaucet.js +288 -154
  173. package/src/tx/retryTxSender.js +280 -0
  174. package/src/tx/retryTxSender.ts +5 -2
  175. package/src/tx/types.js +1 -1
  176. package/src/tx/types.ts +2 -1
  177. package/src/tx/utils.js +7 -6
  178. package/src/types.js +216 -0
  179. package/src/types.ts +131 -39
  180. package/src/userName.js +5 -5
  181. package/src/util/computeUnits.js +46 -11
  182. package/src/util/promiseTimeout.js +5 -5
  183. package/src/util/tps.js +46 -12
  184. package/src/wallet.js +55 -18
  185. package/lib/math/bankBalance.d.ts +0 -15
  186. package/lib/math/bankBalance.js +0 -150
  187. package/src/addresses/marketAddresses.js +0 -26
  188. package/src/constants/banks.js +0 -42
  189. package/src/examples/makeTradeExample.js +0 -80
  190. package/src/math/bankBalance.ts +0 -258
  191. package/src/math/state.js +0 -15
  192. package/src/math/utils.js.map +0 -1
  193. package/src/util/getTokenAddress.js +0 -9
@@ -0,0 +1,3433 @@
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
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ exports.__esModule = true;
48
+ exports.ClearingHouse = void 0;
49
+ var anchor_1 = require("@project-serum/anchor");
50
+ var spl_token_1 = require("@solana/spl-token");
51
+ var types_1 = require("./types");
52
+ var anchor = require("@project-serum/anchor");
53
+ var clearing_house_json_1 = require("./idl/clearing_house.json");
54
+ var web3_js_1 = require("@solana/web3.js");
55
+ var pda_1 = require("./addresses/pda");
56
+ var utils_1 = require("./tx/utils");
57
+ var numericConstants_1 = require("./constants/numericConstants");
58
+ var position_1 = require("./math/position");
59
+ var spotBalance_1 = require("./math/spotBalance");
60
+ var userName_1 = require("./userName");
61
+ var pollingClearingHouseAccountSubscriber_1 = require("./accounts/pollingClearingHouseAccountSubscriber");
62
+ var webSocketClearingHouseAccountSubscriber_1 = require("./accounts/webSocketClearingHouseAccountSubscriber");
63
+ var retryTxSender_1 = require("./tx/retryTxSender");
64
+ var clearingHouseUser_1 = require("./clearingHouseUser");
65
+ var config_1 = require("./config");
66
+ var spotMarkets_1 = require("./constants/spotMarkets");
67
+ var clearingHouseUserStats_1 = require("./clearingHouseUserStats");
68
+ var spotPosition_1 = require("./math/spotPosition");
69
+ /**
70
+ * # ClearingHouse
71
+ * This class is the main way to interact with Drift Protocol. It allows you to subscribe to the various accounts where the Market's state is stored, as well as: opening positions, liquidating, settling funding, depositing & withdrawing, and more.
72
+ */
73
+ var ClearingHouse = /** @class */ (function () {
74
+ function ClearingHouse(config) {
75
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
76
+ this.users = new Map();
77
+ this._isSubscribed = false;
78
+ this.marketLastSlotCache = new Map();
79
+ this.connection = config.connection;
80
+ this.wallet = config.wallet;
81
+ this.opts = config.opts || anchor_1.AnchorProvider.defaultOptions();
82
+ this.provider = new anchor_1.AnchorProvider(config.connection, config.wallet, this.opts);
83
+ this.program = new anchor_1.Program(clearing_house_json_1["default"], config.programID, this.provider);
84
+ var userIds = (_a = config.userIds) !== null && _a !== void 0 ? _a : [0];
85
+ this.activeUserId = (_b = config.activeUserId) !== null && _b !== void 0 ? _b : userIds[0];
86
+ this.userAccountSubscriptionConfig =
87
+ ((_c = config.accountSubscription) === null || _c === void 0 ? void 0 : _c.type) === 'polling'
88
+ ? {
89
+ type: 'polling',
90
+ accountLoader: config.accountSubscription.accountLoader
91
+ }
92
+ : {
93
+ type: 'websocket'
94
+ };
95
+ this.createUsers(userIds, this.userAccountSubscriptionConfig);
96
+ if (config.userStats) {
97
+ this.userStats = new clearingHouseUserStats_1.ClearingHouseUserStats({
98
+ clearingHouse: this,
99
+ userStatsAccountPublicKey: (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, this.wallet.publicKey),
100
+ accountSubscription: this.userAccountSubscriptionConfig
101
+ });
102
+ }
103
+ var perpMarketIndexes = config.perpMarketIndexes;
104
+ var spotMarketIndexes = config.spotMarketIndexes;
105
+ var oracleInfos = config.oracleInfos;
106
+ if (config.env) {
107
+ var _l = (0, config_1.getMarketsAndOraclesForSubscription)(config.env), envPerpMarketIndexes = _l.perpMarketIndexes, envSpotMarketIndexes = _l.spotMarketIndexes, envOralceInfos = _l.oracleInfos;
108
+ perpMarketIndexes = perpMarketIndexes
109
+ ? perpMarketIndexes
110
+ : envPerpMarketIndexes;
111
+ spotMarketIndexes = spotMarketIndexes
112
+ ? spotMarketIndexes
113
+ : envSpotMarketIndexes;
114
+ oracleInfos = oracleInfos ? oracleInfos : envOralceInfos;
115
+ }
116
+ if (((_d = config.accountSubscription) === null || _d === void 0 ? void 0 : _d.type) === 'polling') {
117
+ this.accountSubscriber = new pollingClearingHouseAccountSubscriber_1.PollingClearingHouseAccountSubscriber(this.program, config.accountSubscription.accountLoader, perpMarketIndexes !== null && perpMarketIndexes !== void 0 ? perpMarketIndexes : [], spotMarketIndexes !== null && spotMarketIndexes !== void 0 ? spotMarketIndexes : [], oracleInfos !== null && oracleInfos !== void 0 ? oracleInfos : []);
118
+ }
119
+ else {
120
+ this.accountSubscriber = new webSocketClearingHouseAccountSubscriber_1.WebSocketClearingHouseAccountSubscriber(this.program, (_e = config.perpMarketIndexes) !== null && _e !== void 0 ? _e : [], (_f = config.spotMarketIndexes) !== null && _f !== void 0 ? _f : [], (_g = config.oracleInfos) !== null && _g !== void 0 ? _g : []);
121
+ }
122
+ this.eventEmitter = this.accountSubscriber.eventEmitter;
123
+ this.txSender = new retryTxSender_1.RetryTxSender(this.provider, (_h = config.txSenderConfig) === null || _h === void 0 ? void 0 : _h.timeout, (_j = config.txSenderConfig) === null || _j === void 0 ? void 0 : _j.retrySleep, (_k = config.txSenderConfig) === null || _k === void 0 ? void 0 : _k.additionalConnections);
124
+ }
125
+ Object.defineProperty(ClearingHouse.prototype, "isSubscribed", {
126
+ get: function () {
127
+ return this._isSubscribed && this.accountSubscriber.isSubscribed;
128
+ },
129
+ set: function (val) {
130
+ this._isSubscribed = val;
131
+ },
132
+ enumerable: false,
133
+ configurable: true
134
+ });
135
+ ClearingHouse.prototype.createUsers = function (userIds, accountSubscriptionConfig) {
136
+ for (var _i = 0, userIds_1 = userIds; _i < userIds_1.length; _i++) {
137
+ var userId = userIds_1[_i];
138
+ var user = this.createUser(userId, accountSubscriptionConfig);
139
+ this.users.set(userId, user);
140
+ }
141
+ };
142
+ ClearingHouse.prototype.createUser = function (userId, accountSubscriptionConfig) {
143
+ var userAccountPublicKey = (0, pda_1.getUserAccountPublicKeySync)(this.program.programId, this.wallet.publicKey, userId);
144
+ return new clearingHouseUser_1.ClearingHouseUser({
145
+ clearingHouse: this,
146
+ userAccountPublicKey: userAccountPublicKey,
147
+ accountSubscription: accountSubscriptionConfig
148
+ });
149
+ };
150
+ ClearingHouse.prototype.subscribe = function () {
151
+ return __awaiter(this, void 0, void 0, function () {
152
+ var subscribePromises, _a;
153
+ return __generator(this, function (_b) {
154
+ switch (_b.label) {
155
+ case 0:
156
+ subscribePromises = this.subscribeUsers().concat(this.accountSubscriber.subscribe());
157
+ if (this.userStats !== undefined) {
158
+ subscribePromises.concat(this.userStats.subscribe());
159
+ }
160
+ _a = this;
161
+ return [4 /*yield*/, Promise.all(subscribePromises)];
162
+ case 1:
163
+ _a.isSubscribed = (_b.sent()).reduce(function (success, prevSuccess) { return success && prevSuccess; });
164
+ return [2 /*return*/, this.isSubscribed];
165
+ }
166
+ });
167
+ });
168
+ };
169
+ ClearingHouse.prototype.subscribeUsers = function () {
170
+ return __spreadArray([], this.users.values(), true).map(function (user) { return user.subscribe(); });
171
+ };
172
+ /**
173
+ * Forces the accountSubscriber to fetch account updates from rpc
174
+ */
175
+ ClearingHouse.prototype.fetchAccounts = function () {
176
+ return __awaiter(this, void 0, void 0, function () {
177
+ var promises;
178
+ return __generator(this, function (_a) {
179
+ switch (_a.label) {
180
+ case 0:
181
+ promises = __spreadArray([], this.users.values(), true).map(function (user) { return user.fetchAccounts(); })
182
+ .concat(this.accountSubscriber.fetch());
183
+ if (this.userStats) {
184
+ promises.concat(this.userStats.fetchAccounts());
185
+ }
186
+ return [4 /*yield*/, Promise.all(promises)];
187
+ case 1:
188
+ _a.sent();
189
+ return [2 /*return*/];
190
+ }
191
+ });
192
+ });
193
+ };
194
+ ClearingHouse.prototype.unsubscribe = function () {
195
+ return __awaiter(this, void 0, void 0, function () {
196
+ var unsubscribePromises;
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0:
200
+ unsubscribePromises = this.unsubscribeUsers().concat(this.accountSubscriber.unsubscribe());
201
+ if (this.userStats !== undefined) {
202
+ unsubscribePromises.concat(this.userStats.unsubscribe());
203
+ }
204
+ return [4 /*yield*/, Promise.all(unsubscribePromises)];
205
+ case 1:
206
+ _a.sent();
207
+ this.isSubscribed = false;
208
+ return [2 /*return*/];
209
+ }
210
+ });
211
+ });
212
+ };
213
+ ClearingHouse.prototype.unsubscribeUsers = function () {
214
+ return __spreadArray([], this.users.values(), true).map(function (user) { return user.unsubscribe(); });
215
+ };
216
+ ClearingHouse.prototype.getStatePublicKey = function () {
217
+ return __awaiter(this, void 0, void 0, function () {
218
+ var _a;
219
+ return __generator(this, function (_b) {
220
+ switch (_b.label) {
221
+ case 0:
222
+ if (this.statePublicKey) {
223
+ return [2 /*return*/, this.statePublicKey];
224
+ }
225
+ _a = this;
226
+ return [4 /*yield*/, (0, pda_1.getClearingHouseStateAccountPublicKey)(this.program.programId)];
227
+ case 1:
228
+ _a.statePublicKey = _b.sent();
229
+ return [2 /*return*/, this.statePublicKey];
230
+ }
231
+ });
232
+ });
233
+ };
234
+ ClearingHouse.prototype.getSignerPublicKey = function () {
235
+ if (this.signerPublicKey) {
236
+ return this.signerPublicKey;
237
+ }
238
+ this.signerPublicKey = (0, pda_1.getClearingHouseSignerPublicKey)(this.program.programId);
239
+ return this.signerPublicKey;
240
+ };
241
+ ClearingHouse.prototype.getStateAccount = function () {
242
+ return this.accountSubscriber.getStateAccountAndSlot().data;
243
+ };
244
+ ClearingHouse.prototype.getPerpMarketAccount = function (marketIndex) {
245
+ var _a;
246
+ marketIndex = marketIndex instanceof anchor_1.BN ? marketIndex : new anchor_1.BN(marketIndex);
247
+ return (_a = this.accountSubscriber.getMarketAccountAndSlot(marketIndex)) === null || _a === void 0 ? void 0 : _a.data;
248
+ };
249
+ ClearingHouse.prototype.getPerpMarketAccounts = function () {
250
+ return this.accountSubscriber
251
+ .getMarketAccountsAndSlots()
252
+ .map(function (value) { return value.data; });
253
+ };
254
+ ClearingHouse.prototype.getSpotMarketAccount = function (marketIndex) {
255
+ marketIndex = marketIndex instanceof anchor_1.BN ? marketIndex : new anchor_1.BN(marketIndex);
256
+ return this.accountSubscriber.getSpotMarketAccountAndSlot(marketIndex).data;
257
+ };
258
+ ClearingHouse.prototype.getQuoteSpotMarketAccount = function () {
259
+ return this.accountSubscriber.getSpotMarketAccountAndSlot(numericConstants_1.QUOTE_SPOT_MARKET_INDEX).data;
260
+ };
261
+ ClearingHouse.prototype.getOraclePriceDataAndSlot = function (oraclePublicKey) {
262
+ return this.accountSubscriber.getOraclePriceDataAndSlot(oraclePublicKey);
263
+ };
264
+ ClearingHouse.prototype.getSerumV3FulfillmentConfig = function (serumMarket) {
265
+ return __awaiter(this, void 0, void 0, function () {
266
+ var address;
267
+ return __generator(this, function (_a) {
268
+ switch (_a.label) {
269
+ case 0: return [4 /*yield*/, (0, pda_1.getSerumFulfillmentConfigPublicKey)(this.program.programId, serumMarket)];
270
+ case 1:
271
+ address = _a.sent();
272
+ return [4 /*yield*/, this.program.account.serumV3FulfillmentConfig.fetch(address)];
273
+ case 2: return [2 /*return*/, (_a.sent())];
274
+ }
275
+ });
276
+ });
277
+ };
278
+ /**
279
+ * Update the wallet to use for clearing house transactions and linked user account
280
+ * @param newWallet
281
+ * @param userIds
282
+ * @param activeUserId
283
+ */
284
+ ClearingHouse.prototype.updateWallet = function (newWallet, userIds, activeUserId) {
285
+ if (userIds === void 0) { userIds = [0]; }
286
+ if (activeUserId === void 0) { activeUserId = 0; }
287
+ return __awaiter(this, void 0, void 0, function () {
288
+ var newProvider, newProgram;
289
+ return __generator(this, function (_a) {
290
+ switch (_a.label) {
291
+ case 0:
292
+ newProvider = new anchor_1.AnchorProvider(this.connection, newWallet, this.opts);
293
+ newProgram = new anchor_1.Program(clearing_house_json_1["default"], this.program.programId, newProvider);
294
+ // Update provider for txSender with new wallet details
295
+ this.txSender.provider = newProvider;
296
+ this.wallet = newWallet;
297
+ this.provider = newProvider;
298
+ this.program = newProgram;
299
+ if (!this.isSubscribed) return [3 /*break*/, 2];
300
+ return [4 /*yield*/, Promise.all(this.unsubscribeUsers())];
301
+ case 1:
302
+ _a.sent();
303
+ _a.label = 2;
304
+ case 2:
305
+ this.users.clear();
306
+ this.createUsers(userIds, this.userAccountSubscriptionConfig);
307
+ if (!this.isSubscribed) return [3 /*break*/, 4];
308
+ return [4 /*yield*/, Promise.all(this.subscribeUsers())];
309
+ case 3:
310
+ _a.sent();
311
+ _a.label = 4;
312
+ case 4:
313
+ this.activeUserId = activeUserId;
314
+ this.userStatsAccountPublicKey = undefined;
315
+ return [2 /*return*/];
316
+ }
317
+ });
318
+ });
319
+ };
320
+ ClearingHouse.prototype.switchActiveUser = function (userId) {
321
+ return __awaiter(this, void 0, void 0, function () {
322
+ return __generator(this, function (_a) {
323
+ this.activeUserId = userId;
324
+ return [2 /*return*/];
325
+ });
326
+ });
327
+ };
328
+ ClearingHouse.prototype.addUser = function (userId) {
329
+ return __awaiter(this, void 0, void 0, function () {
330
+ var user;
331
+ return __generator(this, function (_a) {
332
+ switch (_a.label) {
333
+ case 0:
334
+ if (this.users.has(userId)) {
335
+ return [2 /*return*/];
336
+ }
337
+ user = this.createUser(userId, this.userAccountSubscriptionConfig);
338
+ return [4 /*yield*/, user.subscribe()];
339
+ case 1:
340
+ _a.sent();
341
+ this.users.set(userId, user);
342
+ return [2 /*return*/];
343
+ }
344
+ });
345
+ });
346
+ };
347
+ ClearingHouse.prototype.initializeUserAccount = function (userId, name, referrerInfo) {
348
+ if (userId === void 0) { userId = 0; }
349
+ if (name === void 0) { name = userName_1.DEFAULT_USER_NAME; }
350
+ return __awaiter(this, void 0, void 0, function () {
351
+ var _a, userAccountPublicKey, initializeUserAccountIx, tx, _b, _c, txSig;
352
+ return __generator(this, function (_d) {
353
+ switch (_d.label) {
354
+ case 0: return [4 /*yield*/, this.getInitializeUserInstructions(userId, name, referrerInfo)];
355
+ case 1:
356
+ _a = _d.sent(), userAccountPublicKey = _a[0], initializeUserAccountIx = _a[1];
357
+ tx = new web3_js_1.Transaction();
358
+ if (!(userId === 0)) return [3 /*break*/, 3];
359
+ // not the safest assumption, can explicitly check if user stats account exists if it causes problems
360
+ _c = (_b = tx).add;
361
+ return [4 /*yield*/, this.getInitializeUserStatsIx()];
362
+ case 2:
363
+ // not the safest assumption, can explicitly check if user stats account exists if it causes problems
364
+ _c.apply(_b, [_d.sent()]);
365
+ _d.label = 3;
366
+ case 3:
367
+ tx.add(initializeUserAccountIx);
368
+ return [4 /*yield*/, this.txSender.send(tx, [], this.opts)];
369
+ case 4:
370
+ txSig = (_d.sent()).txSig;
371
+ return [2 /*return*/, [txSig, userAccountPublicKey]];
372
+ }
373
+ });
374
+ });
375
+ };
376
+ ClearingHouse.prototype.getInitializeUserInstructions = function (userId, name, referrerInfo) {
377
+ if (userId === void 0) { userId = 0; }
378
+ if (name === void 0) { name = userName_1.DEFAULT_USER_NAME; }
379
+ return __awaiter(this, void 0, void 0, function () {
380
+ var userAccountPublicKey, remainingAccounts, nameBuffer, initializeUserAccountIx, _a, _b, _c;
381
+ var _d, _e;
382
+ return __generator(this, function (_f) {
383
+ switch (_f.label) {
384
+ case 0: return [4 /*yield*/, (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.wallet.publicKey, userId)];
385
+ case 1:
386
+ userAccountPublicKey = _f.sent();
387
+ remainingAccounts = new Array();
388
+ if (referrerInfo !== undefined) {
389
+ remainingAccounts.push({
390
+ pubkey: referrerInfo.referrer,
391
+ isWritable: true,
392
+ isSigner: false
393
+ });
394
+ remainingAccounts.push({
395
+ pubkey: referrerInfo.referrerStats,
396
+ isWritable: true,
397
+ isSigner: false
398
+ });
399
+ }
400
+ nameBuffer = (0, userName_1.encodeName)(name);
401
+ _b = (_a = this.program.instruction).initializeUser;
402
+ _c = [userId, nameBuffer];
403
+ _d = {};
404
+ _e = {
405
+ user: userAccountPublicKey,
406
+ userStats: this.getUserStatsAccountPublicKey(),
407
+ authority: this.wallet.publicKey,
408
+ payer: this.wallet.publicKey,
409
+ rent: anchor.web3.SYSVAR_RENT_PUBKEY,
410
+ systemProgram: anchor.web3.SystemProgram.programId
411
+ };
412
+ return [4 /*yield*/, this.getStatePublicKey()];
413
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
414
+ _e),
415
+ _d.remainingAccounts = remainingAccounts,
416
+ _d)]))];
417
+ case 3:
418
+ initializeUserAccountIx = _f.sent();
419
+ return [2 /*return*/, [userAccountPublicKey, initializeUserAccountIx]];
420
+ }
421
+ });
422
+ });
423
+ };
424
+ ClearingHouse.prototype.getInitializeUserStatsIx = function () {
425
+ return __awaiter(this, void 0, void 0, function () {
426
+ var _a, _b;
427
+ var _c, _d;
428
+ return __generator(this, function (_e) {
429
+ switch (_e.label) {
430
+ case 0:
431
+ _b = (_a = this.program.instruction).initializeUserStats;
432
+ _c = {};
433
+ _d = {
434
+ userStats: this.getUserStatsAccountPublicKey(),
435
+ authority: this.wallet.publicKey,
436
+ payer: this.wallet.publicKey,
437
+ rent: anchor.web3.SYSVAR_RENT_PUBKEY,
438
+ systemProgram: anchor.web3.SystemProgram.programId
439
+ };
440
+ return [4 /*yield*/, this.getStatePublicKey()];
441
+ case 1: return [4 /*yield*/, _b.apply(_a, [(_c.accounts = (_d.state = _e.sent(),
442
+ _d),
443
+ _c)])];
444
+ case 2: return [2 /*return*/, _e.sent()];
445
+ }
446
+ });
447
+ });
448
+ };
449
+ ClearingHouse.prototype.getUser = function (userId) {
450
+ userId = userId !== null && userId !== void 0 ? userId : this.activeUserId;
451
+ if (!this.users.has(userId)) {
452
+ throw new Error("Clearing House has no user for user id ".concat(userId));
453
+ }
454
+ return this.users.get(userId);
455
+ };
456
+ ClearingHouse.prototype.getUsers = function () {
457
+ return __spreadArray([], this.users.values(), true);
458
+ };
459
+ ClearingHouse.prototype.getUserStats = function () {
460
+ return this.userStats;
461
+ };
462
+ ClearingHouse.prototype.getUserStatsAccountPublicKey = function () {
463
+ if (this.userStatsAccountPublicKey) {
464
+ return this.userStatsAccountPublicKey;
465
+ }
466
+ this.userStatsAccountPublicKey = (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, this.wallet.publicKey);
467
+ return this.userStatsAccountPublicKey;
468
+ };
469
+ ClearingHouse.prototype.getUserAccountPublicKey = function () {
470
+ return __awaiter(this, void 0, void 0, function () {
471
+ return __generator(this, function (_a) {
472
+ return [2 /*return*/, this.getUser().userAccountPublicKey];
473
+ });
474
+ });
475
+ };
476
+ ClearingHouse.prototype.getUserAccount = function (userId) {
477
+ return this.getUser(userId).getUserAccount();
478
+ };
479
+ ClearingHouse.prototype.getUserAccountAndSlot = function (userId) {
480
+ return this.getUser(userId).getUserAccountAndSlot();
481
+ };
482
+ ClearingHouse.prototype.getSpotPosition = function (marketIndex) {
483
+ var marketIndexBN = marketIndex instanceof anchor_1.BN ? marketIndex : new anchor_1.BN(marketIndex);
484
+ return this.getUserAccount().spotPositions.find(function (spotPosition) {
485
+ return spotPosition.marketIndex.eq(marketIndexBN);
486
+ });
487
+ };
488
+ ClearingHouse.prototype.getQuoteAssetTokenAmount = function () {
489
+ var spotMarket = this.getSpotMarketAccount(numericConstants_1.QUOTE_SPOT_MARKET_INDEX);
490
+ var spotPosition = this.getSpotPosition(numericConstants_1.QUOTE_SPOT_MARKET_INDEX);
491
+ return (0, spotBalance_1.getTokenAmount)(spotPosition.balance, spotMarket, spotPosition.balanceType);
492
+ };
493
+ ClearingHouse.prototype.getRemainingAccounts = function (params) {
494
+ var userAccountAndSlot = this.getUserAccountAndSlot();
495
+ if (!userAccountAndSlot) {
496
+ throw Error('No user account found. Most likely user account does not exist or failed to fetch account');
497
+ }
498
+ var userAccount = userAccountAndSlot.data, lastUserPositionsSlot = userAccountAndSlot.slot;
499
+ var oracleAccountMap = new Map();
500
+ var spotMarketAccountMap = new Map();
501
+ var perpMarketAccountMap = new Map();
502
+ for (var _i = 0, _a = this.marketLastSlotCache.entries(); _i < _a.length; _i++) {
503
+ var _b = _a[_i], marketIndexNum = _b[0], slot = _b[1];
504
+ // if cache has more recent slot than user positions account slot, add market to remaining accounts
505
+ // otherwise remove from slot
506
+ if (slot > lastUserPositionsSlot) {
507
+ var marketAccount = this.getPerpMarketAccount(marketIndexNum);
508
+ perpMarketAccountMap.set(marketIndexNum, {
509
+ pubkey: marketAccount.pubkey,
510
+ isSigner: false,
511
+ isWritable: false
512
+ });
513
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
514
+ pubkey: marketAccount.amm.oracle,
515
+ isSigner: false,
516
+ isWritable: false
517
+ });
518
+ }
519
+ else {
520
+ this.marketLastSlotCache["delete"](marketIndexNum);
521
+ }
522
+ }
523
+ for (var _c = 0, _d = userAccount.perpPositions; _c < _d.length; _c++) {
524
+ var position = _d[_c];
525
+ if (!(0, position_1.positionIsAvailable)(position)) {
526
+ var marketIndexNum = position.marketIndex.toNumber();
527
+ var marketAccount = this.getPerpMarketAccount(marketIndexNum);
528
+ perpMarketAccountMap.set(marketIndexNum, {
529
+ pubkey: marketAccount.pubkey,
530
+ isSigner: false,
531
+ isWritable: false
532
+ });
533
+ oracleAccountMap.set(marketAccount.pubkey.toString(), {
534
+ pubkey: marketAccount.amm.oracle,
535
+ isSigner: false,
536
+ isWritable: false
537
+ });
538
+ }
539
+ }
540
+ if (params.readablePerpMarketIndex) {
541
+ var marketAccount = this.getPerpMarketAccount(params.readablePerpMarketIndex.toNumber());
542
+ perpMarketAccountMap.set(params.readablePerpMarketIndex.toNumber(), {
543
+ pubkey: marketAccount.pubkey,
544
+ isSigner: false,
545
+ isWritable: true
546
+ });
547
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
548
+ pubkey: marketAccount.amm.oracle,
549
+ isSigner: false,
550
+ isWritable: false
551
+ });
552
+ }
553
+ if (params.writablePerpMarketIndex) {
554
+ var marketAccount = this.getPerpMarketAccount(params.writablePerpMarketIndex.toNumber());
555
+ perpMarketAccountMap.set(params.writablePerpMarketIndex.toNumber(), {
556
+ pubkey: marketAccount.pubkey,
557
+ isSigner: false,
558
+ isWritable: true
559
+ });
560
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
561
+ pubkey: marketAccount.amm.oracle,
562
+ isSigner: false,
563
+ isWritable: false
564
+ });
565
+ }
566
+ for (var _e = 0, _f = userAccount.spotPositions; _e < _f.length; _e++) {
567
+ var spotPosition = _f[_e];
568
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
569
+ var spotMarketAccount = this.getSpotMarketAccount(spotPosition.marketIndex);
570
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
571
+ pubkey: spotMarketAccount.pubkey,
572
+ isSigner: false,
573
+ isWritable: false
574
+ });
575
+ if (!spotMarketAccount.marketIndex.eq(numericConstants_1.ZERO)) {
576
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
577
+ pubkey: spotMarketAccount.oracle,
578
+ isSigner: false,
579
+ isWritable: false
580
+ });
581
+ }
582
+ }
583
+ }
584
+ if (params.readableSpotMarketIndex) {
585
+ var spotMarketAccount = this.getSpotMarketAccount(params.readableSpotMarketIndex);
586
+ spotMarketAccountMap.set(params.readableSpotMarketIndex.toNumber(), {
587
+ pubkey: spotMarketAccount.pubkey,
588
+ isSigner: false,
589
+ isWritable: false
590
+ });
591
+ if (!spotMarketAccount.marketIndex.eq(numericConstants_1.ZERO)) {
592
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
593
+ pubkey: spotMarketAccount.oracle,
594
+ isSigner: false,
595
+ isWritable: false
596
+ });
597
+ }
598
+ }
599
+ if (params.writableSpotMarketIndex) {
600
+ var spotMarketAccount = this.getSpotMarketAccount(params.writableSpotMarketIndex);
601
+ spotMarketAccountMap.set(params.writableSpotMarketIndex.toNumber(), {
602
+ pubkey: spotMarketAccount.pubkey,
603
+ isSigner: false,
604
+ isWritable: true
605
+ });
606
+ if (!spotMarketAccount.marketIndex.eq(numericConstants_1.ZERO)) {
607
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
608
+ pubkey: spotMarketAccount.oracle,
609
+ isSigner: false,
610
+ isWritable: false
611
+ });
612
+ }
613
+ }
614
+ return __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), perpMarketAccountMap.values(), true);
615
+ };
616
+ ClearingHouse.prototype.getOrder = function (orderId) {
617
+ var _a;
618
+ var orderIdBN = orderId instanceof anchor_1.BN ? orderId : new anchor_1.BN(orderId);
619
+ return (_a = this.getUserAccount()) === null || _a === void 0 ? void 0 : _a.orders.find(function (order) {
620
+ return order.orderId.eq(orderIdBN);
621
+ });
622
+ };
623
+ ClearingHouse.prototype.getOrderByUserId = function (userOrderId) {
624
+ var _a;
625
+ return (_a = this.getUserAccount()) === null || _a === void 0 ? void 0 : _a.orders.find(function (order) { return order.userOrderId === userOrderId; });
626
+ };
627
+ ClearingHouse.prototype.deposit = function (amount, marketIndex, collateralAccountPublicKey, userId, reduceOnly) {
628
+ if (reduceOnly === void 0) { reduceOnly = false; }
629
+ return __awaiter(this, void 0, void 0, function () {
630
+ var tx, additionalSigners, spotMarketAccount, isSolMarket, authority, createWSOLTokenAccount, _a, ixs, signers, pubkey, depositCollateralIx, txSig;
631
+ return __generator(this, function (_b) {
632
+ switch (_b.label) {
633
+ case 0:
634
+ tx = new web3_js_1.Transaction();
635
+ additionalSigners = [];
636
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
637
+ isSolMarket = spotMarketAccount.mint.equals(spotMarkets_1.WRAPPED_SOL_MINT);
638
+ authority = this.wallet.publicKey;
639
+ createWSOLTokenAccount = isSolMarket && collateralAccountPublicKey.equals(authority);
640
+ if (!createWSOLTokenAccount) return [3 /*break*/, 2];
641
+ return [4 /*yield*/, this.getWrappedSolAccountCreationIxs(amount)];
642
+ case 1:
643
+ _a = _b.sent(), ixs = _a.ixs, signers = _a.signers, pubkey = _a.pubkey;
644
+ collateralAccountPublicKey = pubkey;
645
+ ixs.forEach(function (ix) {
646
+ tx.add(ix);
647
+ });
648
+ signers.forEach(function (signer) { return additionalSigners.push(signer); });
649
+ _b.label = 2;
650
+ case 2: return [4 /*yield*/, this.getDepositInstruction(amount, marketIndex, collateralAccountPublicKey, userId, reduceOnly, true)];
651
+ case 3:
652
+ depositCollateralIx = _b.sent();
653
+ tx.add(depositCollateralIx);
654
+ // Close the wrapped sol account at the end of the transaction
655
+ if (createWSOLTokenAccount) {
656
+ tx.add(spl_token_1.Token.createCloseAccountInstruction(spl_token_1.TOKEN_PROGRAM_ID, collateralAccountPublicKey, authority, authority, []));
657
+ }
658
+ return [4 /*yield*/, this.txSender.send(tx, additionalSigners, this.opts)];
659
+ case 4:
660
+ txSig = (_b.sent()).txSig;
661
+ return [2 /*return*/, txSig];
662
+ }
663
+ });
664
+ });
665
+ };
666
+ ClearingHouse.prototype.getDepositInstruction = function (amount, marketIndex, userTokenAccount, userId, reduceOnly, userInitialized) {
667
+ if (reduceOnly === void 0) { reduceOnly = false; }
668
+ if (userInitialized === void 0) { userInitialized = true; }
669
+ return __awaiter(this, void 0, void 0, function () {
670
+ var userAccountPublicKey, _a, remainingAccounts, spotMarketAccount_1, spotMarketAccount, _b, _c, _d;
671
+ var _e, _f;
672
+ return __generator(this, function (_g) {
673
+ switch (_g.label) {
674
+ case 0:
675
+ if (!userId) return [3 /*break*/, 2];
676
+ return [4 /*yield*/, (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.wallet.publicKey, userId)];
677
+ case 1:
678
+ _a = _g.sent();
679
+ return [3 /*break*/, 4];
680
+ case 2: return [4 /*yield*/, this.getUserAccountPublicKey()];
681
+ case 3:
682
+ _a = _g.sent();
683
+ _g.label = 4;
684
+ case 4:
685
+ userAccountPublicKey = _a;
686
+ remainingAccounts = [];
687
+ if (userInitialized) {
688
+ remainingAccounts = this.getRemainingAccounts({
689
+ writableSpotMarketIndex: marketIndex
690
+ });
691
+ }
692
+ else {
693
+ spotMarketAccount_1 = this.getSpotMarketAccount(marketIndex);
694
+ if (!spotMarketAccount_1.oracle.equals(web3_js_1.PublicKey["default"])) {
695
+ remainingAccounts.push({
696
+ pubkey: spotMarketAccount_1.oracle,
697
+ isSigner: false,
698
+ isWritable: false
699
+ });
700
+ }
701
+ remainingAccounts.push({
702
+ pubkey: spotMarketAccount_1.pubkey,
703
+ isSigner: false,
704
+ isWritable: true
705
+ });
706
+ }
707
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
708
+ _c = (_b = this.program.instruction).deposit;
709
+ _d = [marketIndex,
710
+ amount,
711
+ reduceOnly];
712
+ _e = {};
713
+ _f = {};
714
+ return [4 /*yield*/, this.getStatePublicKey()];
715
+ case 5: return [4 /*yield*/, _c.apply(_b, _d.concat([(_e.accounts = (_f.state = _g.sent(),
716
+ _f.spotMarket = spotMarketAccount.pubkey,
717
+ _f.spotMarketVault = spotMarketAccount.vault,
718
+ _f.user = userAccountPublicKey,
719
+ _f.userStats = this.getUserStatsAccountPublicKey(),
720
+ _f.userTokenAccount = userTokenAccount,
721
+ _f.authority = this.wallet.publicKey,
722
+ _f.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
723
+ _f),
724
+ _e.remainingAccounts = remainingAccounts,
725
+ _e)]))];
726
+ case 6: return [2 /*return*/, _g.sent()];
727
+ }
728
+ });
729
+ });
730
+ };
731
+ ClearingHouse.prototype.checkIfAccountExists = function (account) {
732
+ return __awaiter(this, void 0, void 0, function () {
733
+ var accountInfo, e_1;
734
+ return __generator(this, function (_a) {
735
+ switch (_a.label) {
736
+ case 0:
737
+ _a.trys.push([0, 2, , 3]);
738
+ return [4 /*yield*/, this.connection.getAccountInfo(account)];
739
+ case 1:
740
+ accountInfo = _a.sent();
741
+ return [2 /*return*/, accountInfo && true];
742
+ case 2:
743
+ e_1 = _a.sent();
744
+ // Doesn't already exist
745
+ return [2 /*return*/, false];
746
+ case 3: return [2 /*return*/];
747
+ }
748
+ });
749
+ });
750
+ };
751
+ ClearingHouse.prototype.getSolWithdrawalIxs = function (marketIndex, amount) {
752
+ return __awaiter(this, void 0, void 0, function () {
753
+ var result, authority, _a, ixs, signers, pubkey, withdrawIx;
754
+ return __generator(this, function (_b) {
755
+ switch (_b.label) {
756
+ case 0:
757
+ result = {
758
+ ixs: [],
759
+ signers: [],
760
+ pubkey: web3_js_1.PublicKey["default"]
761
+ };
762
+ authority = this.wallet.publicKey;
763
+ return [4 /*yield*/, this.getWrappedSolAccountCreationIxs(amount)];
764
+ case 1:
765
+ _a = _b.sent(), ixs = _a.ixs, signers = _a.signers, pubkey = _a.pubkey;
766
+ result.pubkey = pubkey;
767
+ ixs.forEach(function (ix) {
768
+ result.ixs.push(ix);
769
+ });
770
+ signers.forEach(function (ix) {
771
+ result.signers.push(ix);
772
+ });
773
+ return [4 /*yield*/, this.getWithdrawIx(amount, marketIndex, pubkey, true)];
774
+ case 2:
775
+ withdrawIx = _b.sent();
776
+ result.ixs.push(withdrawIx);
777
+ result.ixs.push(spl_token_1.Token.createCloseAccountInstruction(spl_token_1.TOKEN_PROGRAM_ID, pubkey, authority, authority, []));
778
+ return [2 /*return*/, result];
779
+ }
780
+ });
781
+ });
782
+ };
783
+ ClearingHouse.prototype.getWrappedSolAccountCreationIxs = function (amount) {
784
+ return __awaiter(this, void 0, void 0, function () {
785
+ var wrappedSolAccount, result, rentSpaceLamports, depositAmountLamports, authority;
786
+ return __generator(this, function (_a) {
787
+ wrappedSolAccount = new web3_js_1.Keypair();
788
+ result = {
789
+ ixs: [],
790
+ signers: [],
791
+ pubkey: wrappedSolAccount.publicKey
792
+ };
793
+ rentSpaceLamports = new anchor_1.BN(web3_js_1.LAMPORTS_PER_SOL / 100);
794
+ depositAmountLamports = amount.add(rentSpaceLamports);
795
+ authority = this.wallet.publicKey;
796
+ result.ixs.push(web3_js_1.SystemProgram.createAccount({
797
+ fromPubkey: authority,
798
+ newAccountPubkey: wrappedSolAccount.publicKey,
799
+ lamports: depositAmountLamports.toNumber(),
800
+ space: 165,
801
+ programId: spl_token_1.TOKEN_PROGRAM_ID
802
+ }));
803
+ result.ixs.push(spl_token_1.Token.createInitAccountInstruction(spl_token_1.TOKEN_PROGRAM_ID, spotMarkets_1.WRAPPED_SOL_MINT, wrappedSolAccount.publicKey, authority));
804
+ result.signers.push(wrappedSolAccount);
805
+ return [2 /*return*/, result];
806
+ });
807
+ });
808
+ };
809
+ /**
810
+ * Creates the Clearing House User account for a user, and deposits some initial collateral
811
+ * @param amount
812
+ * @param userTokenAccount
813
+ * @param marketIndex
814
+ * @param userId
815
+ * @param name
816
+ * @param fromUserId
817
+ * @returns
818
+ */
819
+ ClearingHouse.prototype.initializeUserAccountAndDepositCollateral = function (amount, userTokenAccount, marketIndex, userId, name, fromUserId, referrerInfo) {
820
+ if (marketIndex === void 0) { marketIndex = new anchor_1.BN(0); }
821
+ if (userId === void 0) { userId = 0; }
822
+ if (name === void 0) { name = userName_1.DEFAULT_USER_NAME; }
823
+ return __awaiter(this, void 0, void 0, function () {
824
+ var _a, userAccountPublicKey, initializeUserAccountIx, additionalSigners, spotMarket, isSolMarket, tx, authority, createWSOLTokenAccount, _b, startIxs, signers, pubkey, depositCollateralIx, _c, _d, _e, txSig;
825
+ return __generator(this, function (_f) {
826
+ switch (_f.label) {
827
+ case 0: return [4 /*yield*/, this.getInitializeUserInstructions(userId, name, referrerInfo)];
828
+ case 1:
829
+ _a = _f.sent(), userAccountPublicKey = _a[0], initializeUserAccountIx = _a[1];
830
+ additionalSigners = [];
831
+ spotMarket = this.getSpotMarketAccount(marketIndex);
832
+ isSolMarket = spotMarket.mint.equals(spotMarkets_1.WRAPPED_SOL_MINT);
833
+ tx = new web3_js_1.Transaction();
834
+ authority = this.wallet.publicKey;
835
+ createWSOLTokenAccount = isSolMarket && userTokenAccount.equals(authority);
836
+ if (!createWSOLTokenAccount) return [3 /*break*/, 3];
837
+ return [4 /*yield*/, this.getWrappedSolAccountCreationIxs(amount)];
838
+ case 2:
839
+ _b = _f.sent(), startIxs = _b.ixs, signers = _b.signers, pubkey = _b.pubkey;
840
+ userTokenAccount = pubkey;
841
+ startIxs.forEach(function (ix) {
842
+ tx.add(ix);
843
+ });
844
+ signers.forEach(function (signer) { return additionalSigners.push(signer); });
845
+ _f.label = 3;
846
+ case 3:
847
+ if (!(fromUserId != null)) return [3 /*break*/, 5];
848
+ return [4 /*yield*/, this.getTransferDepositIx(amount, marketIndex, fromUserId, userId)];
849
+ case 4:
850
+ _c = _f.sent();
851
+ return [3 /*break*/, 7];
852
+ case 5: return [4 /*yield*/, this.getDepositInstruction(amount, marketIndex, userTokenAccount, userId, false, false)];
853
+ case 6:
854
+ _c = _f.sent();
855
+ _f.label = 7;
856
+ case 7:
857
+ depositCollateralIx = _c;
858
+ if (!(userId === 0)) return [3 /*break*/, 9];
859
+ _e = (_d = tx).add;
860
+ return [4 /*yield*/, this.getInitializeUserStatsIx()];
861
+ case 8:
862
+ _e.apply(_d, [_f.sent()]);
863
+ _f.label = 9;
864
+ case 9:
865
+ tx.add(initializeUserAccountIx).add(depositCollateralIx);
866
+ // Close the wrapped sol account at the end of the transaction
867
+ if (createWSOLTokenAccount) {
868
+ tx.add(spl_token_1.Token.createCloseAccountInstruction(spl_token_1.TOKEN_PROGRAM_ID, userTokenAccount, authority, authority, []));
869
+ }
870
+ return [4 /*yield*/, this.txSender.send(tx, additionalSigners, this.opts)];
871
+ case 10:
872
+ txSig = (_f.sent()).txSig;
873
+ return [2 /*return*/, [txSig, userAccountPublicKey]];
874
+ }
875
+ });
876
+ });
877
+ };
878
+ ClearingHouse.prototype.initializeUserAccountForDevnet = function (userId, name, marketIndex, tokenFaucet, amount, referrerInfo) {
879
+ if (userId === void 0) { userId = 0; }
880
+ if (name === void 0) { name = userName_1.DEFAULT_USER_NAME; }
881
+ return __awaiter(this, void 0, void 0, function () {
882
+ var _a, associateTokenPublicKey, createAssociatedAccountIx, mintToIx, _b, userAccountPublicKey, initializeUserAccountIx, depositCollateralIx, tx, _c, _d, txSig;
883
+ return __generator(this, function (_e) {
884
+ switch (_e.label) {
885
+ case 0: return [4 /*yield*/, tokenFaucet.createAssociatedTokenAccountAndMintToInstructions(this.wallet.publicKey, amount)];
886
+ case 1:
887
+ _a = _e.sent(), associateTokenPublicKey = _a[0], createAssociatedAccountIx = _a[1], mintToIx = _a[2];
888
+ return [4 /*yield*/, this.getInitializeUserInstructions(userId, name, referrerInfo)];
889
+ case 2:
890
+ _b = _e.sent(), userAccountPublicKey = _b[0], initializeUserAccountIx = _b[1];
891
+ return [4 /*yield*/, this.getDepositInstruction(amount, marketIndex, associateTokenPublicKey, userId, false, false)];
892
+ case 3:
893
+ depositCollateralIx = _e.sent();
894
+ tx = new web3_js_1.Transaction().add(createAssociatedAccountIx).add(mintToIx);
895
+ if (!(userId === 0)) return [3 /*break*/, 5];
896
+ _d = (_c = tx).add;
897
+ return [4 /*yield*/, this.getInitializeUserStatsIx()];
898
+ case 4:
899
+ _d.apply(_c, [_e.sent()]);
900
+ _e.label = 5;
901
+ case 5:
902
+ tx.add(initializeUserAccountIx).add(depositCollateralIx);
903
+ return [4 /*yield*/, this.program.provider.sendAndConfirm(tx, [])];
904
+ case 6:
905
+ txSig = _e.sent();
906
+ return [2 /*return*/, [txSig, userAccountPublicKey]];
907
+ }
908
+ });
909
+ });
910
+ };
911
+ ClearingHouse.prototype.withdraw = function (amount, marketIndex, userTokenAccount, reduceOnly) {
912
+ if (reduceOnly === void 0) { reduceOnly = false; }
913
+ return __awaiter(this, void 0, void 0, function () {
914
+ var tx, additionalSigners, spotMarketAccount, isSolMarket, authority, createWSOLTokenAccount, _a, ixs, signers, pubkey, withdrawCollateral, txSig;
915
+ return __generator(this, function (_b) {
916
+ switch (_b.label) {
917
+ case 0:
918
+ tx = new web3_js_1.Transaction();
919
+ additionalSigners = [];
920
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
921
+ isSolMarket = spotMarketAccount.mint.equals(spotMarkets_1.WRAPPED_SOL_MINT);
922
+ authority = this.wallet.publicKey;
923
+ createWSOLTokenAccount = isSolMarket && userTokenAccount.equals(authority);
924
+ if (!createWSOLTokenAccount) return [3 /*break*/, 2];
925
+ return [4 /*yield*/, this.getWrappedSolAccountCreationIxs(amount)];
926
+ case 1:
927
+ _a = _b.sent(), ixs = _a.ixs, signers = _a.signers, pubkey = _a.pubkey;
928
+ userTokenAccount = pubkey;
929
+ ixs.forEach(function (ix) {
930
+ tx.add(ix);
931
+ });
932
+ signers.forEach(function (signer) { return additionalSigners.push(signer); });
933
+ _b.label = 2;
934
+ case 2: return [4 /*yield*/, this.getWithdrawIx(amount, spotMarketAccount.marketIndex, userTokenAccount, reduceOnly)];
935
+ case 3:
936
+ withdrawCollateral = _b.sent();
937
+ tx.add(withdrawCollateral);
938
+ // Close the wrapped sol account at the end of the transaction
939
+ if (createWSOLTokenAccount) {
940
+ tx.add(spl_token_1.Token.createCloseAccountInstruction(spl_token_1.TOKEN_PROGRAM_ID, userTokenAccount, authority, authority, []));
941
+ }
942
+ return [4 /*yield*/, this.txSender.send(tx, additionalSigners, this.opts)];
943
+ case 4:
944
+ txSig = (_b.sent()).txSig;
945
+ return [2 /*return*/, txSig];
946
+ }
947
+ });
948
+ });
949
+ };
950
+ ClearingHouse.prototype.getWithdrawIx = function (amount, marketIndex, userTokenAccount, reduceOnly) {
951
+ if (reduceOnly === void 0) { reduceOnly = false; }
952
+ return __awaiter(this, void 0, void 0, function () {
953
+ var userAccountPublicKey, remainingAccounts, spotMarketAccount, _a, _b, _c;
954
+ var _d, _e;
955
+ return __generator(this, function (_f) {
956
+ switch (_f.label) {
957
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
958
+ case 1:
959
+ userAccountPublicKey = _f.sent();
960
+ remainingAccounts = this.getRemainingAccounts({
961
+ writableSpotMarketIndex: marketIndex
962
+ });
963
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
964
+ _b = (_a = this.program.instruction).withdraw;
965
+ _c = [marketIndex,
966
+ amount,
967
+ reduceOnly];
968
+ _d = {};
969
+ _e = {};
970
+ return [4 /*yield*/, this.getStatePublicKey()];
971
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
972
+ _e.spotMarket = spotMarketAccount.pubkey,
973
+ _e.spotMarketVault = spotMarketAccount.vault,
974
+ _e.clearingHouseSigner = this.getSignerPublicKey(),
975
+ _e.user = userAccountPublicKey,
976
+ _e.userStats = this.getUserStatsAccountPublicKey(),
977
+ _e.userTokenAccount = userTokenAccount,
978
+ _e.authority = this.wallet.publicKey,
979
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
980
+ _e),
981
+ _d.remainingAccounts = remainingAccounts,
982
+ _d)]))];
983
+ case 3: return [2 /*return*/, _f.sent()];
984
+ }
985
+ });
986
+ });
987
+ };
988
+ ClearingHouse.prototype.transferDeposit = function (amount, marketIndex, fromUserId, toUserId) {
989
+ return __awaiter(this, void 0, void 0, function () {
990
+ var txSig, _a, _b, _c;
991
+ return __generator(this, function (_d) {
992
+ switch (_d.label) {
993
+ case 0:
994
+ _b = (_a = this.txSender).send;
995
+ _c = utils_1.wrapInTx;
996
+ return [4 /*yield*/, this.getTransferDepositIx(amount, marketIndex, fromUserId, toUserId)];
997
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
998
+ [],
999
+ this.opts])];
1000
+ case 2:
1001
+ txSig = (_d.sent()).txSig;
1002
+ return [2 /*return*/, txSig];
1003
+ }
1004
+ });
1005
+ });
1006
+ };
1007
+ ClearingHouse.prototype.getTransferDepositIx = function (amount, marketIndex, fromUserId, toUserId) {
1008
+ return __awaiter(this, void 0, void 0, function () {
1009
+ var fromUser, toUser, remainingAccounts, _a, _b, _c;
1010
+ var _d, _e;
1011
+ return __generator(this, function (_f) {
1012
+ switch (_f.label) {
1013
+ case 0: return [4 /*yield*/, (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.wallet.publicKey, fromUserId)];
1014
+ case 1:
1015
+ fromUser = _f.sent();
1016
+ return [4 /*yield*/, (0, pda_1.getUserAccountPublicKey)(this.program.programId, this.wallet.publicKey, toUserId)];
1017
+ case 2:
1018
+ toUser = _f.sent();
1019
+ remainingAccounts = this.getRemainingAccounts({
1020
+ writableSpotMarketIndex: marketIndex
1021
+ });
1022
+ _b = (_a = this.program.instruction).transferDeposit;
1023
+ _c = [marketIndex, amount];
1024
+ _d = {};
1025
+ _e = {
1026
+ authority: this.wallet.publicKey,
1027
+ fromUser: fromUser,
1028
+ toUser: toUser,
1029
+ userStats: this.getUserStatsAccountPublicKey()
1030
+ };
1031
+ return [4 /*yield*/, this.getStatePublicKey()];
1032
+ case 3: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1033
+ _e),
1034
+ _d.remainingAccounts = remainingAccounts,
1035
+ _d)]))];
1036
+ case 4: return [2 /*return*/, _f.sent()];
1037
+ }
1038
+ });
1039
+ });
1040
+ };
1041
+ ClearingHouse.prototype.updateSpotMarketCumulativeInterest = function (marketIndex) {
1042
+ return __awaiter(this, void 0, void 0, function () {
1043
+ var txSig, _a, _b, _c;
1044
+ return __generator(this, function (_d) {
1045
+ switch (_d.label) {
1046
+ case 0:
1047
+ _b = (_a = this.txSender).send;
1048
+ _c = utils_1.wrapInTx;
1049
+ return [4 /*yield*/, this.updateSpotMarketCumulativeInterestIx(marketIndex)];
1050
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1051
+ [],
1052
+ this.opts])];
1053
+ case 2:
1054
+ txSig = (_d.sent()).txSig;
1055
+ return [2 /*return*/, txSig];
1056
+ }
1057
+ });
1058
+ });
1059
+ };
1060
+ ClearingHouse.prototype.updateSpotMarketCumulativeInterestIx = function (marketIndex) {
1061
+ return __awaiter(this, void 0, void 0, function () {
1062
+ var spotMarket;
1063
+ return __generator(this, function (_a) {
1064
+ switch (_a.label) {
1065
+ case 0:
1066
+ spotMarket = this.getSpotMarketAccount(marketIndex);
1067
+ return [4 /*yield*/, this.program.instruction.updateSpotMarketCumulativeInterest({
1068
+ accounts: {
1069
+ spotMarket: spotMarket.pubkey
1070
+ }
1071
+ })];
1072
+ case 1: return [2 /*return*/, _a.sent()];
1073
+ }
1074
+ });
1075
+ });
1076
+ };
1077
+ ClearingHouse.prototype.settleLP = function (settleeUserAccountPublicKey, marketIndex) {
1078
+ return __awaiter(this, void 0, void 0, function () {
1079
+ var txSig, _a, _b, _c;
1080
+ return __generator(this, function (_d) {
1081
+ switch (_d.label) {
1082
+ case 0:
1083
+ _b = (_a = this.txSender).send;
1084
+ _c = utils_1.wrapInTx;
1085
+ return [4 /*yield*/, this.settleLPIx(settleeUserAccountPublicKey, marketIndex)];
1086
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1087
+ [],
1088
+ this.opts])];
1089
+ case 2:
1090
+ txSig = (_d.sent()).txSig;
1091
+ return [2 /*return*/, txSig];
1092
+ }
1093
+ });
1094
+ });
1095
+ };
1096
+ ClearingHouse.prototype.settleLPIx = function (settleeUserAccountPublicKey, marketIndex) {
1097
+ return __awaiter(this, void 0, void 0, function () {
1098
+ var settleeUserAccount, userPositions, remainingAccounts, foundMarket, _i, userPositions_1, position, marketPublicKey, _a, _b, _c;
1099
+ var _d, _e;
1100
+ return __generator(this, function (_f) {
1101
+ switch (_f.label) {
1102
+ case 0: return [4 /*yield*/, this.program.account.user.fetch(settleeUserAccountPublicKey)];
1103
+ case 1:
1104
+ settleeUserAccount = (_f.sent());
1105
+ userPositions = settleeUserAccount.perpPositions;
1106
+ remainingAccounts = [];
1107
+ foundMarket = false;
1108
+ _i = 0, userPositions_1 = userPositions;
1109
+ _f.label = 2;
1110
+ case 2:
1111
+ if (!(_i < userPositions_1.length)) return [3 /*break*/, 5];
1112
+ position = userPositions_1[_i];
1113
+ if (!!(0, position_1.positionIsAvailable)(position)) return [3 /*break*/, 4];
1114
+ return [4 /*yield*/, (0, pda_1.getMarketPublicKey)(this.program.programId, position.marketIndex)];
1115
+ case 3:
1116
+ marketPublicKey = _f.sent();
1117
+ remainingAccounts.push({
1118
+ pubkey: marketPublicKey,
1119
+ isWritable: true,
1120
+ isSigner: false
1121
+ });
1122
+ if (marketIndex.eq(position.marketIndex)) {
1123
+ foundMarket = true;
1124
+ }
1125
+ _f.label = 4;
1126
+ case 4:
1127
+ _i++;
1128
+ return [3 /*break*/, 2];
1129
+ case 5:
1130
+ if (!foundMarket) {
1131
+ console.log('Warning: lp is not in the market specified -- tx will likely fail');
1132
+ }
1133
+ _b = (_a = this.program.instruction).settleLp;
1134
+ _c = [marketIndex];
1135
+ _d = {};
1136
+ _e = {};
1137
+ return [4 /*yield*/, this.getStatePublicKey()];
1138
+ case 6: return [2 /*return*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1139
+ _e.user = settleeUserAccountPublicKey,
1140
+ _e),
1141
+ _d.remainingAccounts = remainingAccounts,
1142
+ _d)]))];
1143
+ }
1144
+ });
1145
+ });
1146
+ };
1147
+ ClearingHouse.prototype.removeLiquidity = function (marketIndex, sharesToBurn) {
1148
+ return __awaiter(this, void 0, void 0, function () {
1149
+ var txSig, _a, _b, _c;
1150
+ return __generator(this, function (_d) {
1151
+ switch (_d.label) {
1152
+ case 0:
1153
+ _b = (_a = this.txSender).send;
1154
+ _c = utils_1.wrapInTx;
1155
+ return [4 /*yield*/, this.getRemoveLiquidityIx(marketIndex, sharesToBurn)];
1156
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1157
+ [],
1158
+ this.opts])];
1159
+ case 2:
1160
+ txSig = (_d.sent()).txSig;
1161
+ return [2 /*return*/, txSig];
1162
+ }
1163
+ });
1164
+ });
1165
+ };
1166
+ ClearingHouse.prototype.getRemoveLiquidityIx = function (marketIndex, sharesToBurn) {
1167
+ return __awaiter(this, void 0, void 0, function () {
1168
+ var userAccountPublicKey, remainingAccounts, userAccount, perpPosition, _a, _b, _c;
1169
+ var _d, _e;
1170
+ return __generator(this, function (_f) {
1171
+ switch (_f.label) {
1172
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
1173
+ case 1:
1174
+ userAccountPublicKey = _f.sent();
1175
+ remainingAccounts = this.getRemainingAccounts({
1176
+ writablePerpMarketIndex: marketIndex
1177
+ });
1178
+ if (sharesToBurn == undefined) {
1179
+ userAccount = this.getUserAccount();
1180
+ perpPosition = userAccount.perpPositions.filter(function (position) {
1181
+ return position.marketIndex.eq(marketIndex);
1182
+ })[0];
1183
+ sharesToBurn = perpPosition.lpShares;
1184
+ console.log('burning lp shares:', sharesToBurn.toString());
1185
+ }
1186
+ _b = (_a = this.program.instruction).removeLiquidity;
1187
+ _c = [sharesToBurn, marketIndex];
1188
+ _d = {};
1189
+ _e = {};
1190
+ return [4 /*yield*/, this.getStatePublicKey()];
1191
+ case 2: return [2 /*return*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1192
+ _e.user = userAccountPublicKey,
1193
+ _e.authority = this.wallet.publicKey,
1194
+ _e),
1195
+ _d.remainingAccounts = remainingAccounts,
1196
+ _d)]))];
1197
+ }
1198
+ });
1199
+ });
1200
+ };
1201
+ ClearingHouse.prototype.addLiquidity = function (amount, marketIndex) {
1202
+ return __awaiter(this, void 0, void 0, function () {
1203
+ var _a, txSig, slot, _b, _c, _d;
1204
+ return __generator(this, function (_e) {
1205
+ switch (_e.label) {
1206
+ case 0:
1207
+ _c = (_b = this.txSender).send;
1208
+ _d = utils_1.wrapInTx;
1209
+ return [4 /*yield*/, this.getAddLiquidityIx(amount, marketIndex)];
1210
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
1211
+ [],
1212
+ this.opts])];
1213
+ case 2:
1214
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
1215
+ this.marketLastSlotCache.set(marketIndex.toNumber(), slot);
1216
+ return [2 /*return*/, txSig];
1217
+ }
1218
+ });
1219
+ });
1220
+ };
1221
+ ClearingHouse.prototype.getAddLiquidityIx = function (amount, marketIndex) {
1222
+ return __awaiter(this, void 0, void 0, function () {
1223
+ var userAccountPublicKey, remainingAccounts, _a, _b, _c;
1224
+ var _d, _e;
1225
+ return __generator(this, function (_f) {
1226
+ switch (_f.label) {
1227
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
1228
+ case 1:
1229
+ userAccountPublicKey = _f.sent();
1230
+ remainingAccounts = this.getRemainingAccounts({
1231
+ writablePerpMarketIndex: marketIndex
1232
+ });
1233
+ _b = (_a = this.program.instruction).addLiquidity;
1234
+ _c = [amount, marketIndex];
1235
+ _d = {};
1236
+ _e = {};
1237
+ return [4 /*yield*/, this.getStatePublicKey()];
1238
+ case 2: return [2 /*return*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1239
+ _e.user = userAccountPublicKey,
1240
+ _e.authority = this.wallet.publicKey,
1241
+ _e),
1242
+ _d.remainingAccounts = remainingAccounts,
1243
+ _d)]))];
1244
+ }
1245
+ });
1246
+ });
1247
+ };
1248
+ ClearingHouse.prototype.openPosition = function (direction, amount, marketIndex, limitPrice) {
1249
+ return __awaiter(this, void 0, void 0, function () {
1250
+ return __generator(this, function (_a) {
1251
+ switch (_a.label) {
1252
+ case 0: return [4 /*yield*/, this.placeAndTake({
1253
+ orderType: types_1.OrderType.MARKET,
1254
+ marketIndex: marketIndex,
1255
+ direction: direction,
1256
+ baseAssetAmount: amount,
1257
+ price: limitPrice
1258
+ })];
1259
+ case 1: return [2 /*return*/, _a.sent()];
1260
+ }
1261
+ });
1262
+ });
1263
+ };
1264
+ ClearingHouse.prototype.sendSignedTx = function (tx) {
1265
+ return __awaiter(this, void 0, void 0, function () {
1266
+ var txSig;
1267
+ return __generator(this, function (_a) {
1268
+ switch (_a.label) {
1269
+ case 0: return [4 /*yield*/, this.txSender.send(tx, undefined, this.opts, true)];
1270
+ case 1:
1271
+ txSig = (_a.sent()).txSig;
1272
+ return [2 /*return*/, txSig];
1273
+ }
1274
+ });
1275
+ });
1276
+ };
1277
+ /**
1278
+ * Sends a market order and returns a signed tx which can fill the order against the vamm, which the caller can use to fill their own order if required.
1279
+ * @param orderParams
1280
+ * @param userAccountPublicKey
1281
+ * @param userAccount
1282
+ * @returns
1283
+ */
1284
+ ClearingHouse.prototype.sendMarketOrderAndGetSignedFillTx = function (orderParams, userAccountPublicKey, userAccount) {
1285
+ return __awaiter(this, void 0, void 0, function () {
1286
+ var marketIndex, orderId, marketOrderTx, _a, fillTx, _b, currentBlockHash, _c, signedMarketOrderTx, signedFillTx, _d, txSig, slot;
1287
+ return __generator(this, function (_e) {
1288
+ switch (_e.label) {
1289
+ case 0:
1290
+ marketIndex = orderParams.marketIndex;
1291
+ orderId = userAccount.nextOrderId;
1292
+ _a = utils_1.wrapInTx;
1293
+ return [4 /*yield*/, this.getPlaceOrderIx(orderParams)];
1294
+ case 1:
1295
+ marketOrderTx = _a.apply(void 0, [_e.sent()]);
1296
+ _b = utils_1.wrapInTx;
1297
+ return [4 /*yield*/, this.getFillOrderIx(userAccountPublicKey, userAccount, {
1298
+ orderId: orderId,
1299
+ marketIndex: marketIndex
1300
+ })];
1301
+ case 2:
1302
+ fillTx = _b.apply(void 0, [_e.sent()]);
1303
+ return [4 /*yield*/, this.connection.getLatestBlockhash('finalized')];
1304
+ case 3:
1305
+ currentBlockHash = (_e.sent()).blockhash;
1306
+ marketOrderTx.recentBlockhash = currentBlockHash;
1307
+ fillTx.recentBlockhash = currentBlockHash;
1308
+ marketOrderTx.feePayer = userAccount.authority;
1309
+ fillTx.feePayer = userAccount.authority;
1310
+ return [4 /*yield*/, this.provider.wallet.signAllTransactions([marketOrderTx, fillTx])];
1311
+ case 4:
1312
+ _c = _e.sent(), signedMarketOrderTx = _c[0], signedFillTx = _c[1];
1313
+ return [4 /*yield*/, this.txSender.send(signedMarketOrderTx, [], this.opts, true)];
1314
+ case 5:
1315
+ _d = _e.sent(), txSig = _d.txSig, slot = _d.slot;
1316
+ this.marketLastSlotCache.set(orderParams.marketIndex.toNumber(), slot);
1317
+ return [2 /*return*/, { txSig: txSig, signedFillTx: signedFillTx }];
1318
+ }
1319
+ });
1320
+ });
1321
+ };
1322
+ ClearingHouse.prototype.placeOrder = function (orderParams) {
1323
+ return __awaiter(this, void 0, void 0, function () {
1324
+ var _a, txSig, slot, _b, _c, _d;
1325
+ return __generator(this, function (_e) {
1326
+ switch (_e.label) {
1327
+ case 0:
1328
+ _c = (_b = this.txSender).send;
1329
+ _d = utils_1.wrapInTx;
1330
+ return [4 /*yield*/, this.getPlaceOrderIx(orderParams)];
1331
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
1332
+ [],
1333
+ this.opts])];
1334
+ case 2:
1335
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
1336
+ this.marketLastSlotCache.set(orderParams.marketIndex.toNumber(), slot);
1337
+ return [2 /*return*/, txSig];
1338
+ }
1339
+ });
1340
+ });
1341
+ };
1342
+ ClearingHouse.prototype.getOrderParams = function (optionalOrderParams, marketType) {
1343
+ return Object.assign({}, types_1.DefaultOrderParams, optionalOrderParams, {
1344
+ marketType: marketType
1345
+ });
1346
+ };
1347
+ ClearingHouse.prototype.getPlaceOrderIx = function (orderParams) {
1348
+ return __awaiter(this, void 0, void 0, function () {
1349
+ var userAccountPublicKey, remainingAccounts, _a, _b, _c;
1350
+ var _d, _e;
1351
+ return __generator(this, function (_f) {
1352
+ switch (_f.label) {
1353
+ case 0:
1354
+ orderParams = this.getOrderParams(orderParams, types_1.MarketType.PERP);
1355
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
1356
+ case 1:
1357
+ userAccountPublicKey = _f.sent();
1358
+ remainingAccounts = this.getRemainingAccounts({
1359
+ readablePerpMarketIndex: orderParams.marketIndex
1360
+ });
1361
+ _b = (_a = this.program.instruction).placeOrder;
1362
+ _c = [orderParams];
1363
+ _d = {};
1364
+ _e = {};
1365
+ return [4 /*yield*/, this.getStatePublicKey()];
1366
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1367
+ _e.user = userAccountPublicKey,
1368
+ _e.userStats = this.getUserStatsAccountPublicKey(),
1369
+ _e.authority = this.wallet.publicKey,
1370
+ _e),
1371
+ _d.remainingAccounts = remainingAccounts,
1372
+ _d)]))];
1373
+ case 3: return [2 /*return*/, _f.sent()];
1374
+ }
1375
+ });
1376
+ });
1377
+ };
1378
+ ClearingHouse.prototype.updateAMMs = function (marketIndexes) {
1379
+ return __awaiter(this, void 0, void 0, function () {
1380
+ var txSig, _a, _b, _c;
1381
+ return __generator(this, function (_d) {
1382
+ switch (_d.label) {
1383
+ case 0:
1384
+ _b = (_a = this.txSender).send;
1385
+ _c = utils_1.wrapInTx;
1386
+ return [4 /*yield*/, this.getUpdateAMMsIx(marketIndexes)];
1387
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1388
+ [],
1389
+ this.opts])];
1390
+ case 2:
1391
+ txSig = (_d.sent()).txSig;
1392
+ return [2 /*return*/, txSig];
1393
+ }
1394
+ });
1395
+ });
1396
+ };
1397
+ ClearingHouse.prototype.getUpdateAMMsIx = function (marketIndexes) {
1398
+ return __awaiter(this, void 0, void 0, function () {
1399
+ var i, marketAccountInfos, oracleAccountInfos, _i, marketIndexes_1, marketIndex, market, remainingAccounts, _a, _b, _c;
1400
+ var _d, _e;
1401
+ return __generator(this, function (_f) {
1402
+ switch (_f.label) {
1403
+ case 0:
1404
+ for (i = marketIndexes.length; i < 5; i++) {
1405
+ marketIndexes.push(new anchor_1.BN(100));
1406
+ }
1407
+ marketAccountInfos = [];
1408
+ oracleAccountInfos = [];
1409
+ for (_i = 0, marketIndexes_1 = marketIndexes; _i < marketIndexes_1.length; _i++) {
1410
+ marketIndex = marketIndexes_1[_i];
1411
+ if (!marketIndex.eq(new anchor_1.BN(100))) {
1412
+ market = this.getPerpMarketAccount(marketIndex);
1413
+ marketAccountInfos.push({
1414
+ pubkey: market.pubkey,
1415
+ isWritable: true,
1416
+ isSigner: false
1417
+ });
1418
+ oracleAccountInfos.push({
1419
+ pubkey: market.amm.oracle,
1420
+ isWritable: false,
1421
+ isSigner: false
1422
+ });
1423
+ }
1424
+ }
1425
+ remainingAccounts = oracleAccountInfos.concat(marketAccountInfos);
1426
+ _b = (_a = this.program.instruction).updateAmms;
1427
+ _c = [marketIndexes];
1428
+ _d = {};
1429
+ _e = {};
1430
+ return [4 /*yield*/, this.getStatePublicKey()];
1431
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1432
+ _e.authority = this.wallet.publicKey,
1433
+ _e),
1434
+ _d.remainingAccounts = remainingAccounts,
1435
+ _d)]))];
1436
+ case 2: return [2 /*return*/, _f.sent()];
1437
+ }
1438
+ });
1439
+ });
1440
+ };
1441
+ ClearingHouse.prototype.settleExpiredMarket = function (marketIndex) {
1442
+ return __awaiter(this, void 0, void 0, function () {
1443
+ var txSig, _a, _b, _c;
1444
+ return __generator(this, function (_d) {
1445
+ switch (_d.label) {
1446
+ case 0:
1447
+ _b = (_a = this.txSender).send;
1448
+ _c = utils_1.wrapInTx;
1449
+ return [4 /*yield*/, this.getSettleExpiredMarketIx(marketIndex)];
1450
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1451
+ [],
1452
+ this.opts])];
1453
+ case 2:
1454
+ txSig = (_d.sent()).txSig;
1455
+ return [2 /*return*/, txSig];
1456
+ }
1457
+ });
1458
+ });
1459
+ };
1460
+ ClearingHouse.prototype.getSettleExpiredMarketIx = function (marketIndex) {
1461
+ return __awaiter(this, void 0, void 0, function () {
1462
+ var marketAccountInfos, oracleAccountInfos, spotMarketAccountInfos, market, remainingAccounts, _a, _b, _c;
1463
+ var _d, _e;
1464
+ return __generator(this, function (_f) {
1465
+ switch (_f.label) {
1466
+ case 0:
1467
+ marketAccountInfos = [];
1468
+ oracleAccountInfos = [];
1469
+ spotMarketAccountInfos = [];
1470
+ market = this.getPerpMarketAccount(marketIndex);
1471
+ marketAccountInfos.push({
1472
+ pubkey: market.pubkey,
1473
+ isWritable: true,
1474
+ isSigner: false
1475
+ });
1476
+ oracleAccountInfos.push({
1477
+ pubkey: market.amm.oracle,
1478
+ isWritable: false,
1479
+ isSigner: false
1480
+ });
1481
+ spotMarketAccountInfos.push({
1482
+ pubkey: this.getSpotMarketAccount(numericConstants_1.QUOTE_SPOT_MARKET_INDEX).pubkey,
1483
+ isSigner: false,
1484
+ isWritable: true
1485
+ });
1486
+ remainingAccounts = oracleAccountInfos
1487
+ .concat(spotMarketAccountInfos)
1488
+ .concat(marketAccountInfos);
1489
+ _b = (_a = this.program.instruction).settleExpiredMarket;
1490
+ _c = [marketIndex];
1491
+ _d = {};
1492
+ _e = {};
1493
+ return [4 /*yield*/, this.getStatePublicKey()];
1494
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1495
+ _e.authority = this.wallet.publicKey,
1496
+ _e),
1497
+ _d.remainingAccounts = remainingAccounts,
1498
+ _d)]))];
1499
+ case 2: return [2 /*return*/, _f.sent()];
1500
+ }
1501
+ });
1502
+ });
1503
+ };
1504
+ ClearingHouse.prototype.cancelOrder = function (orderId) {
1505
+ return __awaiter(this, void 0, void 0, function () {
1506
+ var txSig, _a, _b, _c;
1507
+ return __generator(this, function (_d) {
1508
+ switch (_d.label) {
1509
+ case 0:
1510
+ _b = (_a = this.txSender).send;
1511
+ _c = utils_1.wrapInTx;
1512
+ return [4 /*yield*/, this.getCancelOrderIx(orderId)];
1513
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1514
+ [],
1515
+ this.opts])];
1516
+ case 2:
1517
+ txSig = (_d.sent()).txSig;
1518
+ return [2 /*return*/, txSig];
1519
+ }
1520
+ });
1521
+ });
1522
+ };
1523
+ ClearingHouse.prototype.getCancelOrderIx = function (orderId) {
1524
+ return __awaiter(this, void 0, void 0, function () {
1525
+ var userAccountPublicKey, remainingAccounts, _a, _b, _c;
1526
+ var _d, _e;
1527
+ return __generator(this, function (_f) {
1528
+ switch (_f.label) {
1529
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
1530
+ case 1:
1531
+ userAccountPublicKey = _f.sent();
1532
+ remainingAccounts = this.getRemainingAccounts({});
1533
+ _b = (_a = this.program.instruction).cancelOrder;
1534
+ _c = [orderId !== null && orderId !== void 0 ? orderId : null];
1535
+ _d = {};
1536
+ _e = {};
1537
+ return [4 /*yield*/, this.getStatePublicKey()];
1538
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1539
+ _e.user = userAccountPublicKey,
1540
+ _e.authority = this.wallet.publicKey,
1541
+ _e),
1542
+ _d.remainingAccounts = remainingAccounts,
1543
+ _d)]))];
1544
+ case 3: return [2 /*return*/, _f.sent()];
1545
+ }
1546
+ });
1547
+ });
1548
+ };
1549
+ ClearingHouse.prototype.cancelOrderByUserId = function (userOrderId) {
1550
+ return __awaiter(this, void 0, void 0, function () {
1551
+ var txSig, _a, _b, _c;
1552
+ return __generator(this, function (_d) {
1553
+ switch (_d.label) {
1554
+ case 0:
1555
+ _b = (_a = this.txSender).send;
1556
+ _c = utils_1.wrapInTx;
1557
+ return [4 /*yield*/, this.getCancelOrderByUserIdIx(userOrderId)];
1558
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1559
+ [],
1560
+ this.opts])];
1561
+ case 2:
1562
+ txSig = (_d.sent()).txSig;
1563
+ return [2 /*return*/, txSig];
1564
+ }
1565
+ });
1566
+ });
1567
+ };
1568
+ ClearingHouse.prototype.getCancelOrderByUserIdIx = function (userOrderId) {
1569
+ return __awaiter(this, void 0, void 0, function () {
1570
+ var userAccountPublicKey, order, oracle, remainingAccounts, _a, _b, _c;
1571
+ var _d, _e;
1572
+ return __generator(this, function (_f) {
1573
+ switch (_f.label) {
1574
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
1575
+ case 1:
1576
+ userAccountPublicKey = _f.sent();
1577
+ order = this.getOrderByUserId(userOrderId);
1578
+ oracle = this.getPerpMarketAccount(order.marketIndex).amm.oracle;
1579
+ remainingAccounts = this.getRemainingAccounts({});
1580
+ _b = (_a = this.program.instruction).cancelOrderByUserId;
1581
+ _c = [userOrderId];
1582
+ _d = {};
1583
+ _e = {};
1584
+ return [4 /*yield*/, this.getStatePublicKey()];
1585
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1586
+ _e.user = userAccountPublicKey,
1587
+ _e.authority = this.wallet.publicKey,
1588
+ _e.oracle = oracle,
1589
+ _e),
1590
+ _d.remainingAccounts = remainingAccounts,
1591
+ _d)]))];
1592
+ case 3: return [2 /*return*/, _f.sent()];
1593
+ }
1594
+ });
1595
+ });
1596
+ };
1597
+ ClearingHouse.prototype.fillOrder = function (userAccountPublicKey, user, order, makerInfo, referrerInfo) {
1598
+ return __awaiter(this, void 0, void 0, function () {
1599
+ var txSig, _a, _b, _c;
1600
+ return __generator(this, function (_d) {
1601
+ switch (_d.label) {
1602
+ case 0:
1603
+ _b = (_a = this.txSender).send;
1604
+ _c = utils_1.wrapInTx;
1605
+ return [4 /*yield*/, this.getFillOrderIx(userAccountPublicKey, user, order, makerInfo, referrerInfo)];
1606
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1607
+ [],
1608
+ this.opts])];
1609
+ case 2:
1610
+ txSig = (_d.sent()).txSig;
1611
+ return [2 /*return*/, txSig];
1612
+ }
1613
+ });
1614
+ });
1615
+ };
1616
+ ClearingHouse.prototype.getFillOrderIx = function (userAccountPublicKey, userAccount, order, makerInfo, referrerInfo) {
1617
+ return __awaiter(this, void 0, void 0, function () {
1618
+ var userStatsPublicKey, fillerPublicKey, fillerStatsPublicKey, marketIndex, marketAccount, oracleAccountMap, spotMarketAccountMap, perpMarketAccountMap, _i, _a, spotPosition, spotMarketAccount, _b, _c, position, market, remainingAccounts, orderId, makerOrderId, _d, _e, _f;
1619
+ var _g, _h;
1620
+ return __generator(this, function (_j) {
1621
+ switch (_j.label) {
1622
+ case 0:
1623
+ userStatsPublicKey = (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, userAccount.authority);
1624
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
1625
+ case 1:
1626
+ fillerPublicKey = _j.sent();
1627
+ fillerStatsPublicKey = this.getUserStatsAccountPublicKey();
1628
+ marketIndex = order
1629
+ ? order.marketIndex
1630
+ : userAccount.orders.find(function (order) {
1631
+ return order.orderId.eq(userAccount.nextOrderId.sub(numericConstants_1.ONE));
1632
+ }).marketIndex;
1633
+ marketAccount = this.getPerpMarketAccount(marketIndex);
1634
+ oracleAccountMap = new Map();
1635
+ spotMarketAccountMap = new Map();
1636
+ perpMarketAccountMap = new Map();
1637
+ for (_i = 0, _a = userAccount.spotPositions; _i < _a.length; _i++) {
1638
+ spotPosition = _a[_i];
1639
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
1640
+ spotMarketAccount = this.getSpotMarketAccount(spotPosition.marketIndex);
1641
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
1642
+ pubkey: spotMarketAccount.pubkey,
1643
+ isSigner: false,
1644
+ isWritable: false
1645
+ });
1646
+ if (!spotMarketAccount.oracle.equals(web3_js_1.PublicKey["default"])) {
1647
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
1648
+ pubkey: spotMarketAccount.oracle,
1649
+ isSigner: false,
1650
+ isWritable: false
1651
+ });
1652
+ }
1653
+ }
1654
+ }
1655
+ for (_b = 0, _c = userAccount.perpPositions; _b < _c.length; _b++) {
1656
+ position = _c[_b];
1657
+ if (!(0, position_1.positionIsAvailable)(position) &&
1658
+ !position.marketIndex.eq(order.marketIndex)) {
1659
+ market = this.getPerpMarketAccount(position.marketIndex);
1660
+ perpMarketAccountMap.set(position.marketIndex.toNumber(), {
1661
+ pubkey: market.pubkey,
1662
+ isWritable: false,
1663
+ isSigner: false
1664
+ });
1665
+ oracleAccountMap.set(market.amm.oracle.toString(), {
1666
+ pubkey: market.amm.oracle,
1667
+ isWritable: false,
1668
+ isSigner: false
1669
+ });
1670
+ }
1671
+ }
1672
+ perpMarketAccountMap.set(marketIndex.toNumber(), {
1673
+ pubkey: marketAccount.pubkey,
1674
+ isWritable: true,
1675
+ isSigner: false
1676
+ });
1677
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
1678
+ pubkey: marketAccount.amm.oracle,
1679
+ isWritable: false,
1680
+ isSigner: false
1681
+ });
1682
+ remainingAccounts = __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), perpMarketAccountMap.values(), true);
1683
+ if (makerInfo) {
1684
+ remainingAccounts.push({
1685
+ pubkey: makerInfo.maker,
1686
+ isWritable: true,
1687
+ isSigner: false
1688
+ });
1689
+ remainingAccounts.push({
1690
+ pubkey: makerInfo.makerStats,
1691
+ isWritable: true,
1692
+ isSigner: false
1693
+ });
1694
+ }
1695
+ if (referrerInfo) {
1696
+ remainingAccounts.push({
1697
+ pubkey: referrerInfo.referrer,
1698
+ isWritable: true,
1699
+ isSigner: false
1700
+ });
1701
+ remainingAccounts.push({
1702
+ pubkey: referrerInfo.referrerStats,
1703
+ isWritable: true,
1704
+ isSigner: false
1705
+ });
1706
+ }
1707
+ orderId = order.orderId;
1708
+ makerOrderId = makerInfo ? makerInfo.order.orderId : null;
1709
+ _e = (_d = this.program.instruction).fillOrder;
1710
+ _f = [orderId, makerOrderId];
1711
+ _g = {};
1712
+ _h = {};
1713
+ return [4 /*yield*/, this.getStatePublicKey()];
1714
+ case 2: return [4 /*yield*/, _e.apply(_d, _f.concat([(_g.accounts = (_h.state = _j.sent(),
1715
+ _h.filler = fillerPublicKey,
1716
+ _h.fillerStats = fillerStatsPublicKey,
1717
+ _h.user = userAccountPublicKey,
1718
+ _h.userStats = userStatsPublicKey,
1719
+ _h.authority = this.wallet.publicKey,
1720
+ _h),
1721
+ _g.remainingAccounts = remainingAccounts,
1722
+ _g)]))];
1723
+ case 3: return [2 /*return*/, _j.sent()];
1724
+ }
1725
+ });
1726
+ });
1727
+ };
1728
+ ClearingHouse.prototype.placeSpotOrder = function (orderParams) {
1729
+ return __awaiter(this, void 0, void 0, function () {
1730
+ var txSig, _a, _b, _c;
1731
+ return __generator(this, function (_d) {
1732
+ switch (_d.label) {
1733
+ case 0:
1734
+ _b = (_a = this.txSender).send;
1735
+ _c = utils_1.wrapInTx;
1736
+ return [4 /*yield*/, this.getPlaceSpotOrderIx(orderParams)];
1737
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1738
+ [],
1739
+ this.opts])];
1740
+ case 2:
1741
+ txSig = (_d.sent()).txSig;
1742
+ return [2 /*return*/, txSig];
1743
+ }
1744
+ });
1745
+ });
1746
+ };
1747
+ ClearingHouse.prototype.getPlaceSpotOrderIx = function (orderParams) {
1748
+ return __awaiter(this, void 0, void 0, function () {
1749
+ var userAccountPublicKey, remainingAccounts, _a, _b, _c;
1750
+ var _d, _e;
1751
+ return __generator(this, function (_f) {
1752
+ switch (_f.label) {
1753
+ case 0:
1754
+ orderParams = this.getOrderParams(orderParams, types_1.MarketType.SPOT);
1755
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
1756
+ case 1:
1757
+ userAccountPublicKey = _f.sent();
1758
+ remainingAccounts = this.getRemainingAccounts({
1759
+ readableSpotMarketIndex: orderParams.marketIndex
1760
+ });
1761
+ _b = (_a = this.program.instruction).placeSpotOrder;
1762
+ _c = [orderParams];
1763
+ _d = {};
1764
+ _e = {};
1765
+ return [4 /*yield*/, this.getStatePublicKey()];
1766
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
1767
+ _e.user = userAccountPublicKey,
1768
+ _e.userStats = this.getUserStatsAccountPublicKey(),
1769
+ _e.authority = this.wallet.publicKey,
1770
+ _e),
1771
+ _d.remainingAccounts = remainingAccounts,
1772
+ _d)]))];
1773
+ case 3: return [2 /*return*/, _f.sent()];
1774
+ }
1775
+ });
1776
+ });
1777
+ };
1778
+ ClearingHouse.prototype.fillSpotOrder = function (userAccountPublicKey, user, order, fulfillmentConfig, makerInfo, referrerInfo) {
1779
+ return __awaiter(this, void 0, void 0, function () {
1780
+ var txSig, _a, _b, _c;
1781
+ return __generator(this, function (_d) {
1782
+ switch (_d.label) {
1783
+ case 0:
1784
+ _b = (_a = this.txSender).send;
1785
+ _c = utils_1.wrapInTx;
1786
+ return [4 /*yield*/, this.getFillSpotOrderIx(userAccountPublicKey, user, order, fulfillmentConfig, makerInfo, referrerInfo)];
1787
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
1788
+ [],
1789
+ this.opts])];
1790
+ case 2:
1791
+ txSig = (_d.sent()).txSig;
1792
+ return [2 /*return*/, txSig];
1793
+ }
1794
+ });
1795
+ });
1796
+ };
1797
+ ClearingHouse.prototype.getFillSpotOrderIx = function (userAccountPublicKey, userAccount, order, fulfillmentConfig, makerInfo, referrerInfo) {
1798
+ return __awaiter(this, void 0, void 0, function () {
1799
+ var userStatsPublicKey, fillerPublicKey, fillerStatsPublicKey, marketIndex, oracleAccountMap, spotMarketAccountMap, perpMarketAccountMap, _i, _a, spotPosition, spotMarket, _b, _c, position, market, spotMarketAccount, quoteMarketAccount, remainingAccounts, orderId, makerOrderId, _d, _e, _f;
1800
+ var _g, _h;
1801
+ return __generator(this, function (_j) {
1802
+ switch (_j.label) {
1803
+ case 0:
1804
+ userStatsPublicKey = (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, userAccount.authority);
1805
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
1806
+ case 1:
1807
+ fillerPublicKey = _j.sent();
1808
+ fillerStatsPublicKey = this.getUserStatsAccountPublicKey();
1809
+ marketIndex = order
1810
+ ? order.marketIndex
1811
+ : userAccount.orders.find(function (order) {
1812
+ return order.orderId.eq(userAccount.nextOrderId.sub(numericConstants_1.ONE));
1813
+ }).marketIndex;
1814
+ oracleAccountMap = new Map();
1815
+ spotMarketAccountMap = new Map();
1816
+ perpMarketAccountMap = new Map();
1817
+ for (_i = 0, _a = userAccount.spotPositions; _i < _a.length; _i++) {
1818
+ spotPosition = _a[_i];
1819
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
1820
+ spotMarket = this.getSpotMarketAccount(spotPosition.marketIndex);
1821
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
1822
+ pubkey: spotMarket.pubkey,
1823
+ isSigner: false,
1824
+ isWritable: false
1825
+ });
1826
+ if (!spotMarket.oracle.equals(web3_js_1.PublicKey["default"])) {
1827
+ oracleAccountMap.set(spotMarket.oracle.toString(), {
1828
+ pubkey: spotMarket.oracle,
1829
+ isSigner: false,
1830
+ isWritable: false
1831
+ });
1832
+ }
1833
+ }
1834
+ }
1835
+ for (_b = 0, _c = userAccount.perpPositions; _b < _c.length; _b++) {
1836
+ position = _c[_b];
1837
+ if (!(0, position_1.positionIsAvailable)(position) &&
1838
+ !position.marketIndex.eq(order.marketIndex)) {
1839
+ market = this.getPerpMarketAccount(position.marketIndex);
1840
+ perpMarketAccountMap.set(position.marketIndex.toNumber(), {
1841
+ pubkey: market.pubkey,
1842
+ isWritable: false,
1843
+ isSigner: false
1844
+ });
1845
+ oracleAccountMap.set(market.amm.oracle.toString(), {
1846
+ pubkey: market.amm.oracle,
1847
+ isWritable: false,
1848
+ isSigner: false
1849
+ });
1850
+ }
1851
+ }
1852
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
1853
+ spotMarketAccountMap.set(marketIndex.toNumber(), {
1854
+ pubkey: spotMarketAccount.pubkey,
1855
+ isWritable: true,
1856
+ isSigner: false
1857
+ });
1858
+ if (!spotMarketAccount.oracle.equals(web3_js_1.PublicKey["default"])) {
1859
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
1860
+ pubkey: spotMarketAccount.oracle,
1861
+ isWritable: false,
1862
+ isSigner: false
1863
+ });
1864
+ }
1865
+ quoteMarketAccount = this.getQuoteSpotMarketAccount();
1866
+ spotMarketAccountMap.set(quoteMarketAccount.marketIndex.toNumber(), {
1867
+ pubkey: quoteMarketAccount.pubkey,
1868
+ isWritable: true,
1869
+ isSigner: false
1870
+ });
1871
+ remainingAccounts = __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), perpMarketAccountMap.values(), true);
1872
+ if (makerInfo) {
1873
+ remainingAccounts.push({
1874
+ pubkey: makerInfo.maker,
1875
+ isWritable: true,
1876
+ isSigner: false
1877
+ });
1878
+ remainingAccounts.push({
1879
+ pubkey: makerInfo.makerStats,
1880
+ isWritable: true,
1881
+ isSigner: false
1882
+ });
1883
+ }
1884
+ if (referrerInfo) {
1885
+ remainingAccounts.push({
1886
+ pubkey: referrerInfo.referrer,
1887
+ isWritable: true,
1888
+ isSigner: false
1889
+ });
1890
+ remainingAccounts.push({
1891
+ pubkey: referrerInfo.referrerStats,
1892
+ isWritable: true,
1893
+ isSigner: false
1894
+ });
1895
+ }
1896
+ orderId = order.orderId;
1897
+ makerOrderId = makerInfo ? makerInfo.order.orderId : null;
1898
+ if (fulfillmentConfig) {
1899
+ remainingAccounts.push({
1900
+ pubkey: fulfillmentConfig.pubkey,
1901
+ isWritable: false,
1902
+ isSigner: false
1903
+ });
1904
+ remainingAccounts.push({
1905
+ pubkey: fulfillmentConfig.serumProgramId,
1906
+ isWritable: false,
1907
+ isSigner: false
1908
+ });
1909
+ remainingAccounts.push({
1910
+ pubkey: fulfillmentConfig.serumMarket,
1911
+ isWritable: true,
1912
+ isSigner: false
1913
+ });
1914
+ remainingAccounts.push({
1915
+ pubkey: fulfillmentConfig.serumRequestQueue,
1916
+ isWritable: true,
1917
+ isSigner: false
1918
+ });
1919
+ remainingAccounts.push({
1920
+ pubkey: fulfillmentConfig.serumEventQueue,
1921
+ isWritable: true,
1922
+ isSigner: false
1923
+ });
1924
+ remainingAccounts.push({
1925
+ pubkey: fulfillmentConfig.serumBids,
1926
+ isWritable: true,
1927
+ isSigner: false
1928
+ });
1929
+ remainingAccounts.push({
1930
+ pubkey: fulfillmentConfig.serumAsks,
1931
+ isWritable: true,
1932
+ isSigner: false
1933
+ });
1934
+ remainingAccounts.push({
1935
+ pubkey: fulfillmentConfig.serumBaseVault,
1936
+ isWritable: true,
1937
+ isSigner: false
1938
+ });
1939
+ remainingAccounts.push({
1940
+ pubkey: fulfillmentConfig.serumQuoteVault,
1941
+ isWritable: true,
1942
+ isSigner: false
1943
+ });
1944
+ remainingAccounts.push({
1945
+ pubkey: fulfillmentConfig.serumOpenOrders,
1946
+ isWritable: true,
1947
+ isSigner: false
1948
+ });
1949
+ remainingAccounts.push({
1950
+ pubkey: (0, pda_1.getSerumSignerPublicKey)(fulfillmentConfig.serumProgramId, fulfillmentConfig.serumMarket, fulfillmentConfig.serumSignerNonce),
1951
+ isWritable: false,
1952
+ isSigner: false
1953
+ });
1954
+ remainingAccounts.push({
1955
+ pubkey: this.getSignerPublicKey(),
1956
+ isWritable: false,
1957
+ isSigner: false
1958
+ });
1959
+ remainingAccounts.push({
1960
+ pubkey: spl_token_1.TOKEN_PROGRAM_ID,
1961
+ isWritable: false,
1962
+ isSigner: false
1963
+ });
1964
+ remainingAccounts.push({
1965
+ pubkey: spotMarketAccount.vault,
1966
+ isWritable: true,
1967
+ isSigner: false
1968
+ });
1969
+ remainingAccounts.push({
1970
+ pubkey: quoteMarketAccount.vault,
1971
+ isWritable: true,
1972
+ isSigner: false
1973
+ });
1974
+ }
1975
+ _e = (_d = this.program.instruction).fillSpotOrder;
1976
+ _f = [orderId,
1977
+ fulfillmentConfig ? fulfillmentConfig.fulfillmentType : null,
1978
+ makerOrderId];
1979
+ _g = {};
1980
+ _h = {};
1981
+ return [4 /*yield*/, this.getStatePublicKey()];
1982
+ case 2: return [4 /*yield*/, _e.apply(_d, _f.concat([(_g.accounts = (_h.state = _j.sent(),
1983
+ _h.filler = fillerPublicKey,
1984
+ _h.fillerStats = fillerStatsPublicKey,
1985
+ _h.user = userAccountPublicKey,
1986
+ _h.userStats = userStatsPublicKey,
1987
+ _h.authority = this.wallet.publicKey,
1988
+ _h),
1989
+ _g.remainingAccounts = remainingAccounts,
1990
+ _g)]))];
1991
+ case 3: return [2 /*return*/, _j.sent()];
1992
+ }
1993
+ });
1994
+ });
1995
+ };
1996
+ ClearingHouse.prototype.triggerOrder = function (userAccountPublicKey, user, order) {
1997
+ return __awaiter(this, void 0, void 0, function () {
1998
+ var txSig, _a, _b, _c;
1999
+ return __generator(this, function (_d) {
2000
+ switch (_d.label) {
2001
+ case 0:
2002
+ _b = (_a = this.txSender).send;
2003
+ _c = utils_1.wrapInTx;
2004
+ return [4 /*yield*/, this.getTriggerOrderIx(userAccountPublicKey, user, order)];
2005
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2006
+ [],
2007
+ this.opts])];
2008
+ case 2:
2009
+ txSig = (_d.sent()).txSig;
2010
+ return [2 /*return*/, txSig];
2011
+ }
2012
+ });
2013
+ });
2014
+ };
2015
+ ClearingHouse.prototype.getTriggerOrderIx = function (userAccountPublicKey, userAccount, order) {
2016
+ return __awaiter(this, void 0, void 0, function () {
2017
+ var fillerPublicKey, marketIndex, marketAccount, oracleAccountMap, spotMarketAccountMap, perpMarketAccountMap, _i, _a, spotPosition, spotMarketAccount, _b, _c, position, market, remainingAccounts, orderId, _d, _e, _f;
2018
+ var _g, _h;
2019
+ return __generator(this, function (_j) {
2020
+ switch (_j.label) {
2021
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2022
+ case 1:
2023
+ fillerPublicKey = _j.sent();
2024
+ marketIndex = order.marketIndex;
2025
+ marketAccount = this.getPerpMarketAccount(marketIndex);
2026
+ oracleAccountMap = new Map();
2027
+ spotMarketAccountMap = new Map();
2028
+ perpMarketAccountMap = new Map();
2029
+ for (_i = 0, _a = userAccount.spotPositions; _i < _a.length; _i++) {
2030
+ spotPosition = _a[_i];
2031
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
2032
+ spotMarketAccount = this.getSpotMarketAccount(spotPosition.marketIndex);
2033
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
2034
+ pubkey: spotMarketAccount.pubkey,
2035
+ isSigner: false,
2036
+ isWritable: false
2037
+ });
2038
+ if (!spotMarketAccount.oracle.equals(web3_js_1.PublicKey["default"])) {
2039
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
2040
+ pubkey: spotMarketAccount.oracle,
2041
+ isSigner: false,
2042
+ isWritable: false
2043
+ });
2044
+ }
2045
+ }
2046
+ }
2047
+ for (_b = 0, _c = userAccount.perpPositions; _b < _c.length; _b++) {
2048
+ position = _c[_b];
2049
+ if (!(0, position_1.positionIsAvailable)(position) &&
2050
+ !position.marketIndex.eq(order.marketIndex)) {
2051
+ market = this.getPerpMarketAccount(position.marketIndex);
2052
+ perpMarketAccountMap.set(position.marketIndex.toNumber(), {
2053
+ pubkey: market.pubkey,
2054
+ isWritable: false,
2055
+ isSigner: false
2056
+ });
2057
+ oracleAccountMap.set(market.amm.oracle.toString(), {
2058
+ pubkey: market.amm.oracle,
2059
+ isWritable: false,
2060
+ isSigner: false
2061
+ });
2062
+ }
2063
+ }
2064
+ perpMarketAccountMap.set(marketIndex.toNumber(), {
2065
+ pubkey: marketAccount.pubkey,
2066
+ isWritable: true,
2067
+ isSigner: false
2068
+ });
2069
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
2070
+ pubkey: marketAccount.amm.oracle,
2071
+ isWritable: false,
2072
+ isSigner: false
2073
+ });
2074
+ remainingAccounts = __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), perpMarketAccountMap.values(), true);
2075
+ orderId = order.orderId;
2076
+ _e = (_d = this.program.instruction).triggerOrder;
2077
+ _f = [orderId];
2078
+ _g = {};
2079
+ _h = {};
2080
+ return [4 /*yield*/, this.getStatePublicKey()];
2081
+ case 2: return [4 /*yield*/, _e.apply(_d, _f.concat([(_g.accounts = (_h.state = _j.sent(),
2082
+ _h.filler = fillerPublicKey,
2083
+ _h.user = userAccountPublicKey,
2084
+ _h.authority = this.wallet.publicKey,
2085
+ _h),
2086
+ _g.remainingAccounts = remainingAccounts,
2087
+ _g)]))];
2088
+ case 3: return [2 /*return*/, _j.sent()];
2089
+ }
2090
+ });
2091
+ });
2092
+ };
2093
+ ClearingHouse.prototype.triggerSpotOrder = function (userAccountPublicKey, user, order) {
2094
+ return __awaiter(this, void 0, void 0, function () {
2095
+ var txSig, _a, _b, _c;
2096
+ return __generator(this, function (_d) {
2097
+ switch (_d.label) {
2098
+ case 0:
2099
+ _b = (_a = this.txSender).send;
2100
+ _c = utils_1.wrapInTx;
2101
+ return [4 /*yield*/, this.getTriggerSpotOrderIx(userAccountPublicKey, user, order)];
2102
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2103
+ [],
2104
+ this.opts])];
2105
+ case 2:
2106
+ txSig = (_d.sent()).txSig;
2107
+ return [2 /*return*/, txSig];
2108
+ }
2109
+ });
2110
+ });
2111
+ };
2112
+ ClearingHouse.prototype.getTriggerSpotOrderIx = function (userAccountPublicKey, userAccount, order) {
2113
+ return __awaiter(this, void 0, void 0, function () {
2114
+ var fillerPublicKey, marketIndex, spotMarketAccount, oracleAccountMap, spotMarketAccountMap, perpMarketAccountMap, _i, _a, spotPosition, spotMarketAccount_2, _b, _c, position, market, quoteSpotMarket, remainingAccounts, orderId, _d, _e, _f;
2115
+ var _g, _h;
2116
+ return __generator(this, function (_j) {
2117
+ switch (_j.label) {
2118
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2119
+ case 1:
2120
+ fillerPublicKey = _j.sent();
2121
+ marketIndex = order.marketIndex;
2122
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
2123
+ oracleAccountMap = new Map();
2124
+ spotMarketAccountMap = new Map();
2125
+ perpMarketAccountMap = new Map();
2126
+ for (_i = 0, _a = userAccount.spotPositions; _i < _a.length; _i++) {
2127
+ spotPosition = _a[_i];
2128
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
2129
+ spotMarketAccount_2 = this.getSpotMarketAccount(spotPosition.marketIndex);
2130
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
2131
+ pubkey: spotMarketAccount_2.pubkey,
2132
+ isSigner: false,
2133
+ isWritable: false
2134
+ });
2135
+ if (!spotMarketAccount_2.oracle.equals(web3_js_1.PublicKey["default"])) {
2136
+ oracleAccountMap.set(spotMarketAccount_2.oracle.toString(), {
2137
+ pubkey: spotMarketAccount_2.oracle,
2138
+ isSigner: false,
2139
+ isWritable: false
2140
+ });
2141
+ }
2142
+ }
2143
+ }
2144
+ for (_b = 0, _c = userAccount.perpPositions; _b < _c.length; _b++) {
2145
+ position = _c[_b];
2146
+ if (!(0, position_1.positionIsAvailable)(position) &&
2147
+ !position.marketIndex.eq(order.marketIndex)) {
2148
+ market = this.getPerpMarketAccount(position.marketIndex);
2149
+ perpMarketAccountMap.set(position.marketIndex.toNumber(), {
2150
+ pubkey: market.pubkey,
2151
+ isWritable: false,
2152
+ isSigner: false
2153
+ });
2154
+ oracleAccountMap.set(market.amm.oracle.toString(), {
2155
+ pubkey: market.amm.oracle,
2156
+ isWritable: false,
2157
+ isSigner: false
2158
+ });
2159
+ }
2160
+ }
2161
+ quoteSpotMarket = this.getQuoteSpotMarketAccount();
2162
+ spotMarketAccountMap.set(quoteSpotMarket.marketIndex.toNumber(), {
2163
+ pubkey: quoteSpotMarket.pubkey,
2164
+ isWritable: true,
2165
+ isSigner: false
2166
+ });
2167
+ spotMarketAccountMap.set(marketIndex.toNumber(), {
2168
+ pubkey: spotMarketAccount.pubkey,
2169
+ isWritable: false,
2170
+ isSigner: false
2171
+ });
2172
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
2173
+ pubkey: spotMarketAccount.oracle,
2174
+ isWritable: false,
2175
+ isSigner: false
2176
+ });
2177
+ remainingAccounts = __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), perpMarketAccountMap.values(), true);
2178
+ orderId = order.orderId;
2179
+ _e = (_d = this.program.instruction).triggerSpotOrder;
2180
+ _f = [orderId];
2181
+ _g = {};
2182
+ _h = {};
2183
+ return [4 /*yield*/, this.getStatePublicKey()];
2184
+ case 2: return [4 /*yield*/, _e.apply(_d, _f.concat([(_g.accounts = (_h.state = _j.sent(),
2185
+ _h.filler = fillerPublicKey,
2186
+ _h.user = userAccountPublicKey,
2187
+ _h.authority = this.wallet.publicKey,
2188
+ _h),
2189
+ _g.remainingAccounts = remainingAccounts,
2190
+ _g)]))];
2191
+ case 3: return [2 /*return*/, _j.sent()];
2192
+ }
2193
+ });
2194
+ });
2195
+ };
2196
+ ClearingHouse.prototype.placeAndTake = function (orderParams, makerInfo, referrerInfo) {
2197
+ return __awaiter(this, void 0, void 0, function () {
2198
+ var _a, txSig, slot, _b, _c, _d;
2199
+ return __generator(this, function (_e) {
2200
+ switch (_e.label) {
2201
+ case 0:
2202
+ _c = (_b = this.txSender).send;
2203
+ _d = utils_1.wrapInTx;
2204
+ return [4 /*yield*/, this.getPlaceAndTakeIx(orderParams, makerInfo, referrerInfo)];
2205
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
2206
+ [],
2207
+ this.opts])];
2208
+ case 2:
2209
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
2210
+ this.marketLastSlotCache.set(orderParams.marketIndex.toNumber(), slot);
2211
+ return [2 /*return*/, txSig];
2212
+ }
2213
+ });
2214
+ });
2215
+ };
2216
+ ClearingHouse.prototype.getPlaceAndTakeIx = function (orderParams, makerInfo, referrerInfo) {
2217
+ return __awaiter(this, void 0, void 0, function () {
2218
+ var userStatsPublicKey, userAccountPublicKey, remainingAccounts, makerOrderId, _a, _b, _c;
2219
+ var _d, _e;
2220
+ return __generator(this, function (_f) {
2221
+ switch (_f.label) {
2222
+ case 0:
2223
+ orderParams = this.getOrderParams(orderParams, types_1.MarketType.PERP);
2224
+ return [4 /*yield*/, this.getUserStatsAccountPublicKey()];
2225
+ case 1:
2226
+ userStatsPublicKey = _f.sent();
2227
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
2228
+ case 2:
2229
+ userAccountPublicKey = _f.sent();
2230
+ remainingAccounts = this.getRemainingAccounts({
2231
+ writablePerpMarketIndex: orderParams.marketIndex,
2232
+ writableSpotMarketIndex: numericConstants_1.QUOTE_SPOT_MARKET_INDEX
2233
+ });
2234
+ makerOrderId = null;
2235
+ if (makerInfo) {
2236
+ makerOrderId = makerInfo.order.orderId;
2237
+ remainingAccounts.push({
2238
+ pubkey: makerInfo.maker,
2239
+ isSigner: false,
2240
+ isWritable: true
2241
+ });
2242
+ remainingAccounts.push({
2243
+ pubkey: makerInfo.makerStats,
2244
+ isSigner: false,
2245
+ isWritable: true
2246
+ });
2247
+ }
2248
+ if (referrerInfo) {
2249
+ remainingAccounts.push({
2250
+ pubkey: referrerInfo.referrer,
2251
+ isWritable: true,
2252
+ isSigner: false
2253
+ });
2254
+ remainingAccounts.push({
2255
+ pubkey: referrerInfo.referrerStats,
2256
+ isWritable: true,
2257
+ isSigner: false
2258
+ });
2259
+ }
2260
+ _b = (_a = this.program.instruction).placeAndTake;
2261
+ _c = [orderParams,
2262
+ makerOrderId];
2263
+ _d = {};
2264
+ _e = {};
2265
+ return [4 /*yield*/, this.getStatePublicKey()];
2266
+ case 3: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2267
+ _e.user = userAccountPublicKey,
2268
+ _e.userStats = userStatsPublicKey,
2269
+ _e.authority = this.wallet.publicKey,
2270
+ _e),
2271
+ _d.remainingAccounts = remainingAccounts,
2272
+ _d)]))];
2273
+ case 4: return [2 /*return*/, _f.sent()];
2274
+ }
2275
+ });
2276
+ });
2277
+ };
2278
+ ClearingHouse.prototype.placeAndMake = function (orderParams, takerInfo, referrerInfo) {
2279
+ return __awaiter(this, void 0, void 0, function () {
2280
+ var _a, txSig, slot, _b, _c, _d;
2281
+ return __generator(this, function (_e) {
2282
+ switch (_e.label) {
2283
+ case 0:
2284
+ _c = (_b = this.txSender).send;
2285
+ _d = utils_1.wrapInTx;
2286
+ return [4 /*yield*/, this.getPlaceAndMakeIx(orderParams, takerInfo, referrerInfo)];
2287
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
2288
+ [],
2289
+ this.opts])];
2290
+ case 2:
2291
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
2292
+ this.marketLastSlotCache.set(orderParams.marketIndex.toNumber(), slot);
2293
+ return [2 /*return*/, txSig];
2294
+ }
2295
+ });
2296
+ });
2297
+ };
2298
+ ClearingHouse.prototype.getPlaceAndMakeIx = function (orderParams, takerInfo, referrerInfo) {
2299
+ return __awaiter(this, void 0, void 0, function () {
2300
+ var userStatsPublicKey, userAccountPublicKey, remainingAccounts, takerOrderId, _a, _b, _c;
2301
+ var _d, _e;
2302
+ return __generator(this, function (_f) {
2303
+ switch (_f.label) {
2304
+ case 0:
2305
+ orderParams = this.getOrderParams(orderParams, types_1.MarketType.PERP);
2306
+ userStatsPublicKey = this.getUserStatsAccountPublicKey();
2307
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
2308
+ case 1:
2309
+ userAccountPublicKey = _f.sent();
2310
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2311
+ counterPartyUserAccount: takerInfo.takerUserAccount,
2312
+ writablePerpMarketIndex: orderParams.marketIndex
2313
+ });
2314
+ if (referrerInfo) {
2315
+ remainingAccounts.push({
2316
+ pubkey: referrerInfo.referrer,
2317
+ isWritable: true,
2318
+ isSigner: false
2319
+ });
2320
+ remainingAccounts.push({
2321
+ pubkey: referrerInfo.referrerStats,
2322
+ isWritable: true,
2323
+ isSigner: false
2324
+ });
2325
+ }
2326
+ takerOrderId = takerInfo.order.orderId;
2327
+ _b = (_a = this.program.instruction).placeAndMake;
2328
+ _c = [orderParams,
2329
+ takerOrderId];
2330
+ _d = {};
2331
+ _e = {};
2332
+ return [4 /*yield*/, this.getStatePublicKey()];
2333
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2334
+ _e.user = userAccountPublicKey,
2335
+ _e.userStats = userStatsPublicKey,
2336
+ _e.taker = takerInfo.taker,
2337
+ _e.takerStats = takerInfo.takerStats,
2338
+ _e.authority = this.wallet.publicKey,
2339
+ _e),
2340
+ _d.remainingAccounts = remainingAccounts,
2341
+ _d)]))];
2342
+ case 3: return [2 /*return*/, _f.sent()];
2343
+ }
2344
+ });
2345
+ });
2346
+ };
2347
+ /**
2348
+ * Close an entire position. If you want to reduce a position, use the {@link openPosition} method in the opposite direction of the current position.
2349
+ * @param marketIndex
2350
+ * @returns
2351
+ */
2352
+ ClearingHouse.prototype.closePosition = function (marketIndex, limitPrice) {
2353
+ return __awaiter(this, void 0, void 0, function () {
2354
+ var userPosition;
2355
+ return __generator(this, function (_a) {
2356
+ switch (_a.label) {
2357
+ case 0:
2358
+ userPosition = this.getUser().getUserPosition(marketIndex);
2359
+ if (!userPosition) {
2360
+ throw Error("No position in market ".concat(marketIndex.toString()));
2361
+ }
2362
+ return [4 /*yield*/, this.placeAndTake({
2363
+ orderType: types_1.OrderType.MARKET,
2364
+ marketIndex: marketIndex,
2365
+ direction: (0, position_1.findDirectionToClose)(userPosition),
2366
+ baseAssetAmount: userPosition.baseAssetAmount.abs(),
2367
+ reduceOnly: true,
2368
+ price: limitPrice
2369
+ })];
2370
+ case 1: return [2 /*return*/, _a.sent()];
2371
+ }
2372
+ });
2373
+ });
2374
+ };
2375
+ ClearingHouse.prototype.settlePNLs = function (users, marketIndex) {
2376
+ return __awaiter(this, void 0, void 0, function () {
2377
+ var ixs, _i, users_1, _a, settleeUserAccountPublicKey, settleeUserAccount, _b, _c, tx, txSig;
2378
+ var _d;
2379
+ return __generator(this, function (_e) {
2380
+ switch (_e.label) {
2381
+ case 0:
2382
+ ixs = [];
2383
+ _i = 0, users_1 = users;
2384
+ _e.label = 1;
2385
+ case 1:
2386
+ if (!(_i < users_1.length)) return [3 /*break*/, 4];
2387
+ _a = users_1[_i], settleeUserAccountPublicKey = _a.settleeUserAccountPublicKey, settleeUserAccount = _a.settleeUserAccount;
2388
+ _c = (_b = ixs).push;
2389
+ return [4 /*yield*/, this.settlePNLIx(settleeUserAccountPublicKey, settleeUserAccount, marketIndex)];
2390
+ case 2:
2391
+ _c.apply(_b, [_e.sent()]);
2392
+ _e.label = 3;
2393
+ case 3:
2394
+ _i++;
2395
+ return [3 /*break*/, 1];
2396
+ case 4:
2397
+ tx = (_d = new web3_js_1.Transaction()
2398
+ .add(web3_js_1.ComputeBudgetProgram.requestUnits({
2399
+ units: 1000000,
2400
+ additionalFee: 0
2401
+ })))
2402
+ .add.apply(_d, ixs);
2403
+ return [4 /*yield*/, this.txSender.send(tx, [], this.opts)];
2404
+ case 5:
2405
+ txSig = (_e.sent()).txSig;
2406
+ return [2 /*return*/, txSig];
2407
+ }
2408
+ });
2409
+ });
2410
+ };
2411
+ ClearingHouse.prototype.settlePNL = function (settleeUserAccountPublicKey, settleeUserAccount, marketIndex) {
2412
+ return __awaiter(this, void 0, void 0, function () {
2413
+ var txSig, _a, _b, _c;
2414
+ return __generator(this, function (_d) {
2415
+ switch (_d.label) {
2416
+ case 0:
2417
+ _b = (_a = this.txSender).send;
2418
+ _c = utils_1.wrapInTx;
2419
+ return [4 /*yield*/, this.settlePNLIx(settleeUserAccountPublicKey, settleeUserAccount, marketIndex)];
2420
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2421
+ [],
2422
+ this.opts])];
2423
+ case 2:
2424
+ txSig = (_d.sent()).txSig;
2425
+ return [2 /*return*/, txSig];
2426
+ }
2427
+ });
2428
+ });
2429
+ };
2430
+ ClearingHouse.prototype.settlePNLIx = function (settleeUserAccountPublicKey, settleeUserAccount, marketIndex) {
2431
+ return __awaiter(this, void 0, void 0, function () {
2432
+ var perpMarketAccountMap, oracleAccountMap, spotMarketAccountMap, _i, _a, position, market, _b, _c, spotPosition, spotMarketAccount, marketAccount, remainingAccounts, _d, _e, _f;
2433
+ var _g, _h;
2434
+ return __generator(this, function (_j) {
2435
+ switch (_j.label) {
2436
+ case 0:
2437
+ perpMarketAccountMap = new Map();
2438
+ oracleAccountMap = new Map();
2439
+ spotMarketAccountMap = new Map();
2440
+ for (_i = 0, _a = settleeUserAccount.perpPositions; _i < _a.length; _i++) {
2441
+ position = _a[_i];
2442
+ if (!(0, position_1.positionIsAvailable)(position)) {
2443
+ market = this.getPerpMarketAccount(position.marketIndex);
2444
+ perpMarketAccountMap.set(position.marketIndex.toNumber(), {
2445
+ pubkey: market.pubkey,
2446
+ isWritable: false,
2447
+ isSigner: false
2448
+ });
2449
+ oracleAccountMap.set(market.amm.oracle.toString(), {
2450
+ pubkey: market.amm.oracle,
2451
+ isWritable: false,
2452
+ isSigner: false
2453
+ });
2454
+ }
2455
+ }
2456
+ for (_b = 0, _c = settleeUserAccount.spotPositions; _b < _c.length; _b++) {
2457
+ spotPosition = _c[_b];
2458
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
2459
+ spotMarketAccount = this.getSpotMarketAccount(spotPosition.marketIndex);
2460
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
2461
+ pubkey: spotMarketAccount.pubkey,
2462
+ isSigner: false,
2463
+ isWritable: false
2464
+ });
2465
+ if (!spotMarketAccount.marketIndex.eq(numericConstants_1.ZERO)) {
2466
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
2467
+ pubkey: spotMarketAccount.oracle,
2468
+ isSigner: false,
2469
+ isWritable: false
2470
+ });
2471
+ }
2472
+ }
2473
+ }
2474
+ marketAccount = this.getPerpMarketAccount(marketIndex.toNumber());
2475
+ perpMarketAccountMap.set(marketIndex.toNumber(), {
2476
+ pubkey: marketAccount.pubkey,
2477
+ isSigner: false,
2478
+ isWritable: true
2479
+ });
2480
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
2481
+ pubkey: marketAccount.amm.oracle,
2482
+ isSigner: false,
2483
+ isWritable: false
2484
+ });
2485
+ spotMarketAccountMap.set(numericConstants_1.QUOTE_SPOT_MARKET_INDEX.toNumber(), {
2486
+ pubkey: this.getSpotMarketAccount(numericConstants_1.QUOTE_SPOT_MARKET_INDEX).pubkey,
2487
+ isSigner: false,
2488
+ isWritable: true
2489
+ });
2490
+ remainingAccounts = __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), perpMarketAccountMap.values(), true);
2491
+ _e = (_d = this.program.instruction).settlePnl;
2492
+ _f = [marketIndex];
2493
+ _g = {};
2494
+ _h = {};
2495
+ return [4 /*yield*/, this.getStatePublicKey()];
2496
+ case 1: return [4 /*yield*/, _e.apply(_d, _f.concat([(_g.accounts = (_h.state = _j.sent(),
2497
+ _h.authority = this.wallet.publicKey,
2498
+ _h.user = settleeUserAccountPublicKey,
2499
+ _h),
2500
+ _g.remainingAccounts = remainingAccounts,
2501
+ _g)]))];
2502
+ case 2: return [2 /*return*/, _j.sent()];
2503
+ }
2504
+ });
2505
+ });
2506
+ };
2507
+ ClearingHouse.prototype.settleExpiredPosition = function (settleeUserAccountPublicKey, settleeUserAccount, marketIndex) {
2508
+ return __awaiter(this, void 0, void 0, function () {
2509
+ var txSig, _a, _b, _c;
2510
+ return __generator(this, function (_d) {
2511
+ switch (_d.label) {
2512
+ case 0:
2513
+ _b = (_a = this.txSender).send;
2514
+ _c = utils_1.wrapInTx;
2515
+ return [4 /*yield*/, this.getSettleExpiredPositionIx(settleeUserAccountPublicKey, settleeUserAccount, marketIndex)];
2516
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2517
+ [],
2518
+ this.opts])];
2519
+ case 2:
2520
+ txSig = (_d.sent()).txSig;
2521
+ return [2 /*return*/, txSig];
2522
+ }
2523
+ });
2524
+ });
2525
+ };
2526
+ ClearingHouse.prototype.getSettleExpiredPositionIx = function (settleeUserAccountPublicKey, settleeUserAccount, marketIndex) {
2527
+ return __awaiter(this, void 0, void 0, function () {
2528
+ var marketAccountMap, oracleAccountMap, spotMarketAccountMap, _i, _a, position, market, _b, _c, userBankBalance, bankAccount, marketAccount, remainingAccounts, _d, _e, _f;
2529
+ var _g, _h;
2530
+ return __generator(this, function (_j) {
2531
+ switch (_j.label) {
2532
+ case 0:
2533
+ marketAccountMap = new Map();
2534
+ oracleAccountMap = new Map();
2535
+ spotMarketAccountMap = new Map();
2536
+ for (_i = 0, _a = settleeUserAccount.perpPositions; _i < _a.length; _i++) {
2537
+ position = _a[_i];
2538
+ if (!(0, position_1.positionIsAvailable)(position)) {
2539
+ market = this.getPerpMarketAccount(position.marketIndex);
2540
+ marketAccountMap.set(position.marketIndex.toNumber(), {
2541
+ pubkey: market.pubkey,
2542
+ isWritable: false,
2543
+ isSigner: false
2544
+ });
2545
+ oracleAccountMap.set(market.amm.oracle.toString(), {
2546
+ pubkey: market.amm.oracle,
2547
+ isWritable: false,
2548
+ isSigner: false
2549
+ });
2550
+ }
2551
+ }
2552
+ for (_b = 0, _c = settleeUserAccount.spotPositions; _b < _c.length; _b++) {
2553
+ userBankBalance = _c[_b];
2554
+ if (!userBankBalance.balance.eq(numericConstants_1.ZERO)) {
2555
+ bankAccount = this.getSpotMarketAccount(userBankBalance.marketIndex);
2556
+ spotMarketAccountMap.set(userBankBalance.marketIndex.toNumber(), {
2557
+ pubkey: bankAccount.pubkey,
2558
+ isSigner: false,
2559
+ isWritable: false
2560
+ });
2561
+ if (!bankAccount.marketIndex.eq(numericConstants_1.ZERO)) {
2562
+ oracleAccountMap.set(bankAccount.oracle.toString(), {
2563
+ pubkey: bankAccount.oracle,
2564
+ isSigner: false,
2565
+ isWritable: false
2566
+ });
2567
+ }
2568
+ }
2569
+ }
2570
+ marketAccount = this.getPerpMarketAccount(marketIndex.toNumber());
2571
+ marketAccountMap.set(marketIndex.toNumber(), {
2572
+ pubkey: marketAccount.pubkey,
2573
+ isSigner: false,
2574
+ isWritable: true
2575
+ });
2576
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
2577
+ pubkey: marketAccount.amm.oracle,
2578
+ isSigner: false,
2579
+ isWritable: false
2580
+ });
2581
+ spotMarketAccountMap.set(numericConstants_1.QUOTE_SPOT_MARKET_INDEX.toNumber(), {
2582
+ pubkey: this.getSpotMarketAccount(numericConstants_1.QUOTE_SPOT_MARKET_INDEX).pubkey,
2583
+ isSigner: false,
2584
+ isWritable: true
2585
+ });
2586
+ remainingAccounts = __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), marketAccountMap.values(), true);
2587
+ _e = (_d = this.program.instruction).settleExpiredPosition;
2588
+ _f = [marketIndex];
2589
+ _g = {};
2590
+ _h = {};
2591
+ return [4 /*yield*/, this.getStatePublicKey()];
2592
+ case 1: return [4 /*yield*/, _e.apply(_d, _f.concat([(_g.accounts = (_h.state = _j.sent(),
2593
+ _h.authority = this.wallet.publicKey,
2594
+ _h.user = settleeUserAccountPublicKey,
2595
+ _h),
2596
+ _g.remainingAccounts = remainingAccounts,
2597
+ _g)]))];
2598
+ case 2: return [2 /*return*/, _j.sent()];
2599
+ }
2600
+ });
2601
+ });
2602
+ };
2603
+ ClearingHouse.prototype.liquidatePerp = function (userAccountPublicKey, userAccount, marketIndex, maxBaseAssetAmount) {
2604
+ return __awaiter(this, void 0, void 0, function () {
2605
+ var _a, txSig, slot, _b, _c, _d;
2606
+ return __generator(this, function (_e) {
2607
+ switch (_e.label) {
2608
+ case 0:
2609
+ _c = (_b = this.txSender).send;
2610
+ _d = utils_1.wrapInTx;
2611
+ return [4 /*yield*/, this.getLiquidatePerpIx(userAccountPublicKey, userAccount, marketIndex, maxBaseAssetAmount)];
2612
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
2613
+ [],
2614
+ this.opts])];
2615
+ case 2:
2616
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
2617
+ this.marketLastSlotCache.set(marketIndex.toNumber(), slot);
2618
+ return [2 /*return*/, txSig];
2619
+ }
2620
+ });
2621
+ });
2622
+ };
2623
+ ClearingHouse.prototype.getLiquidatePerpIx = function (userAccountPublicKey, userAccount, marketIndex, maxBaseAssetAmount) {
2624
+ return __awaiter(this, void 0, void 0, function () {
2625
+ var userStatsPublicKey, liquidatorPublicKey, liquidatorStatsPublicKey, remainingAccounts, _a, _b, _c;
2626
+ var _d, _e;
2627
+ return __generator(this, function (_f) {
2628
+ switch (_f.label) {
2629
+ case 0:
2630
+ userStatsPublicKey = (0, pda_1.getUserStatsAccountPublicKey)(this.program.programId, userAccount.authority);
2631
+ return [4 /*yield*/, this.getUserAccountPublicKey()];
2632
+ case 1:
2633
+ liquidatorPublicKey = _f.sent();
2634
+ liquidatorStatsPublicKey = this.getUserStatsAccountPublicKey();
2635
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2636
+ writablePerpMarketIndex: marketIndex,
2637
+ counterPartyUserAccount: userAccount
2638
+ });
2639
+ _b = (_a = this.program.instruction).liquidatePerp;
2640
+ _c = [marketIndex,
2641
+ maxBaseAssetAmount];
2642
+ _d = {};
2643
+ _e = {};
2644
+ return [4 /*yield*/, this.getStatePublicKey()];
2645
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2646
+ _e.authority = this.wallet.publicKey,
2647
+ _e.user = userAccountPublicKey,
2648
+ _e.userStats = userStatsPublicKey,
2649
+ _e.liquidator = liquidatorPublicKey,
2650
+ _e.liquidatorStats = liquidatorStatsPublicKey,
2651
+ _e),
2652
+ _d.remainingAccounts = remainingAccounts,
2653
+ _d)]))];
2654
+ case 3: return [2 /*return*/, _f.sent()];
2655
+ }
2656
+ });
2657
+ });
2658
+ };
2659
+ ClearingHouse.prototype.liquidateBorrow = function (userAccountPublicKey, userAccount, assetmarketIndex, liabilitymarketIndex, maxLiabilityTransfer) {
2660
+ return __awaiter(this, void 0, void 0, function () {
2661
+ var txSig, _a, _b, _c;
2662
+ return __generator(this, function (_d) {
2663
+ switch (_d.label) {
2664
+ case 0:
2665
+ _b = (_a = this.txSender).send;
2666
+ _c = utils_1.wrapInTx;
2667
+ return [4 /*yield*/, this.getLiquidateBorrowIx(userAccountPublicKey, userAccount, assetmarketIndex, liabilitymarketIndex, maxLiabilityTransfer)];
2668
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2669
+ [],
2670
+ this.opts])];
2671
+ case 2:
2672
+ txSig = (_d.sent()).txSig;
2673
+ return [2 /*return*/, txSig];
2674
+ }
2675
+ });
2676
+ });
2677
+ };
2678
+ ClearingHouse.prototype.getLiquidateBorrowIx = function (userAccountPublicKey, userAccount, assetmarketIndex, liabilitymarketIndex, maxLiabilityTransfer) {
2679
+ return __awaiter(this, void 0, void 0, function () {
2680
+ var liquidatorPublicKey, remainingAccounts, _a, _b, _c;
2681
+ var _d, _e;
2682
+ return __generator(this, function (_f) {
2683
+ switch (_f.label) {
2684
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2685
+ case 1:
2686
+ liquidatorPublicKey = _f.sent();
2687
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2688
+ counterPartyUserAccount: userAccount,
2689
+ writableSpotMarketIndexes: [liabilitymarketIndex, assetmarketIndex]
2690
+ });
2691
+ _b = (_a = this.program.instruction).liquidateBorrow;
2692
+ _c = [assetmarketIndex,
2693
+ liabilitymarketIndex,
2694
+ maxLiabilityTransfer];
2695
+ _d = {};
2696
+ _e = {};
2697
+ return [4 /*yield*/, this.getStatePublicKey()];
2698
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2699
+ _e.authority = this.wallet.publicKey,
2700
+ _e.user = userAccountPublicKey,
2701
+ _e.liquidator = liquidatorPublicKey,
2702
+ _e),
2703
+ _d.remainingAccounts = remainingAccounts,
2704
+ _d)]))];
2705
+ case 3: return [2 /*return*/, _f.sent()];
2706
+ }
2707
+ });
2708
+ });
2709
+ };
2710
+ ClearingHouse.prototype.liquidateBorrowForPerpPnl = function (userAccountPublicKey, userAccount, perpMarketIndex, liabilitymarketIndex, maxLiabilityTransfer) {
2711
+ return __awaiter(this, void 0, void 0, function () {
2712
+ var _a, txSig, slot, _b, _c, _d;
2713
+ return __generator(this, function (_e) {
2714
+ switch (_e.label) {
2715
+ case 0:
2716
+ _c = (_b = this.txSender).send;
2717
+ _d = utils_1.wrapInTx;
2718
+ return [4 /*yield*/, this.getLiquidateBorrowForPerpPnlIx(userAccountPublicKey, userAccount, perpMarketIndex, liabilitymarketIndex, maxLiabilityTransfer)];
2719
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
2720
+ [],
2721
+ this.opts])];
2722
+ case 2:
2723
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
2724
+ this.marketLastSlotCache.set(perpMarketIndex.toNumber(), slot);
2725
+ return [2 /*return*/, txSig];
2726
+ }
2727
+ });
2728
+ });
2729
+ };
2730
+ ClearingHouse.prototype.getLiquidateBorrowForPerpPnlIx = function (userAccountPublicKey, userAccount, perpMarketIndex, liabilitymarketIndex, maxLiabilityTransfer) {
2731
+ return __awaiter(this, void 0, void 0, function () {
2732
+ var liquidatorPublicKey, remainingAccounts, _a, _b, _c;
2733
+ var _d, _e;
2734
+ return __generator(this, function (_f) {
2735
+ switch (_f.label) {
2736
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2737
+ case 1:
2738
+ liquidatorPublicKey = _f.sent();
2739
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2740
+ counterPartyUserAccount: userAccount,
2741
+ writablePerpMarketIndex: perpMarketIndex,
2742
+ writableSpotMarketIndexes: [liabilitymarketIndex]
2743
+ });
2744
+ _b = (_a = this.program.instruction).liquidateBorrowForPerpPnl;
2745
+ _c = [perpMarketIndex,
2746
+ liabilitymarketIndex,
2747
+ maxLiabilityTransfer];
2748
+ _d = {};
2749
+ _e = {};
2750
+ return [4 /*yield*/, this.getStatePublicKey()];
2751
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2752
+ _e.authority = this.wallet.publicKey,
2753
+ _e.user = userAccountPublicKey,
2754
+ _e.liquidator = liquidatorPublicKey,
2755
+ _e),
2756
+ _d.remainingAccounts = remainingAccounts,
2757
+ _d)]))];
2758
+ case 3: return [2 /*return*/, _f.sent()];
2759
+ }
2760
+ });
2761
+ });
2762
+ };
2763
+ ClearingHouse.prototype.liquidatePerpPnlForDeposit = function (userAccountPublicKey, userAccount, perpMarketIndex, assetMarketIndex, maxPnlTransfer) {
2764
+ return __awaiter(this, void 0, void 0, function () {
2765
+ var _a, txSig, slot, _b, _c, _d;
2766
+ return __generator(this, function (_e) {
2767
+ switch (_e.label) {
2768
+ case 0:
2769
+ _c = (_b = this.txSender).send;
2770
+ _d = utils_1.wrapInTx;
2771
+ return [4 /*yield*/, this.getLiquidatePerpPnlForDepositIx(userAccountPublicKey, userAccount, perpMarketIndex, assetMarketIndex, maxPnlTransfer)];
2772
+ case 1: return [4 /*yield*/, _c.apply(_b, [_d.apply(void 0, [_e.sent()]),
2773
+ [],
2774
+ this.opts])];
2775
+ case 2:
2776
+ _a = _e.sent(), txSig = _a.txSig, slot = _a.slot;
2777
+ this.marketLastSlotCache.set(perpMarketIndex.toNumber(), slot);
2778
+ return [2 /*return*/, txSig];
2779
+ }
2780
+ });
2781
+ });
2782
+ };
2783
+ ClearingHouse.prototype.getLiquidatePerpPnlForDepositIx = function (userAccountPublicKey, userAccount, perpMarketIndex, assetMarketIndex, maxPnlTransfer) {
2784
+ return __awaiter(this, void 0, void 0, function () {
2785
+ var liquidatorPublicKey, remainingAccounts, _a, _b, _c;
2786
+ var _d, _e;
2787
+ return __generator(this, function (_f) {
2788
+ switch (_f.label) {
2789
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2790
+ case 1:
2791
+ liquidatorPublicKey = _f.sent();
2792
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2793
+ counterPartyUserAccount: userAccount,
2794
+ writablePerpMarketIndex: perpMarketIndex,
2795
+ writableSpotMarketIndexes: [assetMarketIndex]
2796
+ });
2797
+ _b = (_a = this.program.instruction).liquidatePerpPnlForDeposit;
2798
+ _c = [perpMarketIndex,
2799
+ assetMarketIndex,
2800
+ maxPnlTransfer];
2801
+ _d = {};
2802
+ _e = {};
2803
+ return [4 /*yield*/, this.getStatePublicKey()];
2804
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2805
+ _e.authority = this.wallet.publicKey,
2806
+ _e.user = userAccountPublicKey,
2807
+ _e.liquidator = liquidatorPublicKey,
2808
+ _e),
2809
+ _d.remainingAccounts = remainingAccounts,
2810
+ _d)]))];
2811
+ case 3: return [2 /*return*/, _f.sent()];
2812
+ }
2813
+ });
2814
+ });
2815
+ };
2816
+ ClearingHouse.prototype.resolvePerpBankruptcy = function (userAccountPublicKey, userAccount, marketIndex) {
2817
+ return __awaiter(this, void 0, void 0, function () {
2818
+ var txSig, _a, _b, _c;
2819
+ return __generator(this, function (_d) {
2820
+ switch (_d.label) {
2821
+ case 0:
2822
+ _b = (_a = this.txSender).send;
2823
+ _c = utils_1.wrapInTx;
2824
+ return [4 /*yield*/, this.getResolvePerpBankruptcyIx(userAccountPublicKey, userAccount, marketIndex)];
2825
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2826
+ [],
2827
+ this.opts])];
2828
+ case 2:
2829
+ txSig = (_d.sent()).txSig;
2830
+ return [2 /*return*/, txSig];
2831
+ }
2832
+ });
2833
+ });
2834
+ };
2835
+ ClearingHouse.prototype.getResolvePerpBankruptcyIx = function (userAccountPublicKey, userAccount, marketIndex) {
2836
+ return __awaiter(this, void 0, void 0, function () {
2837
+ var liquidatorPublicKey, remainingAccounts, spotMarket, _a, _b, _c;
2838
+ var _d, _e;
2839
+ return __generator(this, function (_f) {
2840
+ switch (_f.label) {
2841
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2842
+ case 1:
2843
+ liquidatorPublicKey = _f.sent();
2844
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2845
+ writablePerpMarketIndex: marketIndex,
2846
+ writableSpotMarketIndexes: [numericConstants_1.QUOTE_SPOT_MARKET_INDEX],
2847
+ counterPartyUserAccount: userAccount
2848
+ });
2849
+ spotMarket = this.getSpotMarketAccount(marketIndex);
2850
+ _b = (_a = this.program.instruction).resolvePerpBankruptcy;
2851
+ _c = [numericConstants_1.QUOTE_SPOT_MARKET_INDEX,
2852
+ marketIndex];
2853
+ _d = {};
2854
+ _e = {};
2855
+ return [4 /*yield*/, this.getStatePublicKey()];
2856
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2857
+ _e.authority = this.wallet.publicKey,
2858
+ _e.user = userAccountPublicKey,
2859
+ _e.liquidator = liquidatorPublicKey,
2860
+ _e.spotMarketVault = spotMarket.vault,
2861
+ _e.insuranceFundVault = spotMarket.insuranceFundVault,
2862
+ _e.clearingHouseSigner = this.getSignerPublicKey(),
2863
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
2864
+ _e),
2865
+ _d.remainingAccounts = remainingAccounts,
2866
+ _d)]))];
2867
+ case 3: return [2 /*return*/, _f.sent()];
2868
+ }
2869
+ });
2870
+ });
2871
+ };
2872
+ ClearingHouse.prototype.resolveBorrowBankruptcy = function (userAccountPublicKey, userAccount, marketIndex) {
2873
+ return __awaiter(this, void 0, void 0, function () {
2874
+ var txSig, _a, _b, _c;
2875
+ return __generator(this, function (_d) {
2876
+ switch (_d.label) {
2877
+ case 0:
2878
+ _b = (_a = this.txSender).send;
2879
+ _c = utils_1.wrapInTx;
2880
+ return [4 /*yield*/, this.getResolveBorrowBankruptcyIx(userAccountPublicKey, userAccount, marketIndex)];
2881
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
2882
+ [],
2883
+ this.opts])];
2884
+ case 2:
2885
+ txSig = (_d.sent()).txSig;
2886
+ return [2 /*return*/, txSig];
2887
+ }
2888
+ });
2889
+ });
2890
+ };
2891
+ ClearingHouse.prototype.getResolveBorrowBankruptcyIx = function (userAccountPublicKey, userAccount, marketIndex) {
2892
+ return __awaiter(this, void 0, void 0, function () {
2893
+ var liquidatorPublicKey, remainingAccounts, spotMarket, _a, _b, _c;
2894
+ var _d, _e;
2895
+ return __generator(this, function (_f) {
2896
+ switch (_f.label) {
2897
+ case 0: return [4 /*yield*/, this.getUserAccountPublicKey()];
2898
+ case 1:
2899
+ liquidatorPublicKey = _f.sent();
2900
+ remainingAccounts = this.getRemainingAccountsWithCounterparty({
2901
+ writableSpotMarketIndexes: [marketIndex],
2902
+ counterPartyUserAccount: userAccount
2903
+ });
2904
+ spotMarket = this.getSpotMarketAccount(marketIndex);
2905
+ _b = (_a = this.program.instruction).resolveBorrowBankruptcy;
2906
+ _c = [marketIndex];
2907
+ _d = {};
2908
+ _e = {};
2909
+ return [4 /*yield*/, this.getStatePublicKey()];
2910
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
2911
+ _e.authority = this.wallet.publicKey,
2912
+ _e.user = userAccountPublicKey,
2913
+ _e.liquidator = liquidatorPublicKey,
2914
+ _e.spotMarketVault = spotMarket.vault,
2915
+ _e.insuranceFundVault = spotMarket.insuranceFundVault,
2916
+ _e.clearingHouseSigner = this.getSignerPublicKey(),
2917
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
2918
+ _e),
2919
+ _d.remainingAccounts = remainingAccounts,
2920
+ _d)]))];
2921
+ case 3: return [2 /*return*/, _f.sent()];
2922
+ }
2923
+ });
2924
+ });
2925
+ };
2926
+ ClearingHouse.prototype.getRemainingAccountsWithCounterparty = function (params) {
2927
+ var counterPartyUserAccount = params.counterPartyUserAccount;
2928
+ var oracleAccountMap = new Map();
2929
+ var spotMarketAccountMap = new Map();
2930
+ var marketAccountMap = new Map();
2931
+ for (var _i = 0, _a = counterPartyUserAccount.spotPositions; _i < _a.length; _i++) {
2932
+ var spotPosition = _a[_i];
2933
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
2934
+ var spotMarket = this.getSpotMarketAccount(spotPosition.marketIndex);
2935
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
2936
+ pubkey: spotMarket.pubkey,
2937
+ isSigner: false,
2938
+ isWritable: false
2939
+ });
2940
+ if (!spotMarket.oracle.equals(web3_js_1.PublicKey["default"])) {
2941
+ oracleAccountMap.set(spotMarket.oracle.toString(), {
2942
+ pubkey: spotMarket.oracle,
2943
+ isSigner: false,
2944
+ isWritable: false
2945
+ });
2946
+ }
2947
+ }
2948
+ }
2949
+ for (var _b = 0, _c = counterPartyUserAccount.perpPositions; _b < _c.length; _b++) {
2950
+ var position = _c[_b];
2951
+ if (!(0, position_1.positionIsAvailable)(position)) {
2952
+ var market = this.getPerpMarketAccount(position.marketIndex);
2953
+ marketAccountMap.set(position.marketIndex.toNumber(), {
2954
+ pubkey: market.pubkey,
2955
+ isWritable: false,
2956
+ isSigner: false
2957
+ });
2958
+ oracleAccountMap.set(market.amm.oracle.toString(), {
2959
+ pubkey: market.amm.oracle,
2960
+ isWritable: false,
2961
+ isSigner: false
2962
+ });
2963
+ }
2964
+ }
2965
+ var userAccountAndSlot = this.getUserAccountAndSlot();
2966
+ if (!userAccountAndSlot) {
2967
+ throw Error('No user account found. Most likely user account does not exist or failed to fetch account');
2968
+ }
2969
+ var userAccount = userAccountAndSlot.data, lastUserPositionsSlot = userAccountAndSlot.slot;
2970
+ for (var _d = 0, _e = this.marketLastSlotCache.entries(); _d < _e.length; _d++) {
2971
+ var _f = _e[_d], marketIndexNum = _f[0], slot = _f[1];
2972
+ // if cache has more recent slot than user positions account slot, add market to remaining accounts
2973
+ // otherwise remove from slot
2974
+ if (slot > lastUserPositionsSlot) {
2975
+ var marketAccount = this.getPerpMarketAccount(marketIndexNum);
2976
+ marketAccountMap.set(marketIndexNum, {
2977
+ pubkey: marketAccount.pubkey,
2978
+ isSigner: false,
2979
+ isWritable: false
2980
+ });
2981
+ oracleAccountMap.set(marketAccount.amm.oracle.toString(), {
2982
+ pubkey: marketAccount.amm.oracle,
2983
+ isSigner: false,
2984
+ isWritable: false
2985
+ });
2986
+ }
2987
+ else {
2988
+ this.marketLastSlotCache["delete"](marketIndexNum);
2989
+ }
2990
+ }
2991
+ for (var _g = 0, _h = userAccount.spotPositions; _g < _h.length; _g++) {
2992
+ var spotPosition = _h[_g];
2993
+ if (!(0, spotPosition_1.isSpotPositionAvailable)(spotPosition)) {
2994
+ var spotMarket = this.getSpotMarketAccount(spotPosition.marketIndex);
2995
+ spotMarketAccountMap.set(spotPosition.marketIndex.toNumber(), {
2996
+ pubkey: spotMarket.pubkey,
2997
+ isSigner: false,
2998
+ isWritable: false
2999
+ });
3000
+ if (!spotMarket.oracle.equals(web3_js_1.PublicKey["default"])) {
3001
+ oracleAccountMap.set(spotMarket.oracle.toString(), {
3002
+ pubkey: spotMarket.oracle,
3003
+ isSigner: false,
3004
+ isWritable: false
3005
+ });
3006
+ }
3007
+ }
3008
+ }
3009
+ for (var _j = 0, _k = userAccount.perpPositions; _j < _k.length; _j++) {
3010
+ var position = _k[_j];
3011
+ if (!(0, position_1.positionIsAvailable)(position)) {
3012
+ var market = this.getPerpMarketAccount(position.marketIndex);
3013
+ marketAccountMap.set(position.marketIndex.toNumber(), {
3014
+ pubkey: market.pubkey,
3015
+ isWritable: false,
3016
+ isSigner: false
3017
+ });
3018
+ oracleAccountMap.set(market.amm.oracle.toString(), {
3019
+ pubkey: market.amm.oracle,
3020
+ isWritable: false,
3021
+ isSigner: false
3022
+ });
3023
+ }
3024
+ }
3025
+ if (params.writablePerpMarketIndex) {
3026
+ var market = this.getPerpMarketAccount(params.writablePerpMarketIndex);
3027
+ marketAccountMap.set(market.marketIndex.toNumber(), {
3028
+ pubkey: market.pubkey,
3029
+ isSigner: false,
3030
+ isWritable: true
3031
+ });
3032
+ oracleAccountMap.set(market.amm.oracle.toString(), {
3033
+ pubkey: market.amm.oracle,
3034
+ isSigner: false,
3035
+ isWritable: false
3036
+ });
3037
+ }
3038
+ if (params.writableSpotMarketIndexes) {
3039
+ for (var _l = 0, _m = params.writableSpotMarketIndexes; _l < _m.length; _l++) {
3040
+ var writableSpotMarketIndex = _m[_l];
3041
+ var spotMarketAccount = this.getSpotMarketAccount(writableSpotMarketIndex);
3042
+ spotMarketAccountMap.set(spotMarketAccount.marketIndex.toNumber(), {
3043
+ pubkey: spotMarketAccount.pubkey,
3044
+ isSigner: false,
3045
+ isWritable: true
3046
+ });
3047
+ if (!spotMarketAccount.oracle.equals(web3_js_1.PublicKey["default"])) {
3048
+ oracleAccountMap.set(spotMarketAccount.oracle.toString(), {
3049
+ pubkey: spotMarketAccount.oracle,
3050
+ isSigner: false,
3051
+ isWritable: false
3052
+ });
3053
+ }
3054
+ }
3055
+ }
3056
+ return __spreadArray(__spreadArray(__spreadArray([], oracleAccountMap.values(), true), spotMarketAccountMap.values(), true), marketAccountMap.values(), true);
3057
+ };
3058
+ ClearingHouse.prototype.updateFundingRate = function (oracle, marketIndex) {
3059
+ return __awaiter(this, void 0, void 0, function () {
3060
+ var txSig, _a, _b, _c;
3061
+ return __generator(this, function (_d) {
3062
+ switch (_d.label) {
3063
+ case 0:
3064
+ _b = (_a = this.txSender).send;
3065
+ _c = utils_1.wrapInTx;
3066
+ return [4 /*yield*/, this.getUpdateFundingRateIx(oracle, marketIndex)];
3067
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
3068
+ [],
3069
+ this.opts])];
3070
+ case 2:
3071
+ txSig = (_d.sent()).txSig;
3072
+ return [2 /*return*/, txSig];
3073
+ }
3074
+ });
3075
+ });
3076
+ };
3077
+ ClearingHouse.prototype.getUpdateFundingRateIx = function (oracle, marketIndex) {
3078
+ return __awaiter(this, void 0, void 0, function () {
3079
+ var _a, _b, _c;
3080
+ var _d, _e;
3081
+ return __generator(this, function (_f) {
3082
+ switch (_f.label) {
3083
+ case 0:
3084
+ _b = (_a = this.program.instruction).updateFundingRate;
3085
+ _c = [marketIndex];
3086
+ _d = {};
3087
+ _e = {};
3088
+ return [4 /*yield*/, this.getStatePublicKey()];
3089
+ case 1:
3090
+ _e.state = _f.sent();
3091
+ return [4 /*yield*/, (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex)];
3092
+ case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.market = _f.sent(),
3093
+ _e.oracle = oracle,
3094
+ _e),
3095
+ _d)]))];
3096
+ case 3: return [2 /*return*/, _f.sent()];
3097
+ }
3098
+ });
3099
+ });
3100
+ };
3101
+ ClearingHouse.prototype.settleFundingPayment = function (userAccount) {
3102
+ return __awaiter(this, void 0, void 0, function () {
3103
+ var txSig, _a, _b, _c;
3104
+ return __generator(this, function (_d) {
3105
+ switch (_d.label) {
3106
+ case 0:
3107
+ _b = (_a = this.txSender).send;
3108
+ _c = utils_1.wrapInTx;
3109
+ return [4 /*yield*/, this.getSettleFundingPaymentIx(userAccount)];
3110
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
3111
+ [],
3112
+ this.opts])];
3113
+ case 2:
3114
+ txSig = (_d.sent()).txSig;
3115
+ return [2 /*return*/, txSig];
3116
+ }
3117
+ });
3118
+ });
3119
+ };
3120
+ ClearingHouse.prototype.getSettleFundingPaymentIx = function (userAccount) {
3121
+ return __awaiter(this, void 0, void 0, function () {
3122
+ var user, userPositions, remainingAccounts, _i, userPositions_2, position, marketPublicKey, _a, _b;
3123
+ var _c, _d;
3124
+ return __generator(this, function (_e) {
3125
+ switch (_e.label) {
3126
+ case 0: return [4 /*yield*/, this.program.account.user.fetch(userAccount)];
3127
+ case 1:
3128
+ user = (_e.sent());
3129
+ userPositions = user.perpPositions;
3130
+ remainingAccounts = [];
3131
+ _i = 0, userPositions_2 = userPositions;
3132
+ _e.label = 2;
3133
+ case 2:
3134
+ if (!(_i < userPositions_2.length)) return [3 /*break*/, 5];
3135
+ position = userPositions_2[_i];
3136
+ if (!!(0, position_1.positionIsAvailable)(position)) return [3 /*break*/, 4];
3137
+ return [4 /*yield*/, (0, pda_1.getMarketPublicKey)(this.program.programId, position.marketIndex)];
3138
+ case 3:
3139
+ marketPublicKey = _e.sent();
3140
+ remainingAccounts.push({
3141
+ pubkey: marketPublicKey,
3142
+ isWritable: false,
3143
+ isSigner: false
3144
+ });
3145
+ _e.label = 4;
3146
+ case 4:
3147
+ _i++;
3148
+ return [3 /*break*/, 2];
3149
+ case 5:
3150
+ _b = (_a = this.program.instruction).settleFundingPayment;
3151
+ _c = {};
3152
+ _d = {};
3153
+ return [4 /*yield*/, this.getStatePublicKey()];
3154
+ case 6: return [4 /*yield*/, _b.apply(_a, [(_c.accounts = (_d.state = _e.sent(),
3155
+ _d.user = userAccount,
3156
+ _d),
3157
+ _c.remainingAccounts = remainingAccounts,
3158
+ _c)])];
3159
+ case 7: return [2 /*return*/, _e.sent()];
3160
+ }
3161
+ });
3162
+ });
3163
+ };
3164
+ ClearingHouse.prototype.triggerEvent = function (eventName, data) {
3165
+ this.eventEmitter.emit(eventName, data);
3166
+ };
3167
+ ClearingHouse.prototype.getOracleDataForMarket = function (marketIndex) {
3168
+ var oracleKey = this.getPerpMarketAccount(marketIndex).amm.oracle;
3169
+ var oracleData = this.getOraclePriceDataAndSlot(oracleKey).data;
3170
+ return oracleData;
3171
+ };
3172
+ ClearingHouse.prototype.initializeInsuranceFundStake = function (marketIndex) {
3173
+ return __awaiter(this, void 0, void 0, function () {
3174
+ var txSig, _a, _b, _c;
3175
+ return __generator(this, function (_d) {
3176
+ switch (_d.label) {
3177
+ case 0:
3178
+ _b = (_a = this.txSender).send;
3179
+ _c = utils_1.wrapInTx;
3180
+ return [4 /*yield*/, this.getInitializeInsuranceFundStakeIx(marketIndex)];
3181
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
3182
+ [],
3183
+ this.opts])];
3184
+ case 2:
3185
+ txSig = (_d.sent()).txSig;
3186
+ return [2 /*return*/, txSig];
3187
+ }
3188
+ });
3189
+ });
3190
+ };
3191
+ ClearingHouse.prototype.getInitializeInsuranceFundStakeIx = function (marketIndex) {
3192
+ return __awaiter(this, void 0, void 0, function () {
3193
+ var ifStakeAccountPublicKey, _a, _b, _c;
3194
+ var _d, _e;
3195
+ return __generator(this, function (_f) {
3196
+ switch (_f.label) {
3197
+ case 0:
3198
+ ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
3199
+ _b = (_a = this.program.instruction).initializeInsuranceFundStake;
3200
+ _c = [marketIndex];
3201
+ _d = {};
3202
+ _e = {
3203
+ insuranceFundStake: ifStakeAccountPublicKey,
3204
+ spotMarket: this.getSpotMarketAccount(marketIndex).pubkey,
3205
+ userStats: this.getUserStatsAccountPublicKey(),
3206
+ authority: this.wallet.publicKey,
3207
+ payer: this.wallet.publicKey,
3208
+ rent: anchor.web3.SYSVAR_RENT_PUBKEY,
3209
+ systemProgram: anchor.web3.SystemProgram.programId
3210
+ };
3211
+ return [4 /*yield*/, this.getStatePublicKey()];
3212
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3213
+ _e),
3214
+ _d)]))];
3215
+ case 2: return [2 /*return*/, _f.sent()];
3216
+ }
3217
+ });
3218
+ });
3219
+ };
3220
+ ClearingHouse.prototype.addInsuranceFundStake = function (marketIndex, amount, collateralAccountPublicKey) {
3221
+ return __awaiter(this, void 0, void 0, function () {
3222
+ var spotMarket, ifStakeAccountPublicKey, remainingAccounts, _a, _b, _c;
3223
+ var _d, _e;
3224
+ return __generator(this, function (_f) {
3225
+ switch (_f.label) {
3226
+ case 0:
3227
+ spotMarket = this.getSpotMarketAccount(marketIndex);
3228
+ ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
3229
+ remainingAccounts = this.getRemainingAccounts({
3230
+ writableSpotMarketIndex: marketIndex
3231
+ });
3232
+ _b = (_a = this.program.rpc).addInsuranceFundStake;
3233
+ _c = [marketIndex, amount];
3234
+ _d = {};
3235
+ _e = {};
3236
+ return [4 /*yield*/, this.getStatePublicKey()];
3237
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3238
+ _e.spotMarket = spotMarket.pubkey,
3239
+ _e.insuranceFundStake = ifStakeAccountPublicKey,
3240
+ _e.userStats = this.getUserStatsAccountPublicKey(),
3241
+ _e.authority = this.wallet.publicKey,
3242
+ _e.insuranceFundVault = spotMarket.insuranceFundVault,
3243
+ _e.userTokenAccount = collateralAccountPublicKey,
3244
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
3245
+ _e),
3246
+ _d.remainingAccounts = remainingAccounts,
3247
+ _d)]))];
3248
+ case 2: return [2 /*return*/, _f.sent()];
3249
+ }
3250
+ });
3251
+ });
3252
+ };
3253
+ ClearingHouse.prototype.requestRemoveInsuranceFundStake = function (marketIndex, amount) {
3254
+ return __awaiter(this, void 0, void 0, function () {
3255
+ var spotMarketAccount, ifStakeAccountPublicKey, remainingAccounts, _a, _b, _c;
3256
+ var _d, _e;
3257
+ return __generator(this, function (_f) {
3258
+ switch (_f.label) {
3259
+ case 0:
3260
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
3261
+ ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
3262
+ remainingAccounts = this.getRemainingAccounts({
3263
+ writableSpotMarketIndex: marketIndex
3264
+ });
3265
+ _b = (_a = this.program.rpc).requestRemoveInsuranceFundStake;
3266
+ _c = [marketIndex,
3267
+ amount];
3268
+ _d = {};
3269
+ _e = {};
3270
+ return [4 /*yield*/, this.getStatePublicKey()];
3271
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3272
+ _e.spotMarket = spotMarketAccount.pubkey,
3273
+ _e.insuranceFundStake = ifStakeAccountPublicKey,
3274
+ _e.userStats = this.getUserStatsAccountPublicKey(),
3275
+ _e.authority = this.wallet.publicKey,
3276
+ _e.insuranceFundVault = spotMarketAccount.insuranceFundVault,
3277
+ _e),
3278
+ _d.remainingAccounts = remainingAccounts,
3279
+ _d)]))];
3280
+ case 2: return [2 /*return*/, _f.sent()];
3281
+ }
3282
+ });
3283
+ });
3284
+ };
3285
+ ClearingHouse.prototype.cancelRequestRemoveInsuranceFundStake = function (marketIndex) {
3286
+ return __awaiter(this, void 0, void 0, function () {
3287
+ var spotMarketAccount, ifStakeAccountPublicKey, remainingAccounts, _a, _b, _c;
3288
+ var _d, _e;
3289
+ return __generator(this, function (_f) {
3290
+ switch (_f.label) {
3291
+ case 0:
3292
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
3293
+ ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
3294
+ remainingAccounts = this.getRemainingAccounts({
3295
+ writableSpotMarketIndex: marketIndex
3296
+ });
3297
+ _b = (_a = this.program.rpc).cancelRequestRemoveInsuranceFundStake;
3298
+ _c = [marketIndex];
3299
+ _d = {};
3300
+ _e = {};
3301
+ return [4 /*yield*/, this.getStatePublicKey()];
3302
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3303
+ _e.spotMarket = spotMarketAccount.pubkey,
3304
+ _e.insuranceFundStake = ifStakeAccountPublicKey,
3305
+ _e.userStats = this.getUserStatsAccountPublicKey(),
3306
+ _e.authority = this.wallet.publicKey,
3307
+ _e.insuranceFundVault = spotMarketAccount.insuranceFundVault,
3308
+ _e),
3309
+ _d.remainingAccounts = remainingAccounts,
3310
+ _d)]))];
3311
+ case 2: return [2 /*return*/, _f.sent()];
3312
+ }
3313
+ });
3314
+ });
3315
+ };
3316
+ ClearingHouse.prototype.removeInsuranceFundStake = function (marketIndex, collateralAccountPublicKey) {
3317
+ return __awaiter(this, void 0, void 0, function () {
3318
+ var spotMarketAccount, ifStakeAccountPublicKey, remainingAccounts, _a, _b, _c;
3319
+ var _d, _e;
3320
+ return __generator(this, function (_f) {
3321
+ switch (_f.label) {
3322
+ case 0:
3323
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
3324
+ ifStakeAccountPublicKey = (0, pda_1.getInsuranceFundStakeAccountPublicKey)(this.program.programId, this.wallet.publicKey, marketIndex);
3325
+ remainingAccounts = this.getRemainingAccounts({
3326
+ writableSpotMarketIndex: marketIndex
3327
+ });
3328
+ _b = (_a = this.program.rpc).removeInsuranceFundStake;
3329
+ _c = [marketIndex];
3330
+ _d = {};
3331
+ _e = {};
3332
+ return [4 /*yield*/, this.getStatePublicKey()];
3333
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3334
+ _e.spotMarket = spotMarketAccount.pubkey,
3335
+ _e.insuranceFundStake = ifStakeAccountPublicKey,
3336
+ _e.userStats = this.getUserStatsAccountPublicKey(),
3337
+ _e.authority = this.wallet.publicKey,
3338
+ _e.insuranceFundVault = spotMarketAccount.insuranceFundVault,
3339
+ _e.clearingHouseSigner = this.getSignerPublicKey(),
3340
+ _e.userTokenAccount = collateralAccountPublicKey,
3341
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
3342
+ _e),
3343
+ _d.remainingAccounts = remainingAccounts,
3344
+ _d)]))];
3345
+ case 2: return [2 /*return*/, _f.sent()];
3346
+ }
3347
+ });
3348
+ });
3349
+ };
3350
+ ClearingHouse.prototype.settleRevenueToInsuranceFund = function (marketIndex) {
3351
+ return __awaiter(this, void 0, void 0, function () {
3352
+ var spotMarketAccount, remainingAccounts, _a, _b, _c;
3353
+ var _d, _e;
3354
+ return __generator(this, function (_f) {
3355
+ switch (_f.label) {
3356
+ case 0:
3357
+ spotMarketAccount = this.getSpotMarketAccount(marketIndex);
3358
+ remainingAccounts = this.getRemainingAccounts({
3359
+ writableSpotMarketIndex: marketIndex
3360
+ });
3361
+ _b = (_a = this.program.rpc).settleRevenueToInsuranceFund;
3362
+ _c = [marketIndex];
3363
+ _d = {};
3364
+ _e = {};
3365
+ return [4 /*yield*/, this.getStatePublicKey()];
3366
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3367
+ _e.spotMarket = spotMarketAccount.pubkey,
3368
+ _e.spotMarketVault = spotMarketAccount.vault,
3369
+ _e.clearingHouseSigner = this.getSignerPublicKey(),
3370
+ _e.insuranceFundVault = spotMarketAccount.insuranceFundVault,
3371
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
3372
+ _e),
3373
+ _d.remainingAccounts = remainingAccounts,
3374
+ _d)]))];
3375
+ case 2: return [2 /*return*/, _f.sent()];
3376
+ }
3377
+ });
3378
+ });
3379
+ };
3380
+ ClearingHouse.prototype.resolvePerpPnlDeficit = function (spotMarketIndex, perpMarketIndex) {
3381
+ return __awaiter(this, void 0, void 0, function () {
3382
+ var txSig, _a, _b, _c;
3383
+ return __generator(this, function (_d) {
3384
+ switch (_d.label) {
3385
+ case 0:
3386
+ _b = (_a = this.txSender).send;
3387
+ _c = utils_1.wrapInTx;
3388
+ return [4 /*yield*/, this.getResolvePerpPnlDeficitIx(spotMarketIndex, perpMarketIndex)];
3389
+ case 1: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
3390
+ [],
3391
+ this.opts])];
3392
+ case 2:
3393
+ txSig = (_d.sent()).txSig;
3394
+ return [2 /*return*/, txSig];
3395
+ }
3396
+ });
3397
+ });
3398
+ };
3399
+ ClearingHouse.prototype.getResolvePerpPnlDeficitIx = function (spotMarketIndex, perpMarketIndex) {
3400
+ return __awaiter(this, void 0, void 0, function () {
3401
+ var remainingAccounts, spotMarket, _a, _b, _c;
3402
+ var _d, _e;
3403
+ return __generator(this, function (_f) {
3404
+ switch (_f.label) {
3405
+ case 0:
3406
+ remainingAccounts = this.getRemainingAccounts({
3407
+ writablePerpMarketIndex: perpMarketIndex,
3408
+ writableSpotMarketIndex: spotMarketIndex
3409
+ });
3410
+ spotMarket = this.getSpotMarketAccount(spotMarketIndex);
3411
+ _b = (_a = this.program.instruction).resolvePerpPnlDeficit;
3412
+ _c = [spotMarketIndex,
3413
+ perpMarketIndex];
3414
+ _d = {};
3415
+ _e = {};
3416
+ return [4 /*yield*/, this.getStatePublicKey()];
3417
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([(_d.accounts = (_e.state = _f.sent(),
3418
+ _e.authority = this.wallet.publicKey,
3419
+ _e.spotMarketVault = spotMarket.vault,
3420
+ _e.insuranceFundVault = spotMarket.insuranceFundVault,
3421
+ _e.clearingHouseSigner = this.getSignerPublicKey(),
3422
+ _e.tokenProgram = spl_token_1.TOKEN_PROGRAM_ID,
3423
+ _e),
3424
+ _d.remainingAccounts = remainingAccounts,
3425
+ _d)]))];
3426
+ case 2: return [2 /*return*/, _f.sent()];
3427
+ }
3428
+ });
3429
+ });
3430
+ };
3431
+ return ClearingHouse;
3432
+ }());
3433
+ exports.ClearingHouse = ClearingHouse;