@carrot-protocol/boost-http-client 0.2.16-token22-dev-158437a → 0.3.0-feat-get-account-endpoint-dev-6a0523c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AnchorProvider, web3 } from "@coral-xyz/anchor";
2
- import { GetBankResponse, GetUserResponse, GetGroupResponse, GetGroupsResponse } from "./types";
2
+ import { GetBankResponse, GetUserResponse, GetGroupResponse, GetGroupsResponse, GetAccountResponse } from "./types";
3
3
  export * from "./types";
4
4
  export * from "./utils";
5
5
  export * as Common from "@carrot-protocol/clend-common";
@@ -22,6 +22,15 @@ export declare class Client {
22
22
  * @returns Index details
23
23
  */
24
24
  index(): Promise<any>;
25
+ /**
26
+ * Fetch and parse a single clend account by pubkey
27
+ */
28
+ getAccount(account: web3.PublicKey, getClendAccountSummary: boolean): Promise<GetAccountResponse>;
29
+ /**
30
+ * Helper to parse a clend account summary array from API response
31
+ */
32
+ private parseClendAccountSummary;
33
+ private parseClendAccountWithSummary;
25
34
  getUser(user: web3.PublicKey, groups: web3.PublicKey[], getClendAccountSummary: boolean): Promise<GetUserResponse>;
26
35
  /**
27
36
  * Get all groups
@@ -41,8 +50,6 @@ export declare class Client {
41
50
  * @returns Bank details
42
51
  */
43
52
  getBank(bankAddress: web3.PublicKey): Promise<GetBankResponse>;
44
- deposit(clendGroup: web3.PublicKey, clendAccount: web3.PublicKey | null, inputTokenMint: web3.PublicKey, uiAmount: number): Promise<string>;
45
- withdraw(clendAccount: web3.PublicKey, outputTokenMint: web3.PublicKey, uiAmount: number, withdrawAll: boolean): Promise<string>;
46
53
  /**
47
54
  * Deposit collateral and create a leveraged position
48
55
  * @param request Deposit leverage request parameters
package/dist/index.js CHANGED
@@ -99,6 +99,120 @@ class Client {
99
99
  async index() {
100
100
  return handleApiCall(() => this.http.get(""));
101
101
  }
102
+ /**
103
+ * Fetch and parse a single clend account by pubkey
104
+ */
105
+ async getAccount(account, getClendAccountSummary) {
106
+ const body = await handleApiCall(() => this.http.get(`/account?account=${account.toString()}&getClendAccountSummary=${getClendAccountSummary}`));
107
+ const jsonRawResponse = JSON.parse(body);
108
+ return this.parseClendAccountWithSummary(jsonRawResponse, getClendAccountSummary);
109
+ }
110
+ /**
111
+ * Helper to parse a clend account summary array from API response
112
+ */
113
+ parseClendAccountSummary(summaryArr) {
114
+ return summaryArr.map((s) => {
115
+ let input = undefined;
116
+ if (s.input) {
117
+ input = {
118
+ apiPath: s.input.apiPath,
119
+ selectedTokenMint: s.input.selectedTokenMint
120
+ ? new anchor_1.web3.PublicKey(s.input.selectedTokenMint)
121
+ : null,
122
+ amountUi: s.input.amountUi ? Number(s.input.amountUi) : null,
123
+ leverage: s.input.leverage ? Number(s.input.leverage) : null,
124
+ slippageBps: s.input.slippageBps ? Number(s.input.slippageBps) : null,
125
+ openPosition: s.input.openPosition != null ? Boolean(s.input.openPosition) : null,
126
+ closePosition: s.input.closePosition != null
127
+ ? Boolean(s.input.closePosition)
128
+ : null,
129
+ };
130
+ }
131
+ const events = (s.events || []).map((event) => {
132
+ let closeBalance = null;
133
+ if (event.closeBalance !== null && event.closeBalance !== undefined) {
134
+ closeBalance = Boolean(event.closeBalance);
135
+ }
136
+ return {
137
+ eventIndex: event.eventIndex,
138
+ eventName: event.eventName,
139
+ bank: event.bank ? new anchor_1.web3.PublicKey(event.bank) : null,
140
+ mint: event.mint ? new anchor_1.web3.PublicKey(event.mint) : null,
141
+ amount: event.amount ? new anchor_1.BN(event.amount, "hex") : null,
142
+ amountUi: event.amountUi ? Number(event.amountUi) : null,
143
+ value: event.value ? Number(event.value) : null,
144
+ price: event.price ? Number(event.price) : null,
145
+ closeBalance,
146
+ };
147
+ });
148
+ const txSummary = {
149
+ txSig: s.txSig,
150
+ time: s.time,
151
+ clendAccount: new anchor_1.web3.PublicKey(s.clendAccount),
152
+ clendAccountAuthority: new anchor_1.web3.PublicKey(s.clendAccountAuthority),
153
+ clendGroup: new anchor_1.web3.PublicKey(s.clendGroup),
154
+ action: s.action,
155
+ input,
156
+ events,
157
+ };
158
+ return txSummary;
159
+ });
160
+ }
161
+ parseClendAccountWithSummary(accountData, getClendAccountSummary) {
162
+ // A. Parse the main ClendAccount object
163
+ const rawClendAccount = accountData.clendAccount;
164
+ const clendAccountBalances = (rawClendAccount.balances || []).map((b) => {
165
+ const liquidation = b.liquidation
166
+ ? {
167
+ price: Number(b.liquidation.price),
168
+ changePercentage: Number(b.liquidation.changePercentage),
169
+ }
170
+ : null;
171
+ const emissionsOutstandingAndUnclaimed = new anchor_1.BN(b.emissionsOutstandingAndUnclaimed, "hex");
172
+ return {
173
+ mint: new anchor_1.web3.PublicKey(b.mint),
174
+ bank: new anchor_1.web3.PublicKey(b.bank),
175
+ tokenYieldApy: Number(b.tokenYieldApy),
176
+ assetBalance: new anchor_1.BN(b.assetBalance, "hex"),
177
+ assetBalanceUi: Number(b.assetBalanceUi),
178
+ assetValue: Number(b.assetValue),
179
+ assetEmissionsApy: Number(b.assetEmissionsApy),
180
+ liabilityBalance: new anchor_1.BN(b.liabilityBalance, "hex"),
181
+ liabilityBalanceUi: Number(b.liabilityBalanceUi),
182
+ liabilityValue: Number(b.liabilityValue),
183
+ liabilityBorrowCostApy: Number(b.liabilityBorrowCostApy),
184
+ liabilityEmissionsApy: Number(b.liabilityEmissionsApy),
185
+ emissionsOutstandingAndUnclaimed,
186
+ emissionsOutstandingAndUnclaimedUi: Number(b.emissionsOutstandingAndUnclaimedUi),
187
+ price: Number(b.price),
188
+ liquidation,
189
+ };
190
+ });
191
+ const clendAccount = {
192
+ key: new anchor_1.web3.PublicKey(rawClendAccount.key),
193
+ group: new anchor_1.web3.PublicKey(rawClendAccount.group),
194
+ balances: clendAccountBalances,
195
+ netValue: Number(rawClendAccount.netValue),
196
+ netApy: Number(rawClendAccount.netApy),
197
+ pnl: Number(rawClendAccount.pnl),
198
+ totalEmissionsApy: Number(rawClendAccount.totalEmissionsApy),
199
+ totalAssetValue: Number(rawClendAccount.totalAssetValue),
200
+ totalLiabilityValue: Number(rawClendAccount.totalLiabilityValue),
201
+ healthFactorNotional: Number(rawClendAccount.healthFactorNotional),
202
+ healthFactorRiskAdjusted: Number(rawClendAccount.healthFactorRiskAdjusted),
203
+ notionalLeverage: Number(rawClendAccount.notionalLeverage),
204
+ riskAdjustedLeverage: Number(rawClendAccount.riskAdjustedLeverage),
205
+ notionalLtv: Number(rawClendAccount.notionalLtv),
206
+ riskAdjustedLtv: Number(rawClendAccount.riskAdjustedLtv),
207
+ };
208
+ // B. Parse the associated Summary array for the account
209
+ let summary = [];
210
+ if (getClendAccountSummary && accountData.summary) {
211
+ summary = this.parseClendAccountSummary(accountData.summary);
212
+ }
213
+ // C. Combine the parsed account and its summary
214
+ return { clendAccount, summary };
215
+ }
102
216
  async getUser(user, groups, getClendAccountSummary) {
103
217
  // Make the API call to fetch the raw user data as a string.
104
218
  const body = await handleApiCall(() => this.http.get(`/user?user=${user.toString()}&groups=${groups.map((g) => g.toString()).join(",")}&getClendAccountSummary=${getClendAccountSummary}`));
@@ -117,112 +231,7 @@ class Client {
117
231
  // 2. Parse Clend Accounts and their Summaries
118
232
  // This is the main refactored section. It iterates through the clendAccounts array
119
233
  // from the response, which contains both the account data and its summary.
120
- const clendAccounts = (jsonRawResponse.clendAccounts || []).map((accountData) => {
121
- // A. Parse the main ClendAccount object
122
- const rawClendAccount = accountData.clendAccount;
123
- const clendAccountBalances = (rawClendAccount.balances || []).map((b) => {
124
- const liquidation = b.liquidation
125
- ? {
126
- price: Number(b.liquidation.price),
127
- changePercentage: Number(b.liquidation.changePercentage),
128
- }
129
- : null;
130
- const emissionsOutstandingAndUnclaimed = new anchor_1.BN(b.emissionsOutstandingAndUnclaimed, "hex");
131
- return {
132
- mint: new anchor_1.web3.PublicKey(b.mint),
133
- bank: new anchor_1.web3.PublicKey(b.bank),
134
- tokenYieldApy: Number(b.tokenYieldApy),
135
- assetBalance: new anchor_1.BN(b.assetBalance, "hex"),
136
- assetBalanceUi: Number(b.assetBalanceUi),
137
- assetValue: Number(b.assetValue),
138
- assetEmissionsApy: Number(b.assetEmissionsApy),
139
- liabilityBalance: new anchor_1.BN(b.liabilityBalance, "hex"),
140
- liabilityBalanceUi: Number(b.liabilityBalanceUi),
141
- liabilityValue: Number(b.liabilityValue),
142
- liabilityBorrowCostApy: Number(b.liabilityBorrowCostApy),
143
- liabilityEmissionsApy: Number(b.liabilityEmissionsApy),
144
- emissionsOutstandingAndUnclaimed,
145
- emissionsOutstandingAndUnclaimedUi: Number(b.emissionsOutstandingAndUnclaimedUi),
146
- price: Number(b.price),
147
- liquidation,
148
- };
149
- });
150
- const clendAccount = {
151
- key: new anchor_1.web3.PublicKey(rawClendAccount.key),
152
- group: new anchor_1.web3.PublicKey(rawClendAccount.group),
153
- balances: clendAccountBalances,
154
- netValue: Number(rawClendAccount.netValue),
155
- netApy: Number(rawClendAccount.netApy),
156
- pnl: Number(rawClendAccount.pnl),
157
- totalEmissionsApy: Number(rawClendAccount.totalEmissionsApy),
158
- totalAssetValue: Number(rawClendAccount.totalAssetValue),
159
- totalLiabilityValue: Number(rawClendAccount.totalLiabilityValue),
160
- healthFactorNotional: Number(rawClendAccount.healthFactorNotional),
161
- healthFactorRiskAdjusted: Number(rawClendAccount.healthFactorRiskAdjusted),
162
- notionalLeverage: Number(rawClendAccount.notionalLeverage),
163
- riskAdjustedLeverage: Number(rawClendAccount.riskAdjustedLeverage),
164
- notionalLtv: Number(rawClendAccount.notionalLtv),
165
- riskAdjustedLtv: Number(rawClendAccount.riskAdjustedLtv),
166
- };
167
- // B. Parse the associated Summary array for the account
168
- let summary = [];
169
- if (getClendAccountSummary && accountData.summary) {
170
- summary = accountData.summary.map((s) => {
171
- let input = undefined;
172
- if (s.input) {
173
- input = {
174
- apiPath: s.input.apiPath,
175
- selectedTokenMint: s.input.selectedTokenMint
176
- ? new anchor_1.web3.PublicKey(s.input.selectedTokenMint)
177
- : null,
178
- amountUi: s.input.amountUi ? Number(s.input.amountUi) : null,
179
- leverage: s.input.leverage ? Number(s.input.leverage) : null,
180
- slippageBps: s.input.slippageBps
181
- ? Number(s.input.slippageBps)
182
- : null,
183
- openPosition: s.input.openPosition != null
184
- ? Boolean(s.input.openPosition)
185
- : null,
186
- closePosition: s.input.closePosition != null
187
- ? Boolean(s.input.closePosition)
188
- : null,
189
- };
190
- }
191
- const events = (s.events || []).map((event) => {
192
- let closeBalance = null;
193
- // Only convert to boolean if the value is not null/undefined to preserve the null state.
194
- if (event.closeBalance !== null &&
195
- event.closeBalance !== undefined) {
196
- closeBalance = Boolean(event.closeBalance);
197
- }
198
- return {
199
- eventIndex: event.eventIndex,
200
- eventName: event.eventName,
201
- bank: event.bank ? new anchor_1.web3.PublicKey(event.bank) : null,
202
- mint: event.mint ? new anchor_1.web3.PublicKey(event.mint) : null,
203
- amount: event.amount ? new anchor_1.BN(event.amount, "hex") : null,
204
- amountUi: event.amountUi ? Number(event.amountUi) : null,
205
- value: event.value ? Number(event.value) : null,
206
- price: event.price ? Number(event.price) : null,
207
- closeBalance,
208
- };
209
- });
210
- const txSummary = {
211
- txSig: s.txSig,
212
- time: s.time,
213
- clendAccount: new anchor_1.web3.PublicKey(s.clendAccount),
214
- clendAccountAuthority: new anchor_1.web3.PublicKey(s.clendAccountAuthority),
215
- clendGroup: new anchor_1.web3.PublicKey(s.clendGroup),
216
- action: s.action,
217
- input,
218
- events,
219
- };
220
- return txSummary;
221
- });
222
- }
223
- // C. Combine the parsed account and its summary
224
- return { clendAccount, summary };
225
- });
234
+ const clendAccounts = (jsonRawResponse.clendAccounts || []).map((accountData) => this.parseClendAccountWithSummary(accountData, getClendAccountSummary));
226
235
  // 3. Return the final, correctly structured response object.
227
236
  return {
228
237
  wallet,
@@ -289,31 +298,6 @@ class Client {
289
298
  };
290
299
  return response;
291
300
  }
292
- async deposit(clendGroup, clendAccount, inputTokenMint, uiAmount) {
293
- const req = {
294
- owner: this.address(),
295
- clendGroup,
296
- clendAccount,
297
- inputTokenMint,
298
- depositAmountUi: uiAmount,
299
- };
300
- const body = await handleApiCall(() => this.http.post("deposit", JSON.stringify(req)));
301
- const depositResponse = JSON.parse(body);
302
- const txSig = await this.send(depositResponse.unsignedBase64Tx, depositResponse.userRequestId);
303
- return txSig;
304
- }
305
- async withdraw(clendAccount, outputTokenMint, uiAmount, withdrawAll) {
306
- const req = {
307
- clendAccount,
308
- outputTokenMint,
309
- withdrawAmountUi: uiAmount,
310
- withdrawAll,
311
- };
312
- const body = await handleApiCall(() => this.http.post("withdraw", JSON.stringify(req)));
313
- const withdrawResponse = JSON.parse(body);
314
- const txSig = await this.send(withdrawResponse.unsignedBase64Tx, withdrawResponse.userRequestId);
315
- return txSig;
316
- }
317
301
  /**
318
302
  * Deposit collateral and create a leveraged position
319
303
  * @param request Deposit leverage request parameters
package/dist/types.d.ts CHANGED
@@ -3,33 +3,6 @@ export interface SendRequest {
3
3
  userRequestId: string;
4
4
  txns: string[];
5
5
  }
6
- /**
7
- * Request to deposit collateral
8
- */
9
- export interface DepositRequest {
10
- owner: web3.PublicKey;
11
- clendGroup: web3.PublicKey;
12
- clendAccount: web3.PublicKey | null;
13
- inputTokenMint: web3.PublicKey;
14
- depositAmountUi: number;
15
- }
16
- export interface DepositResponse {
17
- userRequestId: string;
18
- unsignedBase64Tx: string;
19
- }
20
- /**
21
- * Request to withdraw collateral
22
- */
23
- export interface WithdrawRequest {
24
- clendAccount: web3.PublicKey;
25
- outputTokenMint: web3.PublicKey;
26
- withdrawAmountUi: number;
27
- withdrawAll: boolean;
28
- }
29
- export interface WithdrawResponse {
30
- userRequestId: string;
31
- unsignedBase64Tx: string;
32
- }
33
6
  /**
34
7
  * Request to deposit collateral and create a leveraged position
35
8
  */
@@ -111,6 +84,14 @@ export interface GroupAndBanks {
111
84
  groupName: string;
112
85
  banks: Bank[];
113
86
  }
87
+ export interface GetAccountRequest {
88
+ account: web3.PublicKey;
89
+ getClendAccountSummary: boolean;
90
+ }
91
+ export interface GetAccountResponse {
92
+ clendAccount: ClendAccount;
93
+ summary: ClendAccountTxSummary[];
94
+ }
114
95
  export interface GetUserRequest {
115
96
  groups: web3.PublicKey[];
116
97
  user: web3.PublicKey;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carrot-protocol/boost-http-client",
3
- "version": "0.2.16-token22-dev-158437a",
3
+ "version": "0.3.0-feat-get-account-endpoint-dev-6a0523c",
4
4
  "description": "HTTP client for Carrot Boost",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -27,10 +27,7 @@ import {
27
27
  BankEmissionsMode,
28
28
  WithdrawEmissionsRequest,
29
29
  WithdrawEmissionsResponse,
30
- DepositRequest,
31
- DepositResponse,
32
- WithdrawRequest,
33
- WithdrawResponse,
30
+ GetAccountResponse,
34
31
  } from "./types";
35
32
  import encode from "bs58";
36
33
 
@@ -110,6 +107,155 @@ export class Client {
110
107
  return handleApiCall(() => this.http.get(""));
111
108
  }
112
109
 
110
+ /**
111
+ * Fetch and parse a single clend account by pubkey
112
+ */
113
+ async getAccount(
114
+ account: web3.PublicKey,
115
+ getClendAccountSummary: boolean,
116
+ ): Promise<GetAccountResponse> {
117
+ const body = await handleApiCall(() =>
118
+ this.http.get(
119
+ `/account?account=${account.toString()}&getClendAccountSummary=${getClendAccountSummary}`,
120
+ ),
121
+ );
122
+ const jsonRawResponse: any = JSON.parse(body);
123
+ return this.parseClendAccountWithSummary(
124
+ jsonRawResponse,
125
+ getClendAccountSummary,
126
+ );
127
+ }
128
+
129
+ /**
130
+ * Helper to parse a clend account summary array from API response
131
+ */
132
+ private parseClendAccountSummary(summaryArr: any[]): ClendAccountTxSummary[] {
133
+ return summaryArr.map((s: any) => {
134
+ let input: UserRequest | undefined = undefined;
135
+ if (s.input) {
136
+ input = {
137
+ apiPath: s.input.apiPath,
138
+ selectedTokenMint: s.input.selectedTokenMint
139
+ ? new web3.PublicKey(s.input.selectedTokenMint)
140
+ : null,
141
+ amountUi: s.input.amountUi ? Number(s.input.amountUi) : null,
142
+ leverage: s.input.leverage ? Number(s.input.leverage) : null,
143
+ slippageBps: s.input.slippageBps ? Number(s.input.slippageBps) : null,
144
+ openPosition:
145
+ s.input.openPosition != null ? Boolean(s.input.openPosition) : null,
146
+ closePosition:
147
+ s.input.closePosition != null
148
+ ? Boolean(s.input.closePosition)
149
+ : null,
150
+ };
151
+ }
152
+
153
+ const events: ClendAccountEvent[] = (s.events || []).map((event: any) => {
154
+ let closeBalance: boolean | null = null;
155
+ if (event.closeBalance !== null && event.closeBalance !== undefined) {
156
+ closeBalance = Boolean(event.closeBalance);
157
+ }
158
+
159
+ return {
160
+ eventIndex: event.eventIndex,
161
+ eventName: event.eventName,
162
+ bank: event.bank ? new web3.PublicKey(event.bank) : null,
163
+ mint: event.mint ? new web3.PublicKey(event.mint) : null,
164
+ amount: event.amount ? new BN(event.amount, "hex") : null,
165
+ amountUi: event.amountUi ? Number(event.amountUi) : null,
166
+ value: event.value ? Number(event.value) : null,
167
+ price: event.price ? Number(event.price) : null,
168
+ closeBalance,
169
+ };
170
+ });
171
+
172
+ const txSummary: ClendAccountTxSummary = {
173
+ txSig: s.txSig,
174
+ time: s.time,
175
+ clendAccount: new web3.PublicKey(s.clendAccount),
176
+ clendAccountAuthority: new web3.PublicKey(s.clendAccountAuthority),
177
+ clendGroup: new web3.PublicKey(s.clendGroup),
178
+ action: s.action,
179
+ input,
180
+ events,
181
+ };
182
+ return txSummary;
183
+ });
184
+ }
185
+
186
+ private parseClendAccountWithSummary(
187
+ accountData: any,
188
+ getClendAccountSummary: boolean,
189
+ ): GetAccountResponse {
190
+ // A. Parse the main ClendAccount object
191
+ const rawClendAccount = accountData.clendAccount;
192
+ const clendAccountBalances: ClendAccountBalance[] = (
193
+ rawClendAccount.balances || []
194
+ ).map((b: any) => {
195
+ const liquidation: ClendAccountAssetLiquidation | null = b.liquidation
196
+ ? {
197
+ price: Number(b.liquidation.price),
198
+ changePercentage: Number(b.liquidation.changePercentage),
199
+ }
200
+ : null;
201
+
202
+ const emissionsOutstandingAndUnclaimed = new BN(
203
+ b.emissionsOutstandingAndUnclaimed,
204
+ "hex",
205
+ );
206
+
207
+ return {
208
+ mint: new web3.PublicKey(b.mint),
209
+ bank: new web3.PublicKey(b.bank),
210
+ tokenYieldApy: Number(b.tokenYieldApy),
211
+ assetBalance: new BN(b.assetBalance, "hex"),
212
+ assetBalanceUi: Number(b.assetBalanceUi),
213
+ assetValue: Number(b.assetValue),
214
+ assetEmissionsApy: Number(b.assetEmissionsApy),
215
+ liabilityBalance: new BN(b.liabilityBalance, "hex"),
216
+ liabilityBalanceUi: Number(b.liabilityBalanceUi),
217
+ liabilityValue: Number(b.liabilityValue),
218
+ liabilityBorrowCostApy: Number(b.liabilityBorrowCostApy),
219
+ liabilityEmissionsApy: Number(b.liabilityEmissionsApy),
220
+ emissionsOutstandingAndUnclaimed,
221
+ emissionsOutstandingAndUnclaimedUi: Number(
222
+ b.emissionsOutstandingAndUnclaimedUi,
223
+ ),
224
+ price: Number(b.price),
225
+ liquidation,
226
+ };
227
+ });
228
+
229
+ const clendAccount: ClendAccount = {
230
+ key: new web3.PublicKey(rawClendAccount.key),
231
+ group: new web3.PublicKey(rawClendAccount.group),
232
+ balances: clendAccountBalances,
233
+ netValue: Number(rawClendAccount.netValue),
234
+ netApy: Number(rawClendAccount.netApy),
235
+ pnl: Number(rawClendAccount.pnl),
236
+ totalEmissionsApy: Number(rawClendAccount.totalEmissionsApy),
237
+ totalAssetValue: Number(rawClendAccount.totalAssetValue),
238
+ totalLiabilityValue: Number(rawClendAccount.totalLiabilityValue),
239
+ healthFactorNotional: Number(rawClendAccount.healthFactorNotional),
240
+ healthFactorRiskAdjusted: Number(
241
+ rawClendAccount.healthFactorRiskAdjusted,
242
+ ),
243
+ notionalLeverage: Number(rawClendAccount.notionalLeverage),
244
+ riskAdjustedLeverage: Number(rawClendAccount.riskAdjustedLeverage),
245
+ notionalLtv: Number(rawClendAccount.notionalLtv),
246
+ riskAdjustedLtv: Number(rawClendAccount.riskAdjustedLtv),
247
+ };
248
+
249
+ // B. Parse the associated Summary array for the account
250
+ let summary: ClendAccountTxSummary[] = [];
251
+ if (getClendAccountSummary && accountData.summary) {
252
+ summary = this.parseClendAccountSummary(accountData.summary);
253
+ }
254
+
255
+ // C. Combine the parsed account and its summary
256
+ return { clendAccount, summary };
257
+ }
258
+
113
259
  async getUser(
114
260
  user: web3.PublicKey,
115
261
  groups: web3.PublicKey[],
@@ -143,137 +289,8 @@ export class Client {
143
289
  // This is the main refactored section. It iterates through the clendAccounts array
144
290
  // from the response, which contains both the account data and its summary.
145
291
  const clendAccounts = (jsonRawResponse.clendAccounts || []).map(
146
- (accountData: any) => {
147
- // A. Parse the main ClendAccount object
148
- const rawClendAccount = accountData.clendAccount;
149
- const clendAccountBalances: ClendAccountBalance[] = (
150
- rawClendAccount.balances || []
151
- ).map((b: any) => {
152
- const liquidation: ClendAccountAssetLiquidation | null = b.liquidation
153
- ? {
154
- price: Number(b.liquidation.price),
155
- changePercentage: Number(b.liquidation.changePercentage),
156
- }
157
- : null;
158
-
159
- const emissionsOutstandingAndUnclaimed = new BN(
160
- b.emissionsOutstandingAndUnclaimed,
161
- "hex",
162
- );
163
-
164
- return {
165
- mint: new web3.PublicKey(b.mint),
166
- bank: new web3.PublicKey(b.bank),
167
- tokenYieldApy: Number(b.tokenYieldApy),
168
- assetBalance: new BN(b.assetBalance, "hex"),
169
- assetBalanceUi: Number(b.assetBalanceUi),
170
- assetValue: Number(b.assetValue),
171
- assetEmissionsApy: Number(b.assetEmissionsApy),
172
- liabilityBalance: new BN(b.liabilityBalance, "hex"),
173
- liabilityBalanceUi: Number(b.liabilityBalanceUi),
174
- liabilityValue: Number(b.liabilityValue),
175
- liabilityBorrowCostApy: Number(b.liabilityBorrowCostApy),
176
- liabilityEmissionsApy: Number(b.liabilityEmissionsApy),
177
- emissionsOutstandingAndUnclaimed,
178
- emissionsOutstandingAndUnclaimedUi: Number(
179
- b.emissionsOutstandingAndUnclaimedUi,
180
- ),
181
- price: Number(b.price),
182
- liquidation,
183
- };
184
- });
185
-
186
- const clendAccount: ClendAccount = {
187
- key: new web3.PublicKey(rawClendAccount.key),
188
- group: new web3.PublicKey(rawClendAccount.group),
189
- balances: clendAccountBalances,
190
- netValue: Number(rawClendAccount.netValue),
191
- netApy: Number(rawClendAccount.netApy),
192
- pnl: Number(rawClendAccount.pnl),
193
- totalEmissionsApy: Number(rawClendAccount.totalEmissionsApy),
194
- totalAssetValue: Number(rawClendAccount.totalAssetValue),
195
- totalLiabilityValue: Number(rawClendAccount.totalLiabilityValue),
196
- healthFactorNotional: Number(rawClendAccount.healthFactorNotional),
197
- healthFactorRiskAdjusted: Number(
198
- rawClendAccount.healthFactorRiskAdjusted,
199
- ),
200
- notionalLeverage: Number(rawClendAccount.notionalLeverage),
201
- riskAdjustedLeverage: Number(rawClendAccount.riskAdjustedLeverage),
202
- notionalLtv: Number(rawClendAccount.notionalLtv),
203
- riskAdjustedLtv: Number(rawClendAccount.riskAdjustedLtv),
204
- };
205
-
206
- // B. Parse the associated Summary array for the account
207
- let summary: ClendAccountTxSummary[] = [];
208
- if (getClendAccountSummary && accountData.summary) {
209
- summary = accountData.summary.map((s: any) => {
210
- let input: UserRequest | undefined = undefined;
211
- if (s.input) {
212
- input = {
213
- apiPath: s.input.apiPath,
214
- selectedTokenMint: s.input.selectedTokenMint
215
- ? new web3.PublicKey(s.input.selectedTokenMint)
216
- : null,
217
- amountUi: s.input.amountUi ? Number(s.input.amountUi) : null,
218
- leverage: s.input.leverage ? Number(s.input.leverage) : null,
219
- slippageBps: s.input.slippageBps
220
- ? Number(s.input.slippageBps)
221
- : null,
222
- openPosition:
223
- s.input.openPosition != null
224
- ? Boolean(s.input.openPosition)
225
- : null,
226
- closePosition:
227
- s.input.closePosition != null
228
- ? Boolean(s.input.closePosition)
229
- : null,
230
- };
231
- }
232
-
233
- const events: ClendAccountEvent[] = (s.events || []).map(
234
- (event: any) => {
235
- let closeBalance: boolean | null = null;
236
- // Only convert to boolean if the value is not null/undefined to preserve the null state.
237
- if (
238
- event.closeBalance !== null &&
239
- event.closeBalance !== undefined
240
- ) {
241
- closeBalance = Boolean(event.closeBalance);
242
- }
243
-
244
- return {
245
- eventIndex: event.eventIndex,
246
- eventName: event.eventName,
247
- bank: event.bank ? new web3.PublicKey(event.bank) : null,
248
- mint: event.mint ? new web3.PublicKey(event.mint) : null,
249
- amount: event.amount ? new BN(event.amount, "hex") : null,
250
- amountUi: event.amountUi ? Number(event.amountUi) : null,
251
- value: event.value ? Number(event.value) : null,
252
- price: event.price ? Number(event.price) : null,
253
- closeBalance,
254
- };
255
- },
256
- );
257
-
258
- const txSummary: ClendAccountTxSummary = {
259
- txSig: s.txSig,
260
- time: s.time,
261
- clendAccount: new web3.PublicKey(s.clendAccount),
262
- clendAccountAuthority: new web3.PublicKey(
263
- s.clendAccountAuthority,
264
- ),
265
- clendGroup: new web3.PublicKey(s.clendGroup),
266
- action: s.action,
267
- input,
268
- events,
269
- };
270
- return txSummary;
271
- });
272
- }
273
-
274
- // C. Combine the parsed account and its summary
275
- return { clendAccount, summary };
276
- },
292
+ (accountData: any) =>
293
+ this.parseClendAccountWithSummary(accountData, getClendAccountSummary),
277
294
  );
278
295
 
279
296
  // 3. Return the final, correctly structured response object.
@@ -360,61 +377,6 @@ export class Client {
360
377
  return response;
361
378
  }
362
379
 
363
- async deposit(
364
- clendGroup: web3.PublicKey,
365
- clendAccount: web3.PublicKey | null,
366
- inputTokenMint: web3.PublicKey,
367
- uiAmount: number,
368
- ): Promise<string> {
369
- const req: DepositRequest = {
370
- owner: this.address(),
371
- clendGroup,
372
- clendAccount,
373
- inputTokenMint,
374
- depositAmountUi: uiAmount,
375
- };
376
-
377
- const body = await handleApiCall(() =>
378
- this.http.post("deposit", JSON.stringify(req)),
379
- );
380
-
381
- const depositResponse: DepositResponse = JSON.parse(body);
382
-
383
- const txSig = await this.send(
384
- depositResponse.unsignedBase64Tx,
385
- depositResponse.userRequestId,
386
- );
387
-
388
- return txSig;
389
- }
390
-
391
- async withdraw(
392
- clendAccount: web3.PublicKey,
393
- outputTokenMint: web3.PublicKey,
394
- uiAmount: number,
395
- withdrawAll: boolean,
396
- ): Promise<string> {
397
- const req: WithdrawRequest = {
398
- clendAccount,
399
- outputTokenMint,
400
- withdrawAmountUi: uiAmount,
401
- withdrawAll,
402
- };
403
-
404
- const body = await handleApiCall(() =>
405
- this.http.post("withdraw", JSON.stringify(req)),
406
- );
407
-
408
- const withdrawResponse: WithdrawResponse = JSON.parse(body);
409
-
410
- const txSig = await this.send(
411
- withdrawResponse.unsignedBase64Tx,
412
- withdrawResponse.userRequestId,
413
- );
414
-
415
- return txSig;
416
- }
417
-
418
380
  /**
419
381
  * Deposit collateral and create a leveraged position
420
382
  * @param request Deposit leverage request parameters
package/src/types.ts CHANGED
@@ -6,37 +6,6 @@ export interface SendRequest {
6
6
  txns: string[];
7
7
  }
8
8
 
9
- /**
10
- * Request to deposit collateral
11
- */
12
- export interface DepositRequest {
13
- owner: web3.PublicKey;
14
- clendGroup: web3.PublicKey;
15
- clendAccount: web3.PublicKey | null;
16
- inputTokenMint: web3.PublicKey;
17
- depositAmountUi: number;
18
- }
19
-
20
- export interface DepositResponse {
21
- userRequestId: string;
22
- unsignedBase64Tx: string;
23
- }
24
-
25
- /**
26
- * Request to withdraw collateral
27
- */
28
- export interface WithdrawRequest {
29
- clendAccount: web3.PublicKey;
30
- outputTokenMint: web3.PublicKey;
31
- withdrawAmountUi: number;
32
- withdrawAll: boolean;
33
- }
34
-
35
- export interface WithdrawResponse {
36
- userRequestId: string;
37
- unsignedBase64Tx: string;
38
- }
39
-
40
9
  /**
41
10
  * Request to deposit collateral and create a leveraged position
42
11
  */
@@ -129,6 +98,16 @@ export interface GroupAndBanks {
129
98
  banks: Bank[];
130
99
  }
131
100
 
101
+ export interface GetAccountRequest {
102
+ account: web3.PublicKey;
103
+ getClendAccountSummary: boolean;
104
+ }
105
+
106
+ export interface GetAccountResponse {
107
+ clendAccount: ClendAccount;
108
+ summary: ClendAccountTxSummary[];
109
+ }
110
+
132
111
  export interface GetUserRequest {
133
112
  groups: web3.PublicKey[];
134
113
  user: web3.PublicKey;