@kasarlabs/vesu-mcp 0.1.3 → 0.1.4

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 (84) hide show
  1. package/build/index.js +86 -6
  2. package/build/index.js.map +1 -1
  3. package/build/interfaces/index.d.ts +661 -8
  4. package/build/interfaces/index.js +57 -1
  5. package/build/interfaces/index.js.map +1 -1
  6. package/build/lib/abis/ekuboCore.d.ts +92 -0
  7. package/build/lib/abis/ekuboCore.js +1341 -0
  8. package/build/lib/abis/ekuboCore.js.map +1 -0
  9. package/build/lib/abis/multiplyAbi.d.ts +245 -0
  10. package/build/lib/abis/multiplyAbi.js +341 -0
  11. package/build/lib/abis/multiplyAbi.js.map +1 -0
  12. package/build/lib/abis/poolAbi.d.ts +289 -0
  13. package/build/lib/abis/poolAbi.js +402 -0
  14. package/build/lib/abis/poolAbi.js.map +1 -0
  15. package/build/lib/abis/routerAbi.d.ts +88 -0
  16. package/build/lib/abis/routerAbi.js +86 -0
  17. package/build/lib/abis/routerAbi.js.map +1 -0
  18. package/build/lib/constants/index.d.ts +9 -3
  19. package/build/lib/constants/index.js +8 -3
  20. package/build/lib/constants/index.js.map +1 -1
  21. package/build/lib/utils/contracts.d.ts +535 -89
  22. package/build/lib/utils/contracts.js +39 -5
  23. package/build/lib/utils/contracts.js.map +1 -1
  24. package/build/lib/utils/ekubo.d.ts +55 -0
  25. package/build/lib/utils/ekubo.js +81 -0
  26. package/build/lib/utils/ekubo.js.map +1 -0
  27. package/build/lib/utils/getEkuboQuote.d.ts +4 -0
  28. package/build/lib/utils/getEkuboQuote.js +116 -0
  29. package/build/lib/utils/getEkuboQuote.js.map +1 -0
  30. package/build/lib/utils/math.d.ts +8 -0
  31. package/build/lib/utils/math.js +22 -0
  32. package/build/lib/utils/math.js.map +1 -0
  33. package/build/lib/utils/multiplyCalls.d.ts +10 -0
  34. package/build/lib/utils/multiplyCalls.js +248 -0
  35. package/build/lib/utils/multiplyCalls.js.map +1 -0
  36. package/build/lib/utils/pools.d.ts +8 -0
  37. package/build/lib/utils/pools.js +72 -0
  38. package/build/lib/utils/pools.js.map +1 -0
  39. package/build/lib/utils/tokens.d.ts +6 -0
  40. package/build/lib/utils/tokens.js +23 -0
  41. package/build/lib/utils/tokens.js.map +1 -0
  42. package/build/schemas/index.d.ts +176 -0
  43. package/build/schemas/index.js +201 -1
  44. package/build/schemas/index.js.map +1 -1
  45. package/build/tools/read/getPools.d.ts +3 -0
  46. package/build/tools/read/getPools.js +57 -0
  47. package/build/tools/read/getPools.js.map +1 -0
  48. package/build/tools/read/getPositions.d.ts +3 -0
  49. package/build/tools/read/getPositions.js +43 -0
  50. package/build/tools/read/getPositions.js.map +1 -0
  51. package/build/tools/read/getTokens.d.ts +3 -0
  52. package/build/tools/read/getTokens.js +50 -0
  53. package/build/tools/read/getTokens.js.map +1 -0
  54. package/build/tools/write/deposit_borrow.d.ts +10 -0
  55. package/build/tools/write/deposit_borrow.js +312 -0
  56. package/build/tools/write/deposit_borrow.js.map +1 -0
  57. package/build/tools/write/deposit_earn.d.ts +10 -0
  58. package/build/tools/write/deposit_earn.js +82 -0
  59. package/build/tools/write/deposit_earn.js.map +1 -0
  60. package/build/tools/write/deposit_multiply.d.ts +10 -0
  61. package/build/tools/write/deposit_multiply.js +140 -0
  62. package/build/tools/write/deposit_multiply.js.map +1 -0
  63. package/build/tools/write/repay_borrow.d.ts +10 -0
  64. package/build/tools/write/repay_borrow.js +358 -0
  65. package/build/tools/write/repay_borrow.js.map +1 -0
  66. package/build/tools/write/update_multiply.d.ts +10 -0
  67. package/build/tools/write/update_multiply.js +264 -0
  68. package/build/tools/write/update_multiply.js.map +1 -0
  69. package/build/tools/write/withdraw_earn.d.ts +10 -0
  70. package/build/tools/write/withdraw_earn.js +116 -0
  71. package/build/tools/write/withdraw_earn.js.map +1 -0
  72. package/build/tools/write/withdraw_multiply.d.ts +9 -0
  73. package/build/tools/write/withdraw_multiply.js +187 -0
  74. package/build/tools/write/withdraw_multiply.js.map +1 -0
  75. package/package.json +6 -5
  76. package/build/lib/abis/erc20Abi.d.ts +0 -89
  77. package/build/lib/abis/erc20Abi.js +0 -128
  78. package/build/lib/abis/erc20Abi.js.map +0 -1
  79. package/build/tools/depositService.d.ts +0 -19
  80. package/build/tools/depositService.js +0 -117
  81. package/build/tools/depositService.js.map +0 -1
  82. package/build/tools/withdrawService.d.ts +0 -20
  83. package/build/tools/withdrawService.js +0 -122
  84. package/build/tools/withdrawService.js.map +0 -1
@@ -0,0 +1,264 @@
1
+ import { Account } from 'starknet';
2
+ import { GENESIS_POOLID, VESU_API_URL } from '../../lib/constants/index.js';
3
+ import { toBN } from '../../lib/utils/num.js';
4
+ import { getPool } from '../../lib/utils/pools.js';
5
+ import { getEkuboQuoteFromAPI, } from '../../lib/utils/ekubo.js';
6
+ import { getPoolContract, } from '../../lib/utils/contracts.js';
7
+ import { getDecreaseMultiplierCalls, getIncreaseMultiplierCalls, } from '../../lib/utils/multiplyCalls.js';
8
+ import { DEFAULT_DECIMALS, } from '../../lib/constants/index.js';
9
+ import { z } from 'zod';
10
+ import { computeCandD_from_T_and_N_wad } from '../../lib/utils/math.js';
11
+ const ZERO_BI = { value: 0n, decimals: DEFAULT_DECIMALS };
12
+ export class UpdateMultiplyService {
13
+ constructor(env, walletAddress) {
14
+ this.env = env;
15
+ this.walletAddress = walletAddress;
16
+ }
17
+ async updateMultiplyTransaction(params, env) {
18
+ try {
19
+ const account = new Account({
20
+ provider: this.env.provider,
21
+ address: this.walletAddress,
22
+ signer: this.env.account.signer,
23
+ });
24
+ const poolId = (params.poolId || GENESIS_POOLID);
25
+ const pool = await getPool(poolId);
26
+ if (pool.protocolVersion !== 'v2') {
27
+ throw new Error(`Multiply operations are only supported on v2 pools. This pool is ${pool.protocolVersion}`);
28
+ }
29
+ const poolContractAddress = poolId;
30
+ const collateralAsset = pool.assets.find((a) => a.symbol.toUpperCase() === params.collateralTokenSymbol.toUpperCase());
31
+ const debtAsset = pool.assets.find((a) => a.symbol.toUpperCase() === params.debtTokenSymbol.toUpperCase());
32
+ if (!collateralAsset) {
33
+ throw new Error('Collateral asset not found in pool');
34
+ }
35
+ if (!debtAsset) {
36
+ throw new Error('Debt asset not found in pool');
37
+ }
38
+ const poolContract = getPoolContract(poolContractAddress);
39
+ const pairConfig = await poolContract.pair_config(collateralAsset.address, debtAsset.address);
40
+ const ltvPercent = BigInt(params.targetLTV);
41
+ if (ltvPercent >= 100n || ltvPercent < 0n) {
42
+ throw new Error('Target LTV must be between 0 and 99');
43
+ }
44
+ const targetLTVValue = ltvPercent * 100n;
45
+ const targetLTVWithDecimals = ltvPercent * 10n ** 16n;
46
+ const maxLTVValue = toBN(pairConfig.max_ltv);
47
+ if (targetLTVValue > maxLTVValue) {
48
+ const maxLTVPercent = Number(maxLTVValue) / 100;
49
+ throw new Error(`Target LTV (${params.targetLTV}%) exceeds maximum LTV (${maxLTVPercent}%)`);
50
+ }
51
+ let currentLTV;
52
+ let currentCollateral;
53
+ let currentDebt;
54
+ let currentCollateralValueUSD;
55
+ let currentDebtValueUSD;
56
+ try {
57
+ const queryParams = new URLSearchParams();
58
+ queryParams.append('walletAddress', account.address);
59
+ queryParams.append('type', 'multiply');
60
+ const response = await fetch(`${VESU_API_URL}/positions?${queryParams.toString()}`);
61
+ if (!response.ok) {
62
+ throw new Error(`API request failed with status ${response.status}`);
63
+ }
64
+ const data = await response.json();
65
+ const positionsSchema = z.object({
66
+ data: z.array(z
67
+ .object({
68
+ type: z.string(),
69
+ pool: z.object({
70
+ id: z.string(),
71
+ }),
72
+ collateral: z
73
+ .object({
74
+ symbol: z.string(),
75
+ value: z.string(),
76
+ decimals: z.number(),
77
+ usdPrice: z
78
+ .object({
79
+ value: z.string(),
80
+ decimals: z.number(),
81
+ })
82
+ .optional(),
83
+ })
84
+ .optional(),
85
+ debt: z
86
+ .object({
87
+ symbol: z.string(),
88
+ value: z.string(),
89
+ decimals: z.number(),
90
+ usdPrice: z
91
+ .object({
92
+ value: z.string(),
93
+ decimals: z.number(),
94
+ })
95
+ .optional(),
96
+ })
97
+ .optional(),
98
+ ltv: z
99
+ .object({
100
+ current: z.object({
101
+ value: z.string(),
102
+ decimals: z.number(),
103
+ }),
104
+ })
105
+ .optional(),
106
+ nominalDebt: z
107
+ .object({
108
+ value: z.string(),
109
+ decimals: z.number(),
110
+ })
111
+ .optional(),
112
+ })
113
+ .passthrough()),
114
+ });
115
+ const parsedData = positionsSchema.parse(data);
116
+ const positions = parsedData.data;
117
+ const matchingPosition = positions.find((position) => {
118
+ if (position.type !== 'multiply')
119
+ return false;
120
+ return (position.pool.id === poolId &&
121
+ position.collateral?.symbol.toUpperCase() ===
122
+ params.collateralTokenSymbol.toUpperCase() &&
123
+ position.debt?.symbol.toUpperCase() ===
124
+ params.debtTokenSymbol.toUpperCase());
125
+ });
126
+ if (!matchingPosition) {
127
+ throw new Error('No matching multiply position found');
128
+ }
129
+ if (!matchingPosition.ltv || !matchingPosition.ltv.current) {
130
+ throw new Error('No current LTV found in position');
131
+ }
132
+ currentLTV = BigInt(matchingPosition.ltv.current.value);
133
+ if (!matchingPosition.nominalDebt ||
134
+ !matchingPosition.nominalDebt.value) {
135
+ throw new Error('No nominalDebt found in position');
136
+ }
137
+ currentDebt = BigInt(matchingPosition.nominalDebt.value);
138
+ if (!matchingPosition.collateral ||
139
+ !matchingPosition.collateral.value) {
140
+ throw new Error('No collateral found in position');
141
+ }
142
+ currentCollateral = BigInt(matchingPosition.collateral.value);
143
+ if (!matchingPosition.collateral?.usdPrice ||
144
+ !matchingPosition.collateral.usdPrice.value) {
145
+ throw new Error('No collateral usdPrice found in position');
146
+ }
147
+ if (!matchingPosition.debt?.usdPrice ||
148
+ !matchingPosition.debt.usdPrice.value) {
149
+ throw new Error('No debt usdPrice found in position');
150
+ }
151
+ currentCollateralValueUSD = BigInt(matchingPosition.collateral.usdPrice.value);
152
+ currentDebtValueUSD = BigInt(matchingPosition.debt.usdPrice.value);
153
+ }
154
+ catch (error) {
155
+ throw new Error(`Failed to get position data: ${error instanceof Error ? error.message : 'Unknown error'}`);
156
+ }
157
+ if (currentLTV === targetLTVWithDecimals) {
158
+ throw new Error(`Position LTV is already at target (${params.targetLTV}%)`);
159
+ }
160
+ const netValue = currentCollateralValueUSD - currentDebtValueUSD;
161
+ const isIncreasing = currentLTV < targetLTVWithDecimals;
162
+ const result_cd = computeCandD_from_T_and_N_wad(netValue, targetLTVWithDecimals, currentDebtValueUSD);
163
+ const collateralPrice = await poolContract.price(collateralAsset.address);
164
+ const debtPrice = await poolContract.price(debtAsset.address);
165
+ if (!collateralPrice.is_valid || !debtPrice.is_valid) {
166
+ throw new Error('Invalid price data for assets');
167
+ }
168
+ if (!result_cd || result_cd.deltaDebtWad === undefined) {
169
+ throw new Error('Cannot calculate deltaDebtTokenAmount: result_cd or deltaDebtWad is undefined');
170
+ }
171
+ const collateralPriceBN = toBN(collateralPrice.value);
172
+ if (collateralPriceBN === 0n) {
173
+ throw new Error('Collateral price is zero, cannot calculate deltaDebtTokenAmount');
174
+ }
175
+ const deltaDebtTokenAmountRaw = (result_cd.deltaDebtWad * 10n ** BigInt(collateralAsset.decimals)) /
176
+ collateralPriceBN;
177
+ const deltaDebtTokenAmount = deltaDebtTokenAmountRaw < 0n
178
+ ? -deltaDebtTokenAmountRaw
179
+ : deltaDebtTokenAmountRaw;
180
+ const provider = env.provider;
181
+ const wallet = env.account;
182
+ const slippageBps = BigInt(params.ekuboSlippage ?? 50);
183
+ let ekuboQuote = undefined;
184
+ if (result_cd && result_cd.deltaDebtWad !== undefined) {
185
+ ekuboQuote = await getEkuboQuoteFromAPI(provider, collateralAsset, debtAsset, deltaDebtTokenAmount, isIncreasing ? false : true);
186
+ }
187
+ let callsData;
188
+ if (isIncreasing) {
189
+ callsData = await getIncreaseMultiplierCalls(collateralAsset, debtAsset, poolContractAddress, account, provider, ekuboQuote, deltaDebtTokenAmount, slippageBps);
190
+ }
191
+ else {
192
+ const quotedAmount = {
193
+ value: deltaDebtTokenAmount,
194
+ decimals: debtAsset.decimals,
195
+ };
196
+ const slippage = {
197
+ value: slippageBps,
198
+ decimals: 4,
199
+ };
200
+ callsData = await getDecreaseMultiplierCalls(collateralAsset, debtAsset, poolContractAddress, account, provider, ekuboQuote, quotedAmount, slippage);
201
+ }
202
+ const calls = callsData.map((call) => ({
203
+ contractAddress: call.contractAddress,
204
+ entrypoint: call.entrypoint,
205
+ calldata: call.calldata,
206
+ }));
207
+ const tx = await wallet.execute(calls);
208
+ await provider.waitForTransaction(tx.transaction_hash);
209
+ const result = {
210
+ status: 'success',
211
+ collateralSymbol: params.collateralTokenSymbol,
212
+ debtSymbol: params.debtTokenSymbol,
213
+ targetLTV: params.targetLTV,
214
+ recipient_address: account.address,
215
+ transaction_hash: tx.transaction_hash,
216
+ };
217
+ return result;
218
+ }
219
+ catch (error) {
220
+ return {
221
+ status: 'failure',
222
+ error: error instanceof Error ? error.message : 'Unknown error',
223
+ };
224
+ }
225
+ }
226
+ }
227
+ export const createUpdateMultiplyService = (env, walletAddress) => {
228
+ if (!walletAddress) {
229
+ throw new Error('Wallet address not configured');
230
+ }
231
+ return new UpdateMultiplyService(env, walletAddress);
232
+ };
233
+ export const updateMultiplyPosition = async (env, params) => {
234
+ const accountAddress = env.account?.address;
235
+ try {
236
+ const updateMultiplyService = createUpdateMultiplyService(env, accountAddress);
237
+ const result = await updateMultiplyService.updateMultiplyTransaction(params, env);
238
+ if (result.status === 'success') {
239
+ return {
240
+ status: 'success',
241
+ data: {
242
+ collateralSymbol: result.collateralSymbol,
243
+ debtSymbol: result.debtSymbol,
244
+ targetLTV: result.targetLTV,
245
+ recipient_address: result.recipient_address,
246
+ transaction_hash: result.transaction_hash,
247
+ },
248
+ };
249
+ }
250
+ else {
251
+ return {
252
+ status: 'failure',
253
+ error: result.error || 'Unknown error',
254
+ };
255
+ }
256
+ }
257
+ catch (error) {
258
+ return {
259
+ status: 'failure',
260
+ error: error instanceof Error ? error.message : 'Unknown error',
261
+ };
262
+ }
263
+ };
264
+ //# sourceMappingURL=update_multiply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update_multiply.js","sourceRoot":"","sources":["../../../src/tools/write/update_multiply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { WithdrawParams, WithdrawResult } from '../../interfaces/index.js';
2
+ import { onchainWrite, toolResult } from '@kasarlabs/ask-starknet-core';
3
+ export declare class WithdrawEarnService {
4
+ private env;
5
+ private walletAddress;
6
+ constructor(env: onchainWrite, walletAddress: string);
7
+ withdrawEarnTransaction(params: WithdrawParams, env: onchainWrite): Promise<WithdrawResult>;
8
+ }
9
+ export declare const withdrawService: (env: onchainWrite, walletAddress?: string) => WithdrawEarnService;
10
+ export declare const withdrawEarnPosition: (env: onchainWrite, params: WithdrawParams) => Promise<toolResult>;
@@ -0,0 +1,116 @@
1
+ import { Account, Contract } from 'starknet';
2
+ import { GENESIS_POOLID } from '../../lib/constants/index.js';
3
+ import { toU256, toBN } from '../../lib/utils/num.js';
4
+ import { vTokenAbi } from '../../lib/abis/vTokenAbi.js';
5
+ import { getPool } from '../../lib/utils/pools.js';
6
+ import { formatTokenAmount } from '../../lib/utils/tokens.js';
7
+ export class WithdrawEarnService {
8
+ constructor(env, walletAddress) {
9
+ this.env = env;
10
+ this.walletAddress = walletAddress;
11
+ }
12
+ async withdrawEarnTransaction(params, env) {
13
+ try {
14
+ const account = new Account({
15
+ provider: this.env.provider,
16
+ address: this.walletAddress,
17
+ signer: this.env.account.signer,
18
+ });
19
+ const poolId = params.poolId || GENESIS_POOLID;
20
+ const pool = await getPool(poolId);
21
+ const collateralPoolAsset = pool.assets.find((a) => a.symbol.toUpperCase() === params.withdrawTokenSymbol.toUpperCase());
22
+ if (!collateralPoolAsset) {
23
+ throw new Error('Collateral asset not found in pool');
24
+ }
25
+ const vtokenContract = new Contract({
26
+ abi: vTokenAbi,
27
+ address: collateralPoolAsset.vToken.address,
28
+ providerOrAccount: env.provider,
29
+ }).typedv2(vTokenAbi);
30
+ const vTokenShares = await vtokenContract
31
+ .balance_of(account.address)
32
+ .then((result) => toBN(result))
33
+ .catch((error) => {
34
+ throw new Error(`Failed to get vToken balance: ${error.message}`);
35
+ });
36
+ let amountToWithdraw;
37
+ if (params.withdrawAmount && params.withdrawAmount !== '0') {
38
+ const formattedAmount = formatTokenAmount(params.withdrawAmount, collateralPoolAsset.decimals);
39
+ const assetsAmount = BigInt(formattedAmount);
40
+ const sharesNeeded = await vtokenContract
41
+ .convert_to_shares(toU256(assetsAmount))
42
+ .then((result) => toBN(result))
43
+ .catch(() => {
44
+ throw new Error('Failed to convert assets to shares');
45
+ });
46
+ if (sharesNeeded > vTokenShares) {
47
+ throw new Error(`Insufficient balance. Available shares: ${vTokenShares}, Required shares: ${sharesNeeded}`);
48
+ }
49
+ amountToWithdraw = sharesNeeded;
50
+ }
51
+ else {
52
+ amountToWithdraw = vTokenShares;
53
+ }
54
+ const provider = env.provider;
55
+ const wallet = env.account;
56
+ const redeemVTokenCall = await vtokenContract.populateTransaction.redeem(toU256(amountToWithdraw), account.address, account.address);
57
+ const tx = await wallet.execute([
58
+ {
59
+ contractAddress: redeemVTokenCall.contractAddress,
60
+ entrypoint: redeemVTokenCall.entrypoint,
61
+ calldata: redeemVTokenCall.calldata,
62
+ },
63
+ ]);
64
+ await provider.waitForTransaction(tx.transaction_hash);
65
+ const transferResult = {
66
+ status: 'success',
67
+ symbol: params.withdrawTokenSymbol,
68
+ recipient_address: account.address,
69
+ transaction_hash: tx.transaction_hash,
70
+ };
71
+ return transferResult;
72
+ }
73
+ catch (error) {
74
+ return {
75
+ status: 'failure',
76
+ error: error instanceof Error ? error.message : 'Unknown error',
77
+ };
78
+ }
79
+ }
80
+ }
81
+ export const withdrawService = (env, walletAddress) => {
82
+ if (!walletAddress) {
83
+ throw new Error('Wallet address not configured');
84
+ }
85
+ return new WithdrawEarnService(env, walletAddress);
86
+ };
87
+ export const withdrawEarnPosition = async (env, params) => {
88
+ const accountAddress = env.account?.address;
89
+ try {
90
+ const withdrawEarn = withdrawService(env, accountAddress);
91
+ const result = await withdrawEarn.withdrawEarnTransaction(params, env);
92
+ if (result.status === 'success') {
93
+ return {
94
+ status: 'success',
95
+ data: {
96
+ symbol: result.symbol,
97
+ recipient_address: result.recipient_address,
98
+ transaction_hash: result.transaction_hash,
99
+ },
100
+ };
101
+ }
102
+ else {
103
+ return {
104
+ status: 'failure',
105
+ error: result.error || 'Unknown error',
106
+ };
107
+ }
108
+ }
109
+ catch (error) {
110
+ return {
111
+ status: 'failure',
112
+ error: error instanceof Error ? error.message : 'Unknown error',
113
+ };
114
+ }
115
+ };
116
+ //# sourceMappingURL=withdraw_earn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw_earn.js","sourceRoot":"","sources":["../../../src/tools/write/withdraw_earn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { WithdrawMultiplyParams, WithdrawMultiplyResult } from '../../interfaces/index.js';
2
+ import { onchainWrite, toolResult } from '@kasarlabs/ask-starknet-core';
3
+ export declare class WithdrawMultiplyService {
4
+ private walletAddress;
5
+ constructor(walletAddress: string);
6
+ withdrawMultiplyTransaction(params: WithdrawMultiplyParams, env: onchainWrite): Promise<WithdrawMultiplyResult>;
7
+ }
8
+ export declare const createWithdrawMultiplyService: (env: onchainWrite, walletAddress?: string) => WithdrawMultiplyService;
9
+ export declare const withdrawMultiplyPosition: (env: onchainWrite, params: WithdrawMultiplyParams) => Promise<toolResult>;
@@ -0,0 +1,187 @@
1
+ import { Account } from 'starknet';
2
+ import { GENESIS_POOLID, VESU_API_URL } from '../../lib/constants/index.js';
3
+ import { getPool } from '../../lib/utils/pools.js';
4
+ import { getEkuboQuoteFromAPI, } from '../../lib/utils/ekubo.js';
5
+ import { buildCloseMultiplyCalls, buildWithdrawMultiplyCalls, } from '../../lib/utils/multiplyCalls.js';
6
+ import { formatTokenAmount } from '../../lib/utils/tokens.js';
7
+ import { z } from 'zod';
8
+ export class WithdrawMultiplyService {
9
+ constructor(walletAddress) {
10
+ this.walletAddress = walletAddress;
11
+ }
12
+ async withdrawMultiplyTransaction(params, env) {
13
+ try {
14
+ const account = new Account({
15
+ provider: env.provider,
16
+ address: this.walletAddress,
17
+ signer: env.account.signer,
18
+ });
19
+ const poolId = (params.poolId || GENESIS_POOLID);
20
+ const pool = await getPool(poolId);
21
+ if (pool.protocolVersion !== 'v2') {
22
+ throw new Error(`Multiply operations are only supported on v2 pools. This pool is ${pool.protocolVersion}`);
23
+ }
24
+ const poolContractAddress = poolId;
25
+ const collateralAsset = pool.assets.find((a) => a.symbol.toUpperCase() === params.collateralTokenSymbol.toUpperCase());
26
+ const debtAsset = pool.assets.find((a) => a.symbol.toUpperCase() === params.debtTokenSymbol.toUpperCase());
27
+ if (!collateralAsset) {
28
+ throw new Error('Collateral asset not found in pool');
29
+ }
30
+ if (!debtAsset) {
31
+ throw new Error('Debt asset not found in pool');
32
+ }
33
+ const provider = env.provider;
34
+ const wallet = env.account;
35
+ const slippageBps = BigInt(params.ekuboSlippage ?? 50);
36
+ let debtAmount;
37
+ try {
38
+ const queryParams = new URLSearchParams();
39
+ queryParams.append('walletAddress', account.address);
40
+ queryParams.append('type', 'multiply');
41
+ const response = await fetch(`${VESU_API_URL}/positions?${queryParams.toString()}`);
42
+ if (!response.ok) {
43
+ throw new Error(`API request failed with status ${response.status}`);
44
+ }
45
+ const data = await response.json();
46
+ const positionsSchema = z.object({
47
+ data: z.array(z
48
+ .object({
49
+ type: z.string(),
50
+ pool: z.object({
51
+ id: z.string(),
52
+ }),
53
+ collateral: z
54
+ .object({
55
+ symbol: z.string(),
56
+ })
57
+ .optional(),
58
+ debt: z
59
+ .object({
60
+ symbol: z.string(),
61
+ })
62
+ .optional(),
63
+ nominalDebt: z
64
+ .object({
65
+ value: z.string(),
66
+ decimals: z.number(),
67
+ })
68
+ .optional(),
69
+ })
70
+ .passthrough()),
71
+ });
72
+ const parsedData = positionsSchema.parse(data);
73
+ const positions = parsedData.data;
74
+ const matchingPosition = positions.find((position) => {
75
+ if (position.type !== 'multiply')
76
+ return false;
77
+ return (position.pool.id === poolId &&
78
+ position.collateral?.symbol.toUpperCase() ===
79
+ params.collateralTokenSymbol.toUpperCase() &&
80
+ position.debt?.symbol.toUpperCase() ===
81
+ params.debtTokenSymbol.toUpperCase());
82
+ });
83
+ if (!matchingPosition) {
84
+ throw new Error('No matching multiply position found');
85
+ }
86
+ if (!matchingPosition.nominalDebt ||
87
+ !matchingPosition.nominalDebt.value) {
88
+ throw new Error('No nominalDebt found in position');
89
+ }
90
+ debtAmount = BigInt(matchingPosition.nominalDebt.value);
91
+ }
92
+ catch (error) {
93
+ throw new Error(`Failed to get position data: ${error instanceof Error ? error.message : 'Unknown error'}`);
94
+ }
95
+ const shouldClosePosition = !params.withdrawAmount || params.withdrawAmount === '0';
96
+ if (shouldClosePosition && debtAmount === 0n) {
97
+ throw new Error('Position has no debt to close');
98
+ }
99
+ let ekuboQuote = undefined;
100
+ if (shouldClosePosition) {
101
+ try {
102
+ ekuboQuote = await getEkuboQuoteFromAPI(provider, debtAsset, collateralAsset, debtAmount, false);
103
+ }
104
+ catch (error) {
105
+ console.error('ERROR while getting Ekubo quote:', error);
106
+ console.warn('Failed to get Ekubo quote from API, continuing without swap routing:', error);
107
+ ekuboQuote = undefined;
108
+ }
109
+ }
110
+ let callsData;
111
+ if (shouldClosePosition) {
112
+ callsData = await buildCloseMultiplyCalls(collateralAsset, debtAsset, poolContractAddress, account, provider, ekuboQuote, slippageBps);
113
+ }
114
+ else {
115
+ if (!params.withdrawAmount) {
116
+ throw new Error('withdrawAmount is required for withdraw operation');
117
+ }
118
+ const formattedAmount = formatTokenAmount(params.withdrawAmount, collateralAsset.decimals);
119
+ const withdrawAmountBigInt = BigInt(formattedAmount);
120
+ const withdrawAmountValue = {
121
+ value: withdrawAmountBigInt,
122
+ decimals: collateralAsset.decimals,
123
+ };
124
+ callsData = await buildWithdrawMultiplyCalls(collateralAsset, debtAsset, poolContractAddress, account, provider, withdrawAmountValue);
125
+ }
126
+ const calls = callsData.map((call) => ({
127
+ contractAddress: call.contractAddress,
128
+ entrypoint: call.entrypoint,
129
+ calldata: call.calldata,
130
+ }));
131
+ const tx = await wallet.execute(calls);
132
+ await provider.waitForTransaction(tx.transaction_hash);
133
+ const result = {
134
+ status: 'success',
135
+ collateralSymbol: params.collateralTokenSymbol,
136
+ debtSymbol: params.debtTokenSymbol,
137
+ recipient_address: account.address,
138
+ transaction_hash: tx.transaction_hash,
139
+ };
140
+ return result;
141
+ }
142
+ catch (error) {
143
+ console.error('Detailed multiply withdraw error:', error);
144
+ return {
145
+ status: 'failure',
146
+ error: error instanceof Error ? error.message : 'Unknown error',
147
+ };
148
+ }
149
+ }
150
+ }
151
+ export const createWithdrawMultiplyService = (env, walletAddress) => {
152
+ if (!walletAddress) {
153
+ throw new Error('Wallet address not configured');
154
+ }
155
+ return new WithdrawMultiplyService(walletAddress);
156
+ };
157
+ export const withdrawMultiplyPosition = async (env, params) => {
158
+ const accountAddress = env.account?.address;
159
+ try {
160
+ const withdrawMultiplyService = createWithdrawMultiplyService(env, accountAddress);
161
+ const result = await withdrawMultiplyService.withdrawMultiplyTransaction(params, env);
162
+ if (result.status === 'success') {
163
+ return {
164
+ status: 'success',
165
+ data: {
166
+ collateralSymbol: result.collateralSymbol,
167
+ debtSymbol: result.debtSymbol,
168
+ recipient_address: result.recipient_address,
169
+ transaction_hash: result.transaction_hash,
170
+ },
171
+ };
172
+ }
173
+ else {
174
+ return {
175
+ status: 'failure',
176
+ error: result.error || 'Unknown error',
177
+ };
178
+ }
179
+ }
180
+ catch (error) {
181
+ return {
182
+ status: 'failure',
183
+ error: error instanceof Error ? error.message : 'Unknown error',
184
+ };
185
+ }
186
+ };
187
+ //# sourceMappingURL=withdraw_multiply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw_multiply.js","sourceRoot":"","sources":["../../../src/tools/write/withdraw_multiply.ts"],"names":[],"mappings":"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"}