@kasarlabs/vesu-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.
- package/LICENSE +21 -0
- package/README.md +28 -0
- package/bin/vesu-mcp.js +14 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +49 -0
- package/build/index.js.map +1 -0
- package/build/interfaces/index.d.ts +112 -0
- package/build/interfaces/index.js +28 -0
- package/build/interfaces/index.js.map +1 -0
- package/build/lib/abis/erc20Abi.d.ts +89 -0
- package/build/lib/abis/erc20Abi.js +128 -0
- package/build/lib/abis/erc20Abi.js.map +1 -0
- package/build/lib/abis/extensionAbi.d.ts +1397 -0
- package/build/lib/abis/extensionAbi.js +1909 -0
- package/build/lib/abis/extensionAbi.js.map +1 -0
- package/build/lib/abis/singletonAbi.d.ts +1410 -0
- package/build/lib/abis/singletonAbi.js +1914 -0
- package/build/lib/abis/singletonAbi.js.map +1 -0
- package/build/lib/abis/vTokenAbi.d.ts +561 -0
- package/build/lib/abis/vTokenAbi.js +781 -0
- package/build/lib/abis/vTokenAbi.js.map +1 -0
- package/build/lib/constants/index.d.ts +7 -0
- package/build/lib/constants/index.js +7 -0
- package/build/lib/constants/index.js.map +1 -0
- package/build/lib/dependances/types.d.ts +85 -0
- package/build/lib/dependances/types.js +51 -0
- package/build/lib/dependances/types.js.map +1 -0
- package/build/lib/utils/contracts.d.ts +3458 -0
- package/build/lib/utils/contracts.js +22 -0
- package/build/lib/utils/contracts.js.map +1 -0
- package/build/lib/utils/num.d.ts +33 -0
- package/build/lib/utils/num.js +59 -0
- package/build/lib/utils/num.js.map +1 -0
- package/build/lib/utils/processTransactions.d.ts +6 -0
- package/build/lib/utils/processTransactions.js +23 -0
- package/build/lib/utils/processTransactions.js.map +1 -0
- package/build/schemas/index.d.ts +18 -0
- package/build/schemas/index.js +13 -0
- package/build/schemas/index.js.map +1 -0
- package/build/tools/depositService.d.ts +19 -0
- package/build/tools/depositService.js +117 -0
- package/build/tools/depositService.js.map +1 -0
- package/build/tools/withdrawService.d.ts +20 -0
- package/build/tools/withdrawService.js +122 -0
- package/build/tools/withdrawService.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Contract, RpcProvider } from 'starknet';
|
|
2
|
+
import { vTokenAbi } from '../abis/vTokenAbi.js';
|
|
3
|
+
import { singletonAbi } from '../abis/singletonAbi.js';
|
|
4
|
+
import { extensionAbi } from '../abis/extensionAbi.js';
|
|
5
|
+
import { erc20Abi } from '../abis/erc20Abi.js';
|
|
6
|
+
export const getErc20Contract = (address) => {
|
|
7
|
+
const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
|
|
8
|
+
return new Contract(erc20Abi, address, provider).typedv2(erc20Abi);
|
|
9
|
+
};
|
|
10
|
+
export const getVTokenContract = (address) => {
|
|
11
|
+
const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
|
|
12
|
+
return new Contract(vTokenAbi, address, provider).typedv2(vTokenAbi);
|
|
13
|
+
};
|
|
14
|
+
export const getSingletonContract = (address) => {
|
|
15
|
+
const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
|
|
16
|
+
return new Contract(singletonAbi, address, provider).typedv2(singletonAbi);
|
|
17
|
+
};
|
|
18
|
+
export const getExtensionContract = (address) => {
|
|
19
|
+
const provider = new RpcProvider({ nodeUrl: process.env.STARKNET_RPC_URL });
|
|
20
|
+
return new Contract(extensionAbi, address, provider).typedv2(extensionAbi);
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/lib/utils/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACnD,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;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACpD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACvD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAC7E,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACvD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAC7E,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Uint256, BigNumberish as StarknetBigNumberish } from 'starknet';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare const SCALE: bigint;
|
|
4
|
+
export type Hex = `0x${string}`;
|
|
5
|
+
export declare const hexSchemaBase: z.ZodString;
|
|
6
|
+
export declare const hexSchema: z.ZodEffects<z.ZodString, `0x${string}`, string>;
|
|
7
|
+
export declare function toHex(value: BigNumberish): Hex;
|
|
8
|
+
export declare function isEqualHex(a?: Hex, b?: Hex): boolean;
|
|
9
|
+
export declare function toNumber(value: BigNumberish): number;
|
|
10
|
+
export type BigNumberish = StarknetBigNumberish | Uint256;
|
|
11
|
+
export declare function toBN(value: BigNumberish): bigint;
|
|
12
|
+
export declare const BigNumberishSchema: z.ZodUnion<[z.ZodLazy<z.ZodEffects<z.ZodEffects<z.ZodString, `0x${string}`, string>, bigint, string>>, z.ZodEffects<z.ZodNumber, bigint, number>, z.ZodEffects<z.ZodString, bigint, string>, z.ZodBigInt]>;
|
|
13
|
+
export type U256 = Uint256;
|
|
14
|
+
declare const u256Schema: z.ZodObject<{
|
|
15
|
+
low: z.ZodUnion<[z.ZodLazy<z.ZodEffects<z.ZodEffects<z.ZodString, `0x${string}`, string>, bigint, string>>, z.ZodEffects<z.ZodNumber, bigint, number>, z.ZodEffects<z.ZodString, bigint, string>, z.ZodBigInt]>;
|
|
16
|
+
high: z.ZodUnion<[z.ZodLazy<z.ZodEffects<z.ZodEffects<z.ZodString, `0x${string}`, string>, bigint, string>>, z.ZodEffects<z.ZodNumber, bigint, number>, z.ZodEffects<z.ZodString, bigint, string>, z.ZodBigInt]>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
low: bigint;
|
|
19
|
+
high: bigint;
|
|
20
|
+
}, {
|
|
21
|
+
low: string | number | bigint;
|
|
22
|
+
high: string | number | bigint;
|
|
23
|
+
}>;
|
|
24
|
+
export type SafeU256 = z.infer<typeof u256Schema>;
|
|
25
|
+
export declare function isU256(value: unknown): value is U256;
|
|
26
|
+
export declare function toU256(value: BigNumberish): SafeU256;
|
|
27
|
+
export type I257<Abs extends BigNumberish = bigint> = {
|
|
28
|
+
abs: Abs;
|
|
29
|
+
is_negative: boolean;
|
|
30
|
+
};
|
|
31
|
+
export declare function toI257(x: BigNumberish): I257;
|
|
32
|
+
export declare function fromI257(x: I257<BigNumberish>): bigint;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { num, uint256, } from 'starknet';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export const SCALE = 10n ** 18n;
|
|
4
|
+
export const hexSchemaBase = z
|
|
5
|
+
.string()
|
|
6
|
+
.regex(/^0x[a-fA-F0-9]+$/, 'Hex must be a hex string starting with 0x');
|
|
7
|
+
export const hexSchema = hexSchemaBase.transform((v) => v);
|
|
8
|
+
export function toHex(value) {
|
|
9
|
+
return hexSchema.parse(`0x${toBN(value).toString(16)}`);
|
|
10
|
+
}
|
|
11
|
+
export function isEqualHex(a, b) {
|
|
12
|
+
if (!a || !b)
|
|
13
|
+
return false;
|
|
14
|
+
return toBN(a) === toBN(b);
|
|
15
|
+
}
|
|
16
|
+
export function toNumber(value) {
|
|
17
|
+
const bn = toBN(value);
|
|
18
|
+
if (bn < Number.MIN_SAFE_INTEGER || bn > Number.MAX_SAFE_INTEGER) {
|
|
19
|
+
throw new Error(`Number out of range: ${bn}`);
|
|
20
|
+
}
|
|
21
|
+
return Number(bn);
|
|
22
|
+
}
|
|
23
|
+
export function toBN(value) {
|
|
24
|
+
return isU256(value) ? uint256.uint256ToBN(value) : num.toBigInt(value);
|
|
25
|
+
}
|
|
26
|
+
const decimalSchema = z.string().regex(/^\d+(\.\d+)?$/);
|
|
27
|
+
export const BigNumberishSchema = z.union([
|
|
28
|
+
z.lazy(() => hexSchema.transform(toBN)),
|
|
29
|
+
z.number().transform(toBN),
|
|
30
|
+
decimalSchema.transform(toBN),
|
|
31
|
+
z.bigint(),
|
|
32
|
+
]);
|
|
33
|
+
const u256Schema = z.object({
|
|
34
|
+
low: BigNumberishSchema,
|
|
35
|
+
high: BigNumberishSchema,
|
|
36
|
+
});
|
|
37
|
+
export function isU256(value) {
|
|
38
|
+
return u256Schema.safeParse(value).success;
|
|
39
|
+
}
|
|
40
|
+
export function toU256(value) {
|
|
41
|
+
if (isU256(value)) {
|
|
42
|
+
const { low, high } = value;
|
|
43
|
+
return { low: toBN(low), high: toBN(high) };
|
|
44
|
+
}
|
|
45
|
+
const { low, high } = uint256.bnToUint256(toBN(value));
|
|
46
|
+
return { low: toBN(low), high: toBN(high) };
|
|
47
|
+
}
|
|
48
|
+
export function toI257(x) {
|
|
49
|
+
const bn = toBN(x);
|
|
50
|
+
if (bn < 0n) {
|
|
51
|
+
return { abs: -bn, is_negative: true };
|
|
52
|
+
}
|
|
53
|
+
return { abs: bn, is_negative: false };
|
|
54
|
+
}
|
|
55
|
+
export function fromI257(x) {
|
|
56
|
+
const abs = toBN(x.abs);
|
|
57
|
+
return x.is_negative ? -abs : abs;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=num.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"num.js","sourceRoot":"","sources":["../../../src/lib/utils/num.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function buildTransactionCall(data) {
|
|
2
|
+
if (!data || !data.contractAddress || !data.entrypoint || !data.calldata) {
|
|
3
|
+
return undefined;
|
|
4
|
+
}
|
|
5
|
+
return {
|
|
6
|
+
contractAddress: data.contractAddress,
|
|
7
|
+
entrypoint: data.entrypoint,
|
|
8
|
+
calldata: data.calldata,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export async function processTransactionCalls(calls) {
|
|
12
|
+
const validCalls = calls
|
|
13
|
+
.map((call) => {
|
|
14
|
+
const transactionCall = buildTransactionCall(call);
|
|
15
|
+
return transactionCall;
|
|
16
|
+
})
|
|
17
|
+
.filter((call) => call !== undefined);
|
|
18
|
+
if (validCalls.length === 0) {
|
|
19
|
+
throw new Error('No valid transactions found. At least one transaction is required.');
|
|
20
|
+
}
|
|
21
|
+
return validCalls;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=processTransactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processTransactions.js","sourceRoot":"","sources":["../../../src/lib/utils/processTransactions.ts"],"names":[],"mappings":"AAEA,SAAS,oBAAoB,CAAC,IAI7B;IACC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO;QACL,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAIE;IAEF,MAAM,UAAU,GAAG,KAAK;SACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAgB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEtD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const depositEarnSchema: z.ZodObject<{
|
|
3
|
+
depositTokenSymbol: z.ZodString;
|
|
4
|
+
depositAmount: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
depositTokenSymbol: string;
|
|
7
|
+
depositAmount: string;
|
|
8
|
+
}, {
|
|
9
|
+
depositTokenSymbol: string;
|
|
10
|
+
depositAmount: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const withdrawEarnSchema: z.ZodObject<{
|
|
13
|
+
withdrawTokenSymbol: z.ZodString;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
withdrawTokenSymbol: string;
|
|
16
|
+
}, {
|
|
17
|
+
withdrawTokenSymbol: string;
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const depositEarnSchema = z.object({
|
|
3
|
+
depositTokenSymbol: z
|
|
4
|
+
.string()
|
|
5
|
+
.describe("Symbol of the token to deposit (e.g., 'ETH', 'USDC')"),
|
|
6
|
+
depositAmount: z.string().describe('Amount of tokens to deposit'),
|
|
7
|
+
});
|
|
8
|
+
export const withdrawEarnSchema = z.object({
|
|
9
|
+
withdrawTokenSymbol: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe("Symbol of the token to withdraw (e.g., 'ETH', 'USDC')"),
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,CAAC,sDAAsD,CAAC;IACnE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAClE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,mBAAmB,EAAE,CAAC;SACnB,MAAM,EAAE;SACR,QAAQ,CAAC,uDAAuD,CAAC;CACrE,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Call } from 'starknet';
|
|
2
|
+
import { Address, DepositParams, DepositResult, IBaseToken, IPool, ITokenValue } from '../interfaces/index.js';
|
|
3
|
+
import { Hex } from '../lib/utils/num.js';
|
|
4
|
+
import { onchainWrite } from '@kasarlabs/ask-starknet-core';
|
|
5
|
+
export declare class DepositEarnService {
|
|
6
|
+
private env;
|
|
7
|
+
private walletAddress;
|
|
8
|
+
constructor(env: onchainWrite, walletAddress: string);
|
|
9
|
+
getTokenPrice(token: IBaseToken, poolId: string, poolExtension: Hex): Promise<ITokenValue | undefined>;
|
|
10
|
+
private getPoolAssetsPriceAndRiskMdx;
|
|
11
|
+
getPool(poolId: string): Promise<IPool>;
|
|
12
|
+
approveVTokenCalls(assetAddress: Address, vTokenAddress: Address, amount: bigint): Promise<Call>;
|
|
13
|
+
depositEarnTransaction(params: DepositParams, env: onchainWrite): Promise<DepositResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare const createDepositEarnService: (env: onchainWrite, walletAddress?: string) => DepositEarnService;
|
|
16
|
+
export declare const depositEarnPosition: (env: onchainWrite, params: DepositParams) => Promise<DepositResult | {
|
|
17
|
+
status: string;
|
|
18
|
+
error: string;
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Account } from 'starknet';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { parseUnits } from 'ethers';
|
|
4
|
+
import { poolParser, } from '../interfaces/index.js';
|
|
5
|
+
import { DEFAULT_DECIMALS, GENESIS_POOLID, VESU_API_URL, } from '../lib/constants/index.js';
|
|
6
|
+
import { toBN, toU256 } from '../lib/utils/num.js';
|
|
7
|
+
import { getErc20Contract, getExtensionContract, getVTokenContract, } from '../lib/utils/contracts.js';
|
|
8
|
+
export class DepositEarnService {
|
|
9
|
+
constructor(env, walletAddress) {
|
|
10
|
+
this.env = env;
|
|
11
|
+
this.walletAddress = walletAddress;
|
|
12
|
+
}
|
|
13
|
+
async getTokenPrice(token, poolId, poolExtension) {
|
|
14
|
+
const contract = getExtensionContract(poolExtension);
|
|
15
|
+
try {
|
|
16
|
+
const res = await contract.price(poolId, token.address);
|
|
17
|
+
return res.is_valid && res.value
|
|
18
|
+
? { value: toBN(res.value), decimals: DEFAULT_DECIMALS }
|
|
19
|
+
: undefined;
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async getPoolAssetsPriceAndRiskMdx(poolId, poolExtensionContractAddress, poolAssets) {
|
|
26
|
+
return await Promise.all(poolAssets.map(async (asset) => {
|
|
27
|
+
const usdPrice = await this.getTokenPrice(asset, poolId, poolExtensionContractAddress);
|
|
28
|
+
return {
|
|
29
|
+
...asset,
|
|
30
|
+
risk: null,
|
|
31
|
+
usdPrice,
|
|
32
|
+
};
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
async getPool(poolId) {
|
|
36
|
+
const data = await fetch(`${VESU_API_URL}/pools/${poolId}`).then((res) => res.json());
|
|
37
|
+
const pool = z
|
|
38
|
+
.object({ data: poolParser })
|
|
39
|
+
.transform(({ data }) => data)
|
|
40
|
+
.parse(data);
|
|
41
|
+
const assets = await this.getPoolAssetsPriceAndRiskMdx(pool.id, pool.extensionContractAddress, pool.assets);
|
|
42
|
+
return { ...pool, assets };
|
|
43
|
+
}
|
|
44
|
+
async approveVTokenCalls(assetAddress, vTokenAddress, amount) {
|
|
45
|
+
const tokenContract = getErc20Contract(assetAddress);
|
|
46
|
+
const approveCall = tokenContract.populateTransaction.approve(vTokenAddress, amount);
|
|
47
|
+
return approveCall;
|
|
48
|
+
}
|
|
49
|
+
async depositEarnTransaction(params, env) {
|
|
50
|
+
try {
|
|
51
|
+
const account = new Account(this.env.provider, this.walletAddress, this.env.account.signer);
|
|
52
|
+
const pool = await this.getPool(GENESIS_POOLID);
|
|
53
|
+
const collateralPoolAsset = pool.assets.find((a) => a.symbol.toLocaleUpperCase() ===
|
|
54
|
+
params.depositTokenSymbol.toLocaleUpperCase());
|
|
55
|
+
if (!collateralPoolAsset) {
|
|
56
|
+
throw new Error('Collateral asset not found in pool');
|
|
57
|
+
}
|
|
58
|
+
const collateralAmount = parseUnits(params.depositAmount, collateralPoolAsset.decimals);
|
|
59
|
+
const vtokenContract = getVTokenContract(collateralPoolAsset.vToken.address);
|
|
60
|
+
const vTokenApproveCall = await this.approveVTokenCalls(collateralPoolAsset.address, collateralPoolAsset.vToken.address, collateralAmount);
|
|
61
|
+
const depositVTokenCall = await vtokenContract.populateTransaction.deposit(toU256(collateralAmount), account.address);
|
|
62
|
+
const provider = env.provider;
|
|
63
|
+
const tx = await account.execute([
|
|
64
|
+
{
|
|
65
|
+
contractAddress: vTokenApproveCall.contractAddress,
|
|
66
|
+
entrypoint: vTokenApproveCall.entrypoint,
|
|
67
|
+
calldata: vTokenApproveCall.calldata,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
contractAddress: depositVTokenCall.contractAddress,
|
|
71
|
+
entrypoint: depositVTokenCall.entrypoint,
|
|
72
|
+
calldata: depositVTokenCall.calldata,
|
|
73
|
+
},
|
|
74
|
+
]);
|
|
75
|
+
await provider.waitForTransaction(tx.transaction_hash);
|
|
76
|
+
const transferResult = {
|
|
77
|
+
status: 'success',
|
|
78
|
+
amount: params.depositAmount,
|
|
79
|
+
symbol: params.depositTokenSymbol,
|
|
80
|
+
recipients_address: account.address,
|
|
81
|
+
transaction_hash: tx.transaction_hash,
|
|
82
|
+
};
|
|
83
|
+
return transferResult;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error) {
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
status: 'failure',
|
|
90
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export const createDepositEarnService = (env, walletAddress) => {
|
|
96
|
+
if (!walletAddress) {
|
|
97
|
+
throw new Error('Wallet address not configured');
|
|
98
|
+
}
|
|
99
|
+
return new DepositEarnService(env, walletAddress);
|
|
100
|
+
};
|
|
101
|
+
export const depositEarnPosition = async (env, params) => {
|
|
102
|
+
const accountAddress = env.account?.address;
|
|
103
|
+
try {
|
|
104
|
+
const depositEarnService = createDepositEarnService(env, accountAddress);
|
|
105
|
+
const result = await depositEarnService.depositEarnTransaction(params, env);
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof Error) {
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
status: 'failure',
|
|
113
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=depositService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depositService.js","sourceRoot":"","sources":["../../src/tools/depositService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Call } from 'starknet';
|
|
2
|
+
import { Address, WithdrawParams, IBaseToken, IPool, ITokenValue, WithdrawResult } from '../interfaces/index.js';
|
|
3
|
+
import { Hex } from '../lib/utils/num.js';
|
|
4
|
+
import { onchainWrite } from '@kasarlabs/ask-starknet-core';
|
|
5
|
+
export declare class WithdrawEarnService {
|
|
6
|
+
private env;
|
|
7
|
+
private walletAddress;
|
|
8
|
+
constructor(env: onchainWrite, walletAddress: string);
|
|
9
|
+
getTokenPrice(token: IBaseToken, poolId: string, poolExtension: Hex): Promise<ITokenValue | undefined>;
|
|
10
|
+
private getPoolAssetsPriceAndRiskMdx;
|
|
11
|
+
getPool(poolId: string): Promise<IPool>;
|
|
12
|
+
getTokenBalance(baseToken: IBaseToken, walletAddress: Hex): Promise<bigint>;
|
|
13
|
+
approveVTokenCalls(assetAddress: Address, vTokenAddress: Address, amount: bigint): Promise<Call>;
|
|
14
|
+
withdrawEarnTransaction(params: WithdrawParams, env: onchainWrite): Promise<WithdrawResult>;
|
|
15
|
+
}
|
|
16
|
+
export declare const withdrawService: (env: onchainWrite, walletAddress?: string) => WithdrawEarnService;
|
|
17
|
+
export declare const withdrawEarnPosition: (env: onchainWrite, params: WithdrawParams) => Promise<WithdrawResult | {
|
|
18
|
+
status: string;
|
|
19
|
+
error: string;
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Account } from 'starknet';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { poolParser, } from '../interfaces/index.js';
|
|
4
|
+
import { DEFAULT_DECIMALS, GENESIS_POOLID, VESU_API_URL, } from '../lib/constants/index.js';
|
|
5
|
+
import { toBN, toU256 } from '../lib/utils/num.js';
|
|
6
|
+
import { getErc20Contract, getExtensionContract, getVTokenContract, } from '../lib/utils/contracts.js';
|
|
7
|
+
export class WithdrawEarnService {
|
|
8
|
+
constructor(env, walletAddress) {
|
|
9
|
+
this.env = env;
|
|
10
|
+
this.walletAddress = walletAddress;
|
|
11
|
+
}
|
|
12
|
+
async getTokenPrice(token, poolId, poolExtension) {
|
|
13
|
+
const contract = getExtensionContract(poolExtension);
|
|
14
|
+
try {
|
|
15
|
+
const res = await contract.price(poolId, token.address);
|
|
16
|
+
return res.is_valid && res.value
|
|
17
|
+
? { value: toBN(res.value), decimals: DEFAULT_DECIMALS }
|
|
18
|
+
: undefined;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async getPoolAssetsPriceAndRiskMdx(poolId, poolExtensionContractAddress, poolAssets) {
|
|
25
|
+
return await Promise.all(poolAssets.map(async (asset) => {
|
|
26
|
+
const usdPrice = await this.getTokenPrice(asset, poolId, poolExtensionContractAddress);
|
|
27
|
+
return {
|
|
28
|
+
...asset,
|
|
29
|
+
risk: null,
|
|
30
|
+
usdPrice,
|
|
31
|
+
};
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
async getPool(poolId) {
|
|
35
|
+
const data = await fetch(`${VESU_API_URL}/pools/${poolId}`).then((res) => res.json());
|
|
36
|
+
const pool = z
|
|
37
|
+
.object({ data: poolParser })
|
|
38
|
+
.transform(({ data }) => data)
|
|
39
|
+
.parse(data);
|
|
40
|
+
const assets = await this.getPoolAssetsPriceAndRiskMdx(pool.id, pool.extensionContractAddress, pool.assets);
|
|
41
|
+
return { ...pool, assets };
|
|
42
|
+
}
|
|
43
|
+
async getTokenBalance(baseToken, walletAddress) {
|
|
44
|
+
const tokenContract = getErc20Contract(baseToken.address);
|
|
45
|
+
return await tokenContract
|
|
46
|
+
.balanceOf(walletAddress)
|
|
47
|
+
.then(toBN)
|
|
48
|
+
.catch(() => {
|
|
49
|
+
console.error(new Error(`Failed to get balance of ${baseToken.address}`));
|
|
50
|
+
return 0n;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async approveVTokenCalls(assetAddress, vTokenAddress, amount) {
|
|
54
|
+
const tokenContract = getErc20Contract(assetAddress);
|
|
55
|
+
const approveCall = tokenContract.populateTransaction.approve(vTokenAddress, amount);
|
|
56
|
+
return approveCall;
|
|
57
|
+
}
|
|
58
|
+
async withdrawEarnTransaction(params, env) {
|
|
59
|
+
try {
|
|
60
|
+
const account = new Account(this.env.provider, this.walletAddress, this.env.account.signer);
|
|
61
|
+
const pool = await this.getPool(GENESIS_POOLID);
|
|
62
|
+
const collateralPoolAsset = pool.assets.find((a) => a.symbol.toLocaleUpperCase() ===
|
|
63
|
+
params.withdrawTokenSymbol.toLocaleUpperCase());
|
|
64
|
+
if (!collateralPoolAsset) {
|
|
65
|
+
throw new Error('Collateral asset not found in pool');
|
|
66
|
+
}
|
|
67
|
+
const vtokenContract = getVTokenContract(collateralPoolAsset.vToken.address);
|
|
68
|
+
const vTokenShares = await this.getTokenBalance(collateralPoolAsset.vToken, account.address);
|
|
69
|
+
const credentials = env.account;
|
|
70
|
+
const provider = env.provider;
|
|
71
|
+
const wallet = env.account;
|
|
72
|
+
const redeemVTokenCall = await vtokenContract.populateTransaction.redeem(toU256(vTokenShares), account.address, account.address);
|
|
73
|
+
const tx = await wallet.execute([
|
|
74
|
+
{
|
|
75
|
+
contractAddress: redeemVTokenCall.contractAddress,
|
|
76
|
+
entrypoint: redeemVTokenCall.entrypoint,
|
|
77
|
+
calldata: redeemVTokenCall.calldata,
|
|
78
|
+
},
|
|
79
|
+
]);
|
|
80
|
+
await provider.waitForTransaction(tx.transaction_hash);
|
|
81
|
+
const transferResult = {
|
|
82
|
+
status: 'success',
|
|
83
|
+
symbol: params.withdrawTokenSymbol,
|
|
84
|
+
recipients_address: account.address,
|
|
85
|
+
transaction_hash: tx.transaction_hash,
|
|
86
|
+
};
|
|
87
|
+
return transferResult;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error('Detailed deposit error:', error);
|
|
91
|
+
if (error instanceof Error) {
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
status: 'failure',
|
|
95
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export const withdrawService = (env, walletAddress) => {
|
|
101
|
+
if (!walletAddress) {
|
|
102
|
+
throw new Error('Wallet address not configured');
|
|
103
|
+
}
|
|
104
|
+
return new WithdrawEarnService(env, walletAddress);
|
|
105
|
+
};
|
|
106
|
+
export const withdrawEarnPosition = async (env, params) => {
|
|
107
|
+
const accountAddress = env.account?.address;
|
|
108
|
+
try {
|
|
109
|
+
const withdrawEarn = withdrawService(env, accountAddress);
|
|
110
|
+
const result = await withdrawEarn.withdrawEarnTransaction(params, env);
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof Error) {
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
status: 'failure',
|
|
118
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=withdrawService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withdrawService.js","sourceRoot":"","sources":["../../src/tools/withdrawService.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kasarlabs/vesu-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"vesu-mcp": "./bin/vesu-mcp.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc && chmod 755 build/index.js",
|
|
11
|
+
"clean": "rm -rf build",
|
|
12
|
+
"clean:all": "rm -rf build node_modules",
|
|
13
|
+
"start": "node build/index.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"build"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@kasarlabs/ask-starknet-core": "0.1.0",
|
|
20
|
+
"@langchain/core": "^0.3.42",
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.11.2",
|
|
22
|
+
"dotenv": "^16.4.7",
|
|
23
|
+
"ethers": "^6.13.5",
|
|
24
|
+
"starknet": "^7.6.4",
|
|
25
|
+
"winston": "^3.17.0",
|
|
26
|
+
"zod": "^3.24.2"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/node": "^22.13.10",
|
|
30
|
+
"typescript": "^5.8.2"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"mcp",
|
|
34
|
+
"starknet",
|
|
35
|
+
"vesu"
|
|
36
|
+
],
|
|
37
|
+
"author": "kasarlabs",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"description": "MCP server for interacting with the Vesu protocol, enabling deposit and withdrawal operations for earning positions.",
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"gitHead": "2239ec60f8e369abd318807cecd22fe97c0ab917"
|
|
44
|
+
}
|