@kasarlabs/avnu-mcp 0.1.1 → 0.1.2
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/README.md +13 -0
- package/build/lib/types/index.d.ts +4 -2
- package/build/schemas/index.d.ts +75 -14
- package/build/schemas/index.js +44 -6
- package/build/schemas/index.js.map +1 -1
- package/build/tools/fetchRoute.d.ts +0 -1
- package/build/tools/fetchRoute.js +1 -5
- package/build/tools/fetchRoute.js.map +1 -1
- package/build/tools/fetchTokens.d.ts +2 -5
- package/build/tools/fetchTokens.js +36 -20
- package/build/tools/fetchTokens.js.map +1 -1
- package/build/tools/swap.d.ts +0 -1
- package/build/tools/swap.js +6 -8
- package/build/tools/swap.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -9,6 +9,19 @@ This plugin adds the following tools:
|
|
|
9
9
|
- **avnu_swap_tokens**: Swap a specified amount of one token for another token.
|
|
10
10
|
- **avnu_get_route**: Get a specific routing path for a token swap.
|
|
11
11
|
|
|
12
|
+
### Token Identification
|
|
13
|
+
|
|
14
|
+
Both tools support identifying tokens by:
|
|
15
|
+
|
|
16
|
+
- **Symbol**: Use token symbols (e.g., `ETH`, `USDC`, `DAI`)
|
|
17
|
+
- **Address**: Use token contract addresses directly
|
|
18
|
+
|
|
19
|
+
You can mix and match - use a symbol for one token and an address for the other, or use addresses for both. For example:
|
|
20
|
+
|
|
21
|
+
- Use symbols for both: `{ sellTokenSymbol: "ETH", buyTokenSymbol: "USDC" }`
|
|
22
|
+
- Use addresses for both: `{ sellTokenAddress: "0x...", buyTokenAddress: "0x..." }`
|
|
23
|
+
- Mix them: `{ sellTokenSymbol: "ETH", buyTokenAddress: "0x..." }`
|
|
24
|
+
|
|
12
25
|
## Usage
|
|
13
26
|
|
|
14
27
|
The AVNU Plugin is used internally by the Starknet Agent and doesn't need to be called directly. When the agent is initialized, it automatically registers these tools, making them available for use.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Token as AvnuToken } from '@avnu/avnu-sdk';
|
|
2
2
|
import { ProviderInterface } from 'starknet';
|
|
3
3
|
export interface SwapParams {
|
|
4
|
-
sellTokenSymbol
|
|
5
|
-
|
|
4
|
+
sellTokenSymbol?: string;
|
|
5
|
+
sellTokenAddress?: string;
|
|
6
|
+
buyTokenSymbol?: string;
|
|
7
|
+
buyTokenAddress?: string;
|
|
6
8
|
sellAmount: number;
|
|
7
9
|
}
|
|
8
10
|
export interface Token {
|
package/build/schemas/index.d.ts
CHANGED
|
@@ -1,28 +1,89 @@
|
|
|
1
1
|
import z from 'zod';
|
|
2
|
-
export declare const swapSchema: z.ZodObject<{
|
|
3
|
-
sellTokenSymbol: z.ZodString
|
|
4
|
-
|
|
2
|
+
export declare const swapSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
3
|
+
sellTokenSymbol: z.ZodOptional<z.ZodString>;
|
|
4
|
+
sellTokenAddress: z.ZodOptional<z.ZodString>;
|
|
5
|
+
buyTokenSymbol: z.ZodOptional<z.ZodString>;
|
|
6
|
+
buyTokenAddress: z.ZodOptional<z.ZodString>;
|
|
5
7
|
sellAmount: z.ZodNumber;
|
|
6
8
|
}, "strip", z.ZodTypeAny, {
|
|
7
|
-
sellTokenSymbol: string;
|
|
8
|
-
buyTokenSymbol: string;
|
|
9
9
|
sellAmount: number;
|
|
10
|
+
sellTokenSymbol?: string | undefined;
|
|
11
|
+
sellTokenAddress?: string | undefined;
|
|
12
|
+
buyTokenSymbol?: string | undefined;
|
|
13
|
+
buyTokenAddress?: string | undefined;
|
|
10
14
|
}, {
|
|
11
|
-
sellTokenSymbol: string;
|
|
12
|
-
buyTokenSymbol: string;
|
|
13
15
|
sellAmount: number;
|
|
16
|
+
sellTokenSymbol?: string | undefined;
|
|
17
|
+
sellTokenAddress?: string | undefined;
|
|
18
|
+
buyTokenSymbol?: string | undefined;
|
|
19
|
+
buyTokenAddress?: string | undefined;
|
|
20
|
+
}>, {
|
|
21
|
+
sellAmount: number;
|
|
22
|
+
sellTokenSymbol?: string | undefined;
|
|
23
|
+
sellTokenAddress?: string | undefined;
|
|
24
|
+
buyTokenSymbol?: string | undefined;
|
|
25
|
+
buyTokenAddress?: string | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
sellAmount: number;
|
|
28
|
+
sellTokenSymbol?: string | undefined;
|
|
29
|
+
sellTokenAddress?: string | undefined;
|
|
30
|
+
buyTokenSymbol?: string | undefined;
|
|
31
|
+
buyTokenAddress?: string | undefined;
|
|
32
|
+
}>, {
|
|
33
|
+
sellAmount: number;
|
|
34
|
+
sellTokenSymbol?: string | undefined;
|
|
35
|
+
sellTokenAddress?: string | undefined;
|
|
36
|
+
buyTokenSymbol?: string | undefined;
|
|
37
|
+
buyTokenAddress?: string | undefined;
|
|
38
|
+
}, {
|
|
39
|
+
sellAmount: number;
|
|
40
|
+
sellTokenSymbol?: string | undefined;
|
|
41
|
+
sellTokenAddress?: string | undefined;
|
|
42
|
+
buyTokenSymbol?: string | undefined;
|
|
43
|
+
buyTokenAddress?: string | undefined;
|
|
14
44
|
}>;
|
|
15
|
-
export declare const routeSchema: z.ZodObject<{
|
|
16
|
-
sellTokenSymbol: z.ZodString
|
|
17
|
-
|
|
45
|
+
export declare const routeSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
46
|
+
sellTokenSymbol: z.ZodOptional<z.ZodString>;
|
|
47
|
+
sellTokenAddress: z.ZodOptional<z.ZodString>;
|
|
48
|
+
buyTokenSymbol: z.ZodOptional<z.ZodString>;
|
|
49
|
+
buyTokenAddress: z.ZodOptional<z.ZodString>;
|
|
18
50
|
sellAmount: z.ZodNumber;
|
|
19
51
|
}, "strip", z.ZodTypeAny, {
|
|
20
|
-
sellTokenSymbol: string;
|
|
21
|
-
buyTokenSymbol: string;
|
|
22
52
|
sellAmount: number;
|
|
53
|
+
sellTokenSymbol?: string | undefined;
|
|
54
|
+
sellTokenAddress?: string | undefined;
|
|
55
|
+
buyTokenSymbol?: string | undefined;
|
|
56
|
+
buyTokenAddress?: string | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
sellAmount: number;
|
|
59
|
+
sellTokenSymbol?: string | undefined;
|
|
60
|
+
sellTokenAddress?: string | undefined;
|
|
61
|
+
buyTokenSymbol?: string | undefined;
|
|
62
|
+
buyTokenAddress?: string | undefined;
|
|
63
|
+
}>, {
|
|
64
|
+
sellAmount: number;
|
|
65
|
+
sellTokenSymbol?: string | undefined;
|
|
66
|
+
sellTokenAddress?: string | undefined;
|
|
67
|
+
buyTokenSymbol?: string | undefined;
|
|
68
|
+
buyTokenAddress?: string | undefined;
|
|
69
|
+
}, {
|
|
70
|
+
sellAmount: number;
|
|
71
|
+
sellTokenSymbol?: string | undefined;
|
|
72
|
+
sellTokenAddress?: string | undefined;
|
|
73
|
+
buyTokenSymbol?: string | undefined;
|
|
74
|
+
buyTokenAddress?: string | undefined;
|
|
75
|
+
}>, {
|
|
76
|
+
sellAmount: number;
|
|
77
|
+
sellTokenSymbol?: string | undefined;
|
|
78
|
+
sellTokenAddress?: string | undefined;
|
|
79
|
+
buyTokenSymbol?: string | undefined;
|
|
80
|
+
buyTokenAddress?: string | undefined;
|
|
23
81
|
}, {
|
|
24
|
-
sellTokenSymbol: string;
|
|
25
|
-
buyTokenSymbol: string;
|
|
26
82
|
sellAmount: number;
|
|
83
|
+
sellTokenSymbol?: string | undefined;
|
|
84
|
+
sellTokenAddress?: string | undefined;
|
|
85
|
+
buyTokenSymbol?: string | undefined;
|
|
86
|
+
buyTokenAddress?: string | undefined;
|
|
27
87
|
}>;
|
|
28
88
|
export type RouteSchemaType = z.infer<typeof routeSchema>;
|
|
89
|
+
export type SwapSchemaType = z.infer<typeof swapSchema>;
|
package/build/schemas/index.js
CHANGED
|
@@ -1,20 +1,58 @@
|
|
|
1
1
|
import z from 'zod';
|
|
2
|
-
export const swapSchema = z
|
|
2
|
+
export const swapSchema = z
|
|
3
|
+
.object({
|
|
3
4
|
sellTokenSymbol: z
|
|
4
5
|
.string()
|
|
5
|
-
.
|
|
6
|
+
.optional()
|
|
7
|
+
.describe("Symbol of the token to sell (e.g., 'ETH', 'USDC'). Either symbol or address must be provided."),
|
|
8
|
+
sellTokenAddress: z
|
|
9
|
+
.string()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Address of the token to sell. Either symbol or address must be provided.'),
|
|
6
12
|
buyTokenSymbol: z
|
|
7
13
|
.string()
|
|
8
|
-
.
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Symbol of the token to buy (e.g., 'ETH', 'USDC'). Either symbol or address must be provided."),
|
|
16
|
+
buyTokenAddress: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Address of the token to buy. Either symbol or address must be provided.'),
|
|
9
20
|
sellAmount: z.number().min(0.000001).describe('Amount of tokens to sell'),
|
|
21
|
+
})
|
|
22
|
+
.refine((data) => data.sellTokenSymbol || data.sellTokenAddress, {
|
|
23
|
+
message: 'Either sellTokenSymbol or sellTokenAddress must be provided',
|
|
24
|
+
path: ['sellTokenSymbol'],
|
|
25
|
+
})
|
|
26
|
+
.refine((data) => data.buyTokenSymbol || data.buyTokenAddress, {
|
|
27
|
+
message: 'Either buyTokenSymbol or buyTokenAddress must be provided',
|
|
28
|
+
path: ['buyTokenSymbol'],
|
|
10
29
|
});
|
|
11
|
-
export const routeSchema = z
|
|
30
|
+
export const routeSchema = z
|
|
31
|
+
.object({
|
|
12
32
|
sellTokenSymbol: z
|
|
13
33
|
.string()
|
|
14
|
-
.
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Symbol of the token to sell (e.g., 'ETH', 'USDC'). Either symbol or address must be provided."),
|
|
36
|
+
sellTokenAddress: z
|
|
37
|
+
.string()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Address of the token to sell. Either symbol or address must be provided.'),
|
|
15
40
|
buyTokenSymbol: z
|
|
16
41
|
.string()
|
|
17
|
-
.
|
|
42
|
+
.optional()
|
|
43
|
+
.describe("Symbol of the token to buy (e.g., 'ETH', 'USDC'). Either symbol or address must be provided."),
|
|
44
|
+
buyTokenAddress: z
|
|
45
|
+
.string()
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('Address of the token to buy. Either symbol or address must be provided.'),
|
|
18
48
|
sellAmount: z.number().min(0.000001).describe('Amount of tokens to sell'),
|
|
49
|
+
})
|
|
50
|
+
.refine((data) => data.sellTokenSymbol || data.sellTokenAddress, {
|
|
51
|
+
message: 'Either sellTokenSymbol or sellTokenAddress must be provided',
|
|
52
|
+
path: ['sellTokenSymbol'],
|
|
53
|
+
})
|
|
54
|
+
.refine((data) => data.buyTokenSymbol || data.buyTokenAddress, {
|
|
55
|
+
message: 'Either buyTokenSymbol or buyTokenAddress must be provided',
|
|
56
|
+
path: ['buyTokenSymbol'],
|
|
19
57
|
});
|
|
20
58
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,+FAA+F,CAChG;IACH,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0EAA0E,CAC3E;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,8FAA8F,CAC/F;IACH,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE,CAC1E;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC1E,CAAC;KACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,gBAAgB,EAAE;IAC/D,OAAO,EAAE,6DAA6D;IACtE,IAAI,EAAE,CAAC,iBAAiB,CAAC;CAC1B,CAAC;KACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE;IAC7D,OAAO,EAAE,2DAA2D;IACpE,IAAI,EAAE,CAAC,gBAAgB,CAAC;CACzB,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,+FAA+F,CAChG;IACH,gBAAgB,EAAE,CAAC;SAChB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,0EAA0E,CAC3E;IACH,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,8FAA8F,CAC/F;IACH,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yEAAyE,CAC1E;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC1E,CAAC;KACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,gBAAgB,EAAE;IAC/D,OAAO,EAAE,6DAA6D;IACtE,IAAI,EAAE,CAAC,iBAAiB,CAAC;CAC1B,CAAC;KACD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE;IAC7D,OAAO,EAAE,2DAA2D;IACpE,IAAI,EAAE,CAAC,gBAAgB,CAAC;CACzB,CAAC,CAAC"}
|
|
@@ -4,7 +4,6 @@ import { RouteResult } from '../interfaces/index.js';
|
|
|
4
4
|
export declare class RouteFetchService {
|
|
5
5
|
private tokenService;
|
|
6
6
|
constructor();
|
|
7
|
-
initialize(): Promise<void>;
|
|
8
7
|
fetchRoute(params: RouteSchemaType, env: onchainRead, accountAddress: string): Promise<RouteResult>;
|
|
9
8
|
}
|
|
10
9
|
export declare const getRoute: (env: onchainWrite, params: RouteSchemaType) => Promise<string | {
|
|
@@ -5,13 +5,9 @@ export class RouteFetchService {
|
|
|
5
5
|
constructor() {
|
|
6
6
|
this.tokenService = new TokenService();
|
|
7
7
|
}
|
|
8
|
-
async initialize() {
|
|
9
|
-
await this.tokenService.initializeTokens();
|
|
10
|
-
}
|
|
11
8
|
async fetchRoute(params, env, accountAddress) {
|
|
12
9
|
try {
|
|
13
|
-
await this.
|
|
14
|
-
const { sellToken, buyToken } = this.tokenService.validateTokenPair(params.sellTokenSymbol, params.buyTokenSymbol);
|
|
10
|
+
const { sellToken, buyToken } = await this.tokenService.validateTokenPairBySymbolOrAddress(params.sellTokenSymbol, params.sellTokenAddress, params.buyTokenSymbol, params.buyTokenAddress);
|
|
15
11
|
const contractInteractor = new ContractInteractor(env.provider);
|
|
16
12
|
const formattedAmountStr = contractInteractor.formatTokenAmount(params.sellAmount.toString(), sellToken.decimals);
|
|
17
13
|
const formattedAmount = BigInt(formattedAmountStr);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchRoute.js","sourceRoot":"","sources":["../../src/tools/fetchRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgB,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAMxE,MAAM,OAAO,iBAAiB;IAM5B;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACzC,CAAC;
|
|
1
|
+
{"version":3,"file":"fetchRoute.js","sourceRoot":"","sources":["../../src/tools/fetchRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { Token } from '@avnu/avnu-sdk';
|
|
2
2
|
export declare class TokenService {
|
|
3
|
-
|
|
4
|
-
initializeTokens(): Promise<void>;
|
|
5
|
-
getToken(symbol: string): Token | undefined;
|
|
6
|
-
validateTokenPair(sellSymbol: string, buySymbol: string): {
|
|
3
|
+
validateTokenPairBySymbolOrAddress(sellSymbol?: string, sellAddress?: string, buySymbol?: string, buyAddress?: string): Promise<{
|
|
7
4
|
sellToken: Token;
|
|
8
5
|
buyToken: Token;
|
|
9
|
-
}
|
|
6
|
+
}>;
|
|
10
7
|
}
|
|
@@ -1,30 +1,46 @@
|
|
|
1
1
|
import { fetchTokens } from '@avnu/avnu-sdk';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
function normalizeAddress(address) {
|
|
3
|
+
const lowerAddress = address.toLowerCase();
|
|
4
|
+
if (!lowerAddress.startsWith('0x')) {
|
|
5
|
+
return lowerAddress;
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
+
const withoutPrefix = lowerAddress.slice(2);
|
|
8
|
+
const normalized = withoutPrefix.replace(/^0+/, '');
|
|
9
|
+
return normalized ? `0x${normalized}` : '0x0';
|
|
10
|
+
}
|
|
11
|
+
export class TokenService {
|
|
12
|
+
async validateTokenPairBySymbolOrAddress(sellSymbol, sellAddress, buySymbol, buyAddress) {
|
|
13
|
+
if (!sellSymbol && !sellAddress) {
|
|
14
|
+
throw new Error('Either sellTokenSymbol or sellTokenAddress must be provided');
|
|
15
|
+
}
|
|
16
|
+
if (!buySymbol && !buyAddress) {
|
|
17
|
+
throw new Error('Either buyTokenSymbol or buyTokenAddress must be provided');
|
|
18
|
+
}
|
|
7
19
|
try {
|
|
8
20
|
const response = await fetchTokens();
|
|
9
|
-
response.content
|
|
10
|
-
|
|
11
|
-
|
|
21
|
+
const tokens = response.content;
|
|
22
|
+
const sellToken = sellSymbol
|
|
23
|
+
? tokens.find((token) => token.symbol.toLowerCase() === sellSymbol.toLowerCase())
|
|
24
|
+
: tokens.find((token) => normalizeAddress(token.address) === normalizeAddress(sellAddress));
|
|
25
|
+
const buyToken = buySymbol
|
|
26
|
+
? tokens.find((token) => token.symbol.toLowerCase() === buySymbol.toLowerCase())
|
|
27
|
+
: tokens.find((token) => normalizeAddress(token.address) === normalizeAddress(buyAddress));
|
|
28
|
+
if (!sellToken) {
|
|
29
|
+
const identifier = sellSymbol || sellAddress;
|
|
30
|
+
throw new Error(`Sell token ${identifier} not supported`);
|
|
31
|
+
}
|
|
32
|
+
if (!buyToken) {
|
|
33
|
+
const identifier = buySymbol || buyAddress;
|
|
34
|
+
throw new Error(`Buy token ${identifier} not supported`);
|
|
35
|
+
}
|
|
36
|
+
return { sellToken, buyToken };
|
|
12
37
|
}
|
|
13
38
|
catch (error) {
|
|
14
|
-
|
|
39
|
+
if (error instanceof Error && error.message.includes('not supported')) {
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Failed to fetch tokens: ${error.message}`);
|
|
15
43
|
}
|
|
16
44
|
}
|
|
17
|
-
getToken(symbol) {
|
|
18
|
-
return this.tokenCache.get(symbol.toLowerCase());
|
|
19
|
-
}
|
|
20
|
-
validateTokenPair(sellSymbol, buySymbol) {
|
|
21
|
-
const sellToken = this.getToken(sellSymbol);
|
|
22
|
-
const buyToken = this.getToken(buySymbol);
|
|
23
|
-
if (!sellToken)
|
|
24
|
-
throw new Error(`Sell token ${sellSymbol} not supported`);
|
|
25
|
-
if (!buyToken)
|
|
26
|
-
throw new Error(`Buy token ${buySymbol} not supported`);
|
|
27
|
-
return { sellToken, buyToken };
|
|
28
|
-
}
|
|
29
45
|
}
|
|
30
46
|
//# sourceMappingURL=fetchTokens.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchTokens.js","sourceRoot":"","sources":["../../src/tools/fetchTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"fetchTokens.js","sourceRoot":"","sources":["../../src/tools/fetchTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOpD,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC;AAMD,MAAM,OAAO,YAAY;IAWvB,KAAK,CAAC,kCAAkC,CACtC,UAAmB,EACnB,WAAoB,EACpB,SAAkB,EAClB,UAAmB;QAKnB,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;YAGhC,MAAM,SAAS,GAAG,UAAU;gBAC1B,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CACnE;gBACH,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CACR,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,gBAAgB,CAAC,WAAY,CAAC,CACrE,CAAC;YAEN,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CAClE;gBACH,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CACR,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,gBAAgB,CAAC,UAAW,CAAC,CACpE,CAAC;YAEN,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,UAAU,IAAI,WAAW,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,cAAc,UAAU,gBAAgB,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,UAAU,GAAG,SAAS,IAAI,UAAU,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,gBAAgB,CAAC,CAAC;YAC3D,CAAC;YAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACtE,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF"}
|
package/build/tools/swap.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ export declare class SwapService {
|
|
|
5
5
|
private tokenService;
|
|
6
6
|
private approvalService;
|
|
7
7
|
constructor(env: onchainWrite);
|
|
8
|
-
initialize(): Promise<void>;
|
|
9
8
|
private extractSpenderAddress;
|
|
10
9
|
executeSwapTransaction(params: SwapParams): Promise<SwapResult>;
|
|
11
10
|
private monitorSwapStatus;
|
package/build/tools/swap.js
CHANGED
|
@@ -10,9 +10,6 @@ export class SwapService {
|
|
|
10
10
|
this.tokenService = new TokenService();
|
|
11
11
|
this.approvalService = new ApprovalService(env);
|
|
12
12
|
}
|
|
13
|
-
async initialize() {
|
|
14
|
-
await this.tokenService.initializeTokens();
|
|
15
|
-
}
|
|
16
13
|
extractSpenderAddress(quote) {
|
|
17
14
|
if (quote.routes?.length > 0) {
|
|
18
15
|
const mainRoute = quote.routes[0];
|
|
@@ -22,10 +19,9 @@ export class SwapService {
|
|
|
22
19
|
}
|
|
23
20
|
async executeSwapTransaction(params) {
|
|
24
21
|
try {
|
|
25
|
-
await this.initialize();
|
|
26
22
|
const contractInteractor = new ContractInteractor(this.env.provider);
|
|
27
23
|
const account = this.env.account;
|
|
28
|
-
const { sellToken, buyToken } = this.tokenService.
|
|
24
|
+
const { sellToken, buyToken } = await this.tokenService.validateTokenPairBySymbolOrAddress(params.sellTokenSymbol, params.sellTokenAddress, params.buyTokenSymbol, params.buyTokenAddress);
|
|
29
25
|
const formattedAmount = BigInt(contractInteractor.formatTokenAmount(params.sellAmount.toString(), sellToken.decimals));
|
|
30
26
|
const quoteParams = {
|
|
31
27
|
sellTokenAddress: sellToken.address,
|
|
@@ -48,13 +44,15 @@ export class SwapService {
|
|
|
48
44
|
slippage: SLIPPAGE_PERCENTAGE,
|
|
49
45
|
});
|
|
50
46
|
const { receipt, events } = await this.monitorSwapStatus(swapResult.transactionHash);
|
|
47
|
+
const sellTokenIdentifier = params.sellTokenSymbol || params.sellTokenAddress || sellToken.symbol;
|
|
48
|
+
const buyTokenIdentifier = params.buyTokenSymbol || params.buyTokenAddress || buyToken.symbol;
|
|
51
49
|
return {
|
|
52
50
|
status: 'success',
|
|
53
|
-
message: `Successfully swapped ${params.sellAmount} ${
|
|
51
|
+
message: `Successfully swapped ${params.sellAmount} ${sellTokenIdentifier} for ${buyTokenIdentifier}`,
|
|
54
52
|
transactionHash: swapResult.transactionHash,
|
|
55
53
|
sellAmount: params.sellAmount,
|
|
56
|
-
sellToken:
|
|
57
|
-
buyToken:
|
|
54
|
+
sellToken: sellTokenIdentifier,
|
|
55
|
+
buyToken: buyTokenIdentifier,
|
|
58
56
|
receipt,
|
|
59
57
|
events,
|
|
60
58
|
};
|
package/build/tools/swap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/tools/swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAuB,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAMxE,MAAM,OAAO,WAAW;IAQtB,YAAoB,GAAiB;QAAjB,QAAG,GAAH,GAAG,CAAc;QACnC,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/tools/swap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kasarlabs/avnu-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@avnu/avnu-sdk": "^3.1.1",
|
|
20
|
-
"@kasarlabs/ask-starknet-core": "0.1.
|
|
20
|
+
"@kasarlabs/ask-starknet-core": "0.1.1",
|
|
21
21
|
"@langchain/core": "^0.3.75",
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.11.2",
|
|
23
23
|
"dotenv": "^16.4.7",
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"publishConfig": {
|
|
41
41
|
"access": "public"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "4212f968456c2a170aac99306a899ae43458e23c"
|
|
44
44
|
}
|