@kasarlabs/opus-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/bin/opus-mcp.js +14 -0
  4. package/build/index.d.ts +2 -0
  5. package/build/index.js +106 -0
  6. package/build/index.js.map +1 -0
  7. package/build/interfaces/index.d.ts +49 -0
  8. package/build/interfaces/index.js +2 -0
  9. package/build/interfaces/index.js.map +1 -0
  10. package/build/lib/abis/abbotAbi.d.ts +283 -0
  11. package/build/lib/abis/abbotAbi.js +384 -0
  12. package/build/lib/abis/abbotAbi.js.map +1 -0
  13. package/build/lib/abis/erc20Abi.d.ts +197 -0
  14. package/build/lib/abis/erc20Abi.js +273 -0
  15. package/build/lib/abis/erc20Abi.js.map +1 -0
  16. package/build/lib/abis/sentinelAbi.d.ts +476 -0
  17. package/build/lib/abis/sentinelAbi.js +651 -0
  18. package/build/lib/abis/sentinelAbi.js.map +1 -0
  19. package/build/lib/abis/shrineAbi.d.ts +1426 -0
  20. package/build/lib/abis/shrineAbi.js +1937 -0
  21. package/build/lib/abis/shrineAbi.js.map +1 -0
  22. package/build/lib/constant/erc20.d.ts +3 -0
  23. package/build/lib/constant/erc20.js +34 -0
  24. package/build/lib/constant/erc20.js.map +1 -0
  25. package/build/lib/constant/index.d.ts +83 -0
  26. package/build/lib/constant/index.js +38 -0
  27. package/build/lib/constant/index.js.map +1 -0
  28. package/build/lib/dependances/types.d.ts +85 -0
  29. package/build/lib/dependances/types.js +51 -0
  30. package/build/lib/dependances/types.js.map +1 -0
  31. package/build/lib/types/index.d.ts +14 -0
  32. package/build/lib/types/index.js +2 -0
  33. package/build/lib/types/index.js.map +1 -0
  34. package/build/lib/utils/contracts.d.ts +2383 -0
  35. package/build/lib/utils/contracts.js +26 -0
  36. package/build/lib/utils/contracts.js.map +1 -0
  37. package/build/lib/utils/format.d.ts +5 -0
  38. package/build/lib/utils/format.js +11 -0
  39. package/build/lib/utils/format.js.map +1 -0
  40. package/build/lib/utils/troveManager.d.ts +27 -0
  41. package/build/lib/utils/troveManager.js +386 -0
  42. package/build/lib/utils/troveManager.js.map +1 -0
  43. package/build/schemas/index.d.ts +332 -0
  44. package/build/schemas/index.js +73 -0
  45. package/build/schemas/index.js.map +1 -0
  46. package/build/tools/borrowTrove.d.ts +11 -0
  47. package/build/tools/borrowTrove.js +19 -0
  48. package/build/tools/borrowTrove.js.map +1 -0
  49. package/build/tools/depositTrove.d.ts +11 -0
  50. package/build/tools/depositTrove.js +19 -0
  51. package/build/tools/depositTrove.js.map +1 -0
  52. package/build/tools/getters.d.ts +29 -0
  53. package/build/tools/getters.js +53 -0
  54. package/build/tools/getters.js.map +1 -0
  55. package/build/tools/openTrove.d.ts +11 -0
  56. package/build/tools/openTrove.js +19 -0
  57. package/build/tools/openTrove.js.map +1 -0
  58. package/build/tools/repayTrove.d.ts +11 -0
  59. package/build/tools/repayTrove.js +19 -0
  60. package/build/tools/repayTrove.js.map +1 -0
  61. package/build/tools/withdrawTrove.d.ts +11 -0
  62. package/build/tools/withdrawTrove.js +19 -0
  63. package/build/tools/withdrawTrove.js.map +1 -0
  64. package/package.json +44 -0
@@ -0,0 +1,26 @@
1
+ import { Contract, RpcProvider } from 'starknet';
2
+ import { abbotAbi } from '../abis/abbotAbi.js';
3
+ import { erc20Abi } from '../abis/erc20Abi.js';
4
+ import { shrineAbi } from '../abis/shrineAbi.js';
5
+ import { sentinelAbi } from '../abis/sentinelAbi.js';
6
+ import { getOpusContractAddress } from '../constant/index.js';
7
+ export const getErc20Contract = (address) => {
8
+ const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
9
+ return new Contract(erc20Abi, address, provider).typedv2(erc20Abi);
10
+ };
11
+ export const getAbbotContract = (chainId) => {
12
+ const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
13
+ const address = getOpusContractAddress({ chainId, contractName: 'abbot' });
14
+ return new Contract(abbotAbi, address, provider).typedv2(abbotAbi);
15
+ };
16
+ export const getSentinelContract = (chainId) => {
17
+ const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
18
+ const address = getOpusContractAddress({ chainId, contractName: 'sentinel' });
19
+ return new Contract(sentinelAbi, address, provider).typedv2(sentinelAbi);
20
+ };
21
+ export const getShrineContract = (chainId) => {
22
+ const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
23
+ const address = getOpusContractAddress({ chainId, contractName: 'shrine' });
24
+ return new Contract(shrineAbi, address, provider).typedv2(shrineAbi);
25
+ };
26
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/lib/utils/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAkC,EAAE,EAAE;IACrE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAkC,EAAE,EAAE;IACxE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9E,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAkC,EAAE,EAAE;IACtE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const WAD_DECIMALS = 18;
2
+ export declare const RAY_DECIMALS = 27;
3
+ type DecimalTypes = 'wad' | 'ray';
4
+ export declare function formatValue(value: bigint, type?: DecimalTypes, decimals?: number): string;
5
+ export {};
@@ -0,0 +1,11 @@
1
+ import { formatUnits } from 'ethers';
2
+ export const WAD_DECIMALS = 18;
3
+ export const RAY_DECIMALS = 27;
4
+ const CASES = {
5
+ wad: WAD_DECIMALS,
6
+ ray: RAY_DECIMALS,
7
+ };
8
+ export function formatValue(value, type = 'wad', decimals) {
9
+ return formatUnits(value, CASES[type] ?? decimals);
10
+ }
11
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/lib/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGrC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAG/B,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAI/B,MAAM,KAAK,GAAiC;IAC1C,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,YAAY;CACT,CAAC;AAEX,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,OAAqB,KAAK,EAC1B,QAAiB;IAEjB,OAAO,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Call, Contract, GetTransactionReceiptResponse } from 'starknet';
2
+ import { BorrowTroveResult, DepositTroveResult, GetBorrowFeeResult, GetTroveHealthResult, GetUserTrovesResult, OpenTroveResult, RepayTroveResult, WithdrawTroveResult } from '../../interfaces/index.js';
3
+ import { AssetBalance, AssetBalanceInput, AssetBalances, AssetBalancesInput, BorrowTroveParams, DepositTroveParams, GetTroveHealthParams, GetUserTrovesParams, OpenTroveParams, RepayTroveParams, WithdrawTroveParams } from '../../schemas/index.js';
4
+ import { onchainWrite } from '@kasarlabs/ask-starknet-core';
5
+ export declare class TroveManager {
6
+ private env;
7
+ private walletAddress;
8
+ shrine: Contract;
9
+ abbot: Contract;
10
+ sentinel: Contract;
11
+ yangs: bigint[];
12
+ constructor(env: onchainWrite, walletAddress: string);
13
+ initialize(): Promise<void>;
14
+ getUserTroves(params: GetUserTrovesParams): Promise<GetUserTrovesResult>;
15
+ getBorrowFee(): Promise<GetBorrowFeeResult>;
16
+ getTroveHealth(params: GetTroveHealthParams): Promise<GetTroveHealthResult>;
17
+ getBorrowFeeFromEvent(txReceipt: GetTransactionReceiptResponse): [string, string];
18
+ parseMaxBorrowFeePctWithCheck(borrowFeePct: string): Promise<bigint>;
19
+ parseAssetBalanceInput(assetBalanceInput: AssetBalanceInput): Promise<AssetBalance>;
20
+ prepareCollateralDeposits(collaterals: AssetBalancesInput): Promise<[AssetBalances, Call[]]>;
21
+ openTroveTransaction(params: OpenTroveParams, env: onchainWrite): Promise<OpenTroveResult>;
22
+ depositTransaction(params: DepositTroveParams, env: onchainWrite): Promise<DepositTroveResult>;
23
+ withdrawTransaction(params: WithdrawTroveParams, env: onchainWrite): Promise<WithdrawTroveResult>;
24
+ borrowTransaction(params: BorrowTroveParams, env: onchainWrite): Promise<BorrowTroveResult>;
25
+ repayTransaction(params: RepayTroveParams, env: onchainWrite): Promise<RepayTroveResult>;
26
+ }
27
+ export declare const createTroveManager: (env: onchainWrite, walletAddress?: string) => TroveManager;
@@ -0,0 +1,386 @@
1
+ import { num, } from 'starknet';
2
+ import { formatUnits, parseUnits } from 'ethers';
3
+ import { forgeFeePaidEventSchema, healthSchema, troveOpenedEventSchema, wadSchema, } from '../../schemas/index.js';
4
+ import { getAbbotContract, getErc20Contract, getSentinelContract, getShrineContract, } from './contracts.js';
5
+ import { tokenAddresses } from '../constant/erc20.js';
6
+ const FORGE_FEE_PAID_EVENT_IDENTIFIER = 'opus::core::shrine::shrine::ForgeFeePaid';
7
+ const TROVE_OPENED_EVENT_IDENTIFIER = 'opus::core::abbot::abbot::TroveOpened';
8
+ export class TroveManager {
9
+ constructor(env, walletAddress) {
10
+ this.env = env;
11
+ this.walletAddress = walletAddress;
12
+ }
13
+ async initialize() {
14
+ const chainId = await this.env.provider.getChainId();
15
+ this.shrine = getShrineContract(chainId);
16
+ this.abbot = getAbbotContract(chainId);
17
+ this.sentinel = getSentinelContract(chainId);
18
+ this.yangs = (await this.sentinel.get_yang_addresses()).map((yang) => num.toBigInt(yang));
19
+ }
20
+ async getUserTroves(params) {
21
+ await this.initialize();
22
+ try {
23
+ const troves = await this.abbot.get_user_trove_ids(params.user);
24
+ const formattedTroves = troves.map((troveId) => {
25
+ return troveId.toString();
26
+ });
27
+ const getUserTrovesResult = {
28
+ status: 'success',
29
+ troves: formattedTroves,
30
+ };
31
+ return getUserTrovesResult;
32
+ }
33
+ catch (error) {
34
+ console.error('Detailed get user troves error:', error);
35
+ if (error instanceof Error) {
36
+ console.error('Error type:', error.constructor.name);
37
+ console.error('Error message:', error.message);
38
+ console.error('Error stack:', error.stack);
39
+ }
40
+ return {
41
+ status: 'failure',
42
+ };
43
+ }
44
+ }
45
+ async getBorrowFee() {
46
+ await this.initialize();
47
+ try {
48
+ const borrowFee = wadSchema.safeParse(await this.shrine.get_forge_fee_pct());
49
+ const borrowFeePct = formatUnits(borrowFee.data.value, 16);
50
+ const getBorrowFeeResult = {
51
+ status: 'success',
52
+ borrow_fee: `${borrowFeePct}%`,
53
+ };
54
+ return getBorrowFeeResult;
55
+ }
56
+ catch (error) {
57
+ console.error('Detailed get borrow fee error:', error);
58
+ if (error instanceof Error) {
59
+ console.error('Error type:', error.constructor.name);
60
+ console.error('Error message:', error.message);
61
+ console.error('Error stack:', error.stack);
62
+ }
63
+ return {
64
+ status: 'failure',
65
+ };
66
+ }
67
+ }
68
+ async getTroveHealth(params) {
69
+ await this.initialize();
70
+ try {
71
+ const troveHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
72
+ const getTroveHealthResult = {
73
+ status: 'success',
74
+ debt: troveHealth.data?.debt.formatted,
75
+ value: troveHealth.data?.value.formatted,
76
+ ltv: troveHealth.data?.ltv.formatted,
77
+ threshold: troveHealth.data?.threshold.formatted,
78
+ };
79
+ return getTroveHealthResult;
80
+ }
81
+ catch (error) {
82
+ console.error('Detailed get trove health error:', error);
83
+ if (error instanceof Error) {
84
+ console.error('Error type:', error.constructor.name);
85
+ console.error('Error message:', error.message);
86
+ console.error('Error stack:', error.stack);
87
+ }
88
+ return {
89
+ status: 'failure',
90
+ };
91
+ }
92
+ }
93
+ getBorrowFeeFromEvent(txReceipt) {
94
+ const shrineEvents = this.shrine.parseEvents(txReceipt);
95
+ const forgeFeePaidEvent = forgeFeePaidEventSchema.safeParse(shrineEvents.find((event) => FORGE_FEE_PAID_EVENT_IDENTIFIER in event)[FORGE_FEE_PAID_EVENT_IDENTIFIER]);
96
+ return [
97
+ forgeFeePaidEvent.data.fee.formatted,
98
+ forgeFeePaidEvent.data.fee_pct.formatted,
99
+ ];
100
+ }
101
+ async parseMaxBorrowFeePctWithCheck(borrowFeePct) {
102
+ const maxBorrowFeePct = parseUnits(borrowFeePct.slice(0, -1), 16);
103
+ const currentBorrowFeePct = wadSchema.safeParse(await this.shrine.get_forge_fee_pct());
104
+ if (maxBorrowFeePct < currentBorrowFeePct.data.value) {
105
+ throw new Error(`Max borrow fee of ${borrowFeePct} is lower than current: ${currentBorrowFeePct.data.formatted}%`);
106
+ }
107
+ return maxBorrowFeePct;
108
+ }
109
+ async parseAssetBalanceInput(assetBalanceInput) {
110
+ const collateralAddress = tokenAddresses[assetBalanceInput.symbol];
111
+ if (collateralAddress === undefined) {
112
+ throw new Error(`Unknown token symbol ${assetBalanceInput.symbol}`);
113
+ }
114
+ if (!this.yangs.includes(num.toBigInt(collateralAddress))) {
115
+ throw new Error(`${collateralAddress} is not a valid collateral`);
116
+ }
117
+ const asset = getErc20Contract(collateralAddress);
118
+ const collateralDecimals = await asset.decimals();
119
+ const collateralAmount = parseUnits(assetBalanceInput.amount, collateralDecimals);
120
+ const assetBalance = {
121
+ address: collateralAddress,
122
+ amount: collateralAmount,
123
+ };
124
+ return assetBalance;
125
+ }
126
+ async prepareCollateralDeposits(collaterals) {
127
+ const assetBalances = [];
128
+ const approveAssetsCalls = [];
129
+ await Promise.all(collaterals.map(async (collateral) => {
130
+ const assetBalance = await this.parseAssetBalanceInput(collateral);
131
+ assetBalances.push(assetBalance);
132
+ const asset = getErc20Contract(assetBalance.address);
133
+ const gate = await this.sentinel.get_gate_address(assetBalance.address);
134
+ const approveCall = asset.populateTransaction.approve(gate, assetBalance.amount);
135
+ approveAssetsCalls.push({
136
+ contractAddress: approveCall.contractAddress,
137
+ entrypoint: approveCall.entrypoint,
138
+ calldata: approveCall.calldata,
139
+ });
140
+ }));
141
+ return [assetBalances, approveAssetsCalls];
142
+ }
143
+ async openTroveTransaction(params, env) {
144
+ await this.initialize();
145
+ try {
146
+ const account = this.env.account;
147
+ const [assetBalances, approveAssetsCalls] = await this.prepareCollateralDeposits(params.collaterals);
148
+ const borrowAmount = parseUnits(params.borrowAmount, 18);
149
+ const maxBorrowFeePct = await this.parseMaxBorrowFeePctWithCheck(params.maxBorrowFeePct);
150
+ const openTroveCall = await this.abbot.populateTransaction.open_trove(assetBalances, { val: borrowAmount }, { val: maxBorrowFeePct });
151
+ const tx = await account.execute([
152
+ ...approveAssetsCalls,
153
+ {
154
+ contractAddress: openTroveCall.contractAddress,
155
+ entrypoint: openTroveCall.entrypoint,
156
+ calldata: openTroveCall.calldata,
157
+ },
158
+ ]);
159
+ const provider = env.provider;
160
+ const txReceipt = await provider.waitForTransaction(tx.transaction_hash);
161
+ let troveId;
162
+ let borrowFeePaid;
163
+ let borrowFeePct;
164
+ if (txReceipt.isSuccess()) {
165
+ const abbotEvents = this.abbot.parseEvents(txReceipt);
166
+ const troveOpenedEvent = abbotEvents.find((event) => TROVE_OPENED_EVENT_IDENTIFIER in event)[TROVE_OPENED_EVENT_IDENTIFIER];
167
+ const parsedTroveOpenedEvent = troveOpenedEventSchema.safeParse(troveOpenedEvent);
168
+ troveId = parsedTroveOpenedEvent.data.trove_id.toString();
169
+ [borrowFeePaid, borrowFeePct] = this.getBorrowFeeFromEvent(txReceipt);
170
+ }
171
+ const openTroveResult = {
172
+ status: 'success',
173
+ trove_id: troveId,
174
+ borrow_fee: borrowFeePaid,
175
+ borrow_fee_pct: borrowFeePct,
176
+ transaction_hash: tx.transaction_hash,
177
+ };
178
+ return openTroveResult;
179
+ }
180
+ catch (error) {
181
+ console.error('Detailed open trove error:', error);
182
+ if (error instanceof Error) {
183
+ console.error('Error type:', error.constructor.name);
184
+ console.error('Error message:', error.message);
185
+ console.error('Error stack:', error.stack);
186
+ }
187
+ return {
188
+ status: 'failure',
189
+ error: error instanceof Error ? error.message : 'Unknown error',
190
+ };
191
+ }
192
+ }
193
+ async depositTransaction(params, env) {
194
+ await this.initialize();
195
+ try {
196
+ const account = this.env.account;
197
+ const [assetBalances, approveAssetsCalls] = await this.prepareCollateralDeposits([params.collateral]);
198
+ const depositCall = await this.abbot.populateTransaction.deposit(params.troveId, assetBalances[0]);
199
+ const beforeHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
200
+ const tx = await account.execute([
201
+ ...approveAssetsCalls,
202
+ {
203
+ contractAddress: depositCall.contractAddress,
204
+ entrypoint: depositCall.entrypoint,
205
+ calldata: depositCall.calldata,
206
+ },
207
+ ]);
208
+ const provider = this.env.provider;
209
+ const txReceipt = await provider.waitForTransaction(tx.transaction_hash);
210
+ let afterHealth;
211
+ if (txReceipt.isSuccess()) {
212
+ afterHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
213
+ }
214
+ const depositResult = {
215
+ status: 'success',
216
+ trove_id: params.troveId.toString(),
217
+ before_value: beforeHealth.data?.value.formatted,
218
+ after_value: afterHealth?.data?.value.formatted,
219
+ before_ltv: beforeHealth.data?.ltv.formatted,
220
+ after_ltv: afterHealth?.data?.ltv.formatted,
221
+ transaction_hash: tx.transaction_hash,
222
+ };
223
+ return depositResult;
224
+ }
225
+ catch (error) {
226
+ console.error('Detailed deposit error:', error);
227
+ if (error instanceof Error) {
228
+ console.error('Error type:', error.constructor.name);
229
+ console.error('Error message:', error.message);
230
+ console.error('Error stack:', error.stack);
231
+ }
232
+ return {
233
+ status: 'failure',
234
+ error: error instanceof Error ? error.message : 'Unknown error',
235
+ };
236
+ }
237
+ }
238
+ async withdrawTransaction(params, env) {
239
+ await this.initialize();
240
+ try {
241
+ const account = this.env.account;
242
+ const assetBalance = await this.parseAssetBalanceInput(params.collateral);
243
+ const depositCall = await this.abbot.populateTransaction.withdraw(params.troveId, assetBalance);
244
+ const beforeHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
245
+ const tx = await account.execute([
246
+ {
247
+ contractAddress: depositCall.contractAddress,
248
+ entrypoint: depositCall.entrypoint,
249
+ calldata: depositCall.calldata,
250
+ },
251
+ ]);
252
+ const provider = env.provider;
253
+ const txReceipt = await provider.waitForTransaction(tx.transaction_hash);
254
+ let afterHealth;
255
+ if (txReceipt.isSuccess()) {
256
+ afterHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
257
+ }
258
+ const withdrawResult = {
259
+ status: 'success',
260
+ trove_id: params.troveId.toString(),
261
+ before_value: beforeHealth.data?.value.formatted,
262
+ after_value: afterHealth?.data?.value.formatted,
263
+ before_ltv: beforeHealth.data?.ltv.formatted,
264
+ after_ltv: afterHealth?.data?.ltv.formatted,
265
+ transaction_hash: tx.transaction_hash,
266
+ };
267
+ return withdrawResult;
268
+ }
269
+ catch (error) {
270
+ console.error('Detailed withdraw error:', error);
271
+ if (error instanceof Error) {
272
+ console.error('Error type:', error.constructor.name);
273
+ console.error('Error message:', error.message);
274
+ console.error('Error stack:', error.stack);
275
+ }
276
+ return {
277
+ status: 'failure',
278
+ error: error instanceof Error ? error.message : 'Unknown error',
279
+ };
280
+ }
281
+ }
282
+ async borrowTransaction(params, env) {
283
+ await this.initialize();
284
+ try {
285
+ const account = this.env.account;
286
+ const borrowAmount = parseUnits(params.amount, 18);
287
+ const maxBorrowFeePct = await this.parseMaxBorrowFeePctWithCheck(params.maxBorrowFeePct);
288
+ const borrowCall = await this.abbot.populateTransaction.forge(params.troveId, { val: borrowAmount }, { val: maxBorrowFeePct });
289
+ const beforeHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
290
+ const tx = await account.execute([
291
+ {
292
+ contractAddress: borrowCall.contractAddress,
293
+ entrypoint: borrowCall.entrypoint,
294
+ calldata: borrowCall.calldata,
295
+ },
296
+ ]);
297
+ const provider = env.provider;
298
+ const txReceipt = await provider.waitForTransaction(tx.transaction_hash);
299
+ let afterHealth;
300
+ let borrowFeePaid;
301
+ let borrowFeePct;
302
+ if (txReceipt.isSuccess()) {
303
+ afterHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
304
+ [borrowFeePaid, borrowFeePct] = this.getBorrowFeeFromEvent(txReceipt);
305
+ }
306
+ const borrowResult = {
307
+ status: 'success',
308
+ trove_id: params.troveId.toString(),
309
+ amount: borrowAmount.toString(),
310
+ borrow_fee: borrowFeePaid,
311
+ borrow_fee_pct: borrowFeePct,
312
+ before_debt: beforeHealth.data?.debt.formatted,
313
+ after_debt: afterHealth?.data?.debt.formatted,
314
+ before_ltv: beforeHealth.data?.ltv.formatted,
315
+ after_ltv: afterHealth?.data?.ltv.formatted,
316
+ transaction_hash: tx.transaction_hash,
317
+ };
318
+ return borrowResult;
319
+ }
320
+ catch (error) {
321
+ console.error('Detailed borrow error:', error);
322
+ if (error instanceof Error) {
323
+ console.error('Error type:', error.constructor.name);
324
+ console.error('Error message:', error.message);
325
+ console.error('Error stack:', error.stack);
326
+ }
327
+ return {
328
+ status: 'failure',
329
+ error: error instanceof Error ? error.message : 'Unknown error',
330
+ };
331
+ }
332
+ }
333
+ async repayTransaction(params, env) {
334
+ await this.initialize();
335
+ try {
336
+ const account = env.account;
337
+ const repayAmount = parseUnits(params.amount, 18);
338
+ const repayCall = await this.abbot.populateTransaction.melt(params.troveId, { val: repayAmount });
339
+ const beforeHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
340
+ const tx = await account.execute([
341
+ {
342
+ contractAddress: repayCall.contractAddress,
343
+ entrypoint: repayCall.entrypoint,
344
+ calldata: repayCall.calldata,
345
+ },
346
+ ]);
347
+ const provider = env.provider;
348
+ const txReceipt = await provider.waitForTransaction(tx.transaction_hash);
349
+ let afterHealth;
350
+ if (txReceipt.isSuccess()) {
351
+ afterHealth = healthSchema.safeParse(await this.shrine.get_trove_health(params.troveId));
352
+ }
353
+ const repayResult = {
354
+ status: 'success',
355
+ trove_id: params.troveId.toString(),
356
+ amount: repayAmount.toString(),
357
+ before_debt: beforeHealth.data?.debt.formatted,
358
+ after_debt: afterHealth?.data?.debt.formatted,
359
+ before_ltv: beforeHealth.data?.ltv.formatted,
360
+ after_ltv: afterHealth?.data?.ltv.formatted,
361
+ transaction_hash: tx.transaction_hash,
362
+ };
363
+ return repayResult;
364
+ }
365
+ catch (error) {
366
+ console.error('Detailed repay error:', error);
367
+ if (error instanceof Error) {
368
+ console.error('Error type:', error.constructor.name);
369
+ console.error('Error message:', error.message);
370
+ console.error('Error stack:', error.stack);
371
+ }
372
+ return {
373
+ status: 'failure',
374
+ error: error instanceof Error ? error.message : 'Unknown error',
375
+ };
376
+ }
377
+ }
378
+ }
379
+ export const createTroveManager = (env, walletAddress) => {
380
+ if (!walletAddress) {
381
+ throw new Error('Wallet address not configured');
382
+ }
383
+ const service = new TroveManager(env, walletAddress);
384
+ return service;
385
+ };
386
+ //# sourceMappingURL=troveManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troveManager.js","sourceRoot":"","sources":["../../../src/lib/utils/troveManager.ts"],"names":[],"mappings":"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"}