@kasarlabs/fibrous-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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/bin/fibrous-mcp.js +14 -0
  4. package/build/index.d.ts +2 -0
  5. package/build/index.js +58 -0
  6. package/build/index.js.map +1 -0
  7. package/build/lib/abis/erc20Abi.d.ts +89 -0
  8. package/build/lib/abis/erc20Abi.js +128 -0
  9. package/build/lib/abis/erc20Abi.js.map +1 -0
  10. package/build/lib/constants/index.d.ts +2 -0
  11. package/build/lib/constants/index.js +3 -0
  12. package/build/lib/constants/index.js.map +1 -0
  13. package/build/lib/dependances/types.d.ts +85 -0
  14. package/build/lib/dependances/types.js +51 -0
  15. package/build/lib/dependances/types.js.map +1 -0
  16. package/build/lib/types/index.d.ts +48 -0
  17. package/build/lib/types/index.js +2 -0
  18. package/build/lib/types/index.js.map +1 -0
  19. package/build/lib/utils/contractInteractor.d.ts +16 -0
  20. package/build/lib/utils/contractInteractor.js +114 -0
  21. package/build/lib/utils/contractInteractor.js.map +1 -0
  22. package/build/lib/utils/transactionMonitor.d.ts +11 -0
  23. package/build/lib/utils/transactionMonitor.js +82 -0
  24. package/build/lib/utils/transactionMonitor.js.map +1 -0
  25. package/build/lib/utils/utils.d.ts +10 -0
  26. package/build/lib/utils/utils.js +15 -0
  27. package/build/lib/utils/utils.js.map +1 -0
  28. package/build/schemas/index.d.ts +41 -0
  29. package/build/schemas/index.js +25 -0
  30. package/build/schemas/index.js.map +1 -0
  31. package/build/tools/approval.d.ts +6 -0
  32. package/build/tools/approval.js +39 -0
  33. package/build/tools/approval.js.map +1 -0
  34. package/build/tools/batchSwap.d.ts +62 -0
  35. package/build/tools/batchSwap.js +120 -0
  36. package/build/tools/batchSwap.js.map +1 -0
  37. package/build/tools/fetchRoute.d.ts +15 -0
  38. package/build/tools/fetchRoute.js +57 -0
  39. package/build/tools/fetchRoute.js.map +1 -0
  40. package/build/tools/fetchTokens.d.ts +10 -0
  41. package/build/tools/fetchTokens.js +26 -0
  42. package/build/tools/fetchTokens.js.map +1 -0
  43. package/build/tools/swap.d.ts +19 -0
  44. package/build/tools/swap.js +100 -0
  45. package/build/tools/swap.js.map +1 -0
  46. package/package.json +45 -0
@@ -0,0 +1,114 @@
1
+ import { Contract, CallData, hash } from 'starknet';
2
+ export class ContractInteractor {
3
+ constructor(provider) {
4
+ this.provider = provider;
5
+ }
6
+ async deployContract(account, classHash, constructorCalldata = [], salt) {
7
+ try {
8
+ const deployPayload = {
9
+ classHash,
10
+ constructorCalldata: CallData.compile(constructorCalldata),
11
+ salt: salt || hash.getSelectorFromName(Math.random().toString()),
12
+ };
13
+ const { transaction_hash, contract_address } = await account.deploy(deployPayload);
14
+ await this.provider.waitForTransaction(transaction_hash);
15
+ return {
16
+ transactionHash: transaction_hash,
17
+ contractAddress: contract_address,
18
+ };
19
+ }
20
+ catch (error) {
21
+ throw new Error(`Failed to deploy contract: ${error.message}`);
22
+ }
23
+ }
24
+ async estimateContractDeploy(account, classHash, constructorCalldata = [], salt) {
25
+ try {
26
+ const deployPayload = {
27
+ classHash,
28
+ constructorCalldata: CallData.compile(constructorCalldata),
29
+ salt: salt || hash.getSelectorFromName(Math.random().toString()),
30
+ };
31
+ return account.estimateDeployFee(deployPayload);
32
+ }
33
+ catch (error) {
34
+ throw new Error(`Failed to estimate contract deploy: ${error.message}`);
35
+ }
36
+ }
37
+ async multicall(account, calls) {
38
+ try {
39
+ const { transaction_hash } = await account.execute(calls);
40
+ await this.provider.waitForTransaction(transaction_hash);
41
+ return {
42
+ status: 'success',
43
+ transactionHash: transaction_hash,
44
+ };
45
+ }
46
+ catch (error) {
47
+ return {
48
+ status: 'failure',
49
+ error: error.message,
50
+ };
51
+ }
52
+ }
53
+ async estimateMulticall(account, calls) {
54
+ try {
55
+ return account.estimateInvokeFee(calls);
56
+ }
57
+ catch (error) {
58
+ throw new Error(`Failed to estimate multicall: ${error.message}`);
59
+ }
60
+ }
61
+ createContract(abi, address, account) {
62
+ return new Contract(abi, address, account || this.provider);
63
+ }
64
+ async readContract(contract, method, args = []) {
65
+ try {
66
+ return await contract.call(method, args);
67
+ }
68
+ catch (error) {
69
+ throw new Error(`Failed to read contract: ${error.message}`);
70
+ }
71
+ }
72
+ async writeContract(contract, method, args = []) {
73
+ try {
74
+ const { transaction_hash } = await contract.invoke(method, args);
75
+ await this.provider.waitForTransaction(transaction_hash);
76
+ return {
77
+ status: 'success',
78
+ transactionHash: transaction_hash,
79
+ };
80
+ }
81
+ catch (error) {
82
+ return {
83
+ status: 'failure',
84
+ error: error.message,
85
+ };
86
+ }
87
+ }
88
+ async estimateContractWrite(contract, method, args = []) {
89
+ if (!contract.account) {
90
+ throw new Error('Contract must be connected to an account to estimate fees');
91
+ }
92
+ try {
93
+ return await contract.estimate(method, args);
94
+ }
95
+ catch (error) {
96
+ throw new Error(`Failed to estimate contract write: ${error.message}`);
97
+ }
98
+ }
99
+ formatTokenAmount(amount, decimals = 18) {
100
+ const value = typeof amount === 'string' ? amount : amount.toString();
101
+ const [whole, fraction = ''] = value.split('.');
102
+ const paddedFraction = fraction.padEnd(decimals, '0');
103
+ return whole + paddedFraction;
104
+ }
105
+ parseTokenAmount(amount, decimals = 18) {
106
+ const amountBigInt = BigInt(amount);
107
+ const divisor = BigInt(10) ** BigInt(decimals);
108
+ const wholePart = amountBigInt / divisor;
109
+ const fractionPart = amountBigInt % divisor;
110
+ const paddedFraction = fractionPart.toString().padStart(decimals, '0');
111
+ return `${wholePart}.${paddedFraction}`;
112
+ }
113
+ }
114
+ //# sourceMappingURL=contractInteractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contractInteractor.js","sourceRoot":"","sources":["../../../src/lib/utils/contractInteractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BaseUtilityClass } from '../types/index.js';
2
+ import { TransactionStatus, TransactionReceipt } from 'starknet';
3
+ export declare class TransactionMonitor implements BaseUtilityClass {
4
+ provider: any;
5
+ private readonly pollingInterval;
6
+ constructor(provider: any, pollingInterval?: number);
7
+ waitForTransaction(txHash: string, callback?: (status: TransactionStatus) => void): Promise<TransactionReceipt>;
8
+ getTransactionEvents(txHash: string): Promise<Event[]>;
9
+ watchEvents(fromBlock: number, toBlock: number | "latest" | undefined, callback: (events: Event[]) => void): Promise<void>;
10
+ getTransactionStatus(txHash: string): Promise<TransactionStatus>;
11
+ }
@@ -0,0 +1,82 @@
1
+ export class TransactionMonitor {
2
+ constructor(provider, pollingInterval = 5000) {
3
+ this.provider = provider;
4
+ this.pollingInterval = pollingInterval;
5
+ }
6
+ async waitForTransaction(txHash, callback) {
7
+ let receipt;
8
+ while (true) {
9
+ try {
10
+ receipt = await this.provider.getTransactionReceipt(txHash);
11
+ if (callback) {
12
+ const status = await this.provider.getTransactionStatus(txHash);
13
+ callback(status);
14
+ }
15
+ if (receipt.finality_status === 'ACCEPTED_ON_L2' ||
16
+ receipt.finality_status === 'ACCEPTED_ON_L1') {
17
+ break;
18
+ }
19
+ if (receipt.execution_status === 'REVERTED') {
20
+ throw new Error(`Transaction ${txHash} was reverted`);
21
+ }
22
+ await new Promise((resolve) => setTimeout(resolve, this.pollingInterval));
23
+ }
24
+ catch (error) {
25
+ if (error.message.includes('Transaction hash not found')) {
26
+ await new Promise((resolve) => setTimeout(resolve, this.pollingInterval));
27
+ continue;
28
+ }
29
+ throw error;
30
+ }
31
+ }
32
+ return receipt;
33
+ }
34
+ async getTransactionEvents(txHash) {
35
+ try {
36
+ const receipt = await this.provider.getTransactionReceipt(txHash);
37
+ return receipt.events || [];
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Failed to get transaction events: ${error.message}`);
41
+ }
42
+ }
43
+ async watchEvents(fromBlock, toBlock = 'latest', callback) {
44
+ let currentBlock = fromBlock;
45
+ while (true) {
46
+ try {
47
+ const latestBlock = toBlock === 'latest' ? await this.provider.getBlockNumber() : toBlock;
48
+ if (currentBlock > latestBlock) {
49
+ break;
50
+ }
51
+ const block = await this.provider.getBlockWithTxs(currentBlock);
52
+ const events = [];
53
+ for (const tx of block.transactions) {
54
+ if (tx.transaction_hash) {
55
+ const receipt = await this.provider.getTransactionReceipt(tx.transaction_hash);
56
+ if (receipt.events) {
57
+ events.push(...receipt.events);
58
+ }
59
+ }
60
+ }
61
+ if (events.length > 0) {
62
+ callback(events);
63
+ }
64
+ currentBlock++;
65
+ await new Promise((resolve) => setTimeout(resolve, this.pollingInterval));
66
+ }
67
+ catch (error) {
68
+ console.error('Error watching events:', error);
69
+ await new Promise((resolve) => setTimeout(resolve, this.pollingInterval));
70
+ }
71
+ }
72
+ }
73
+ async getTransactionStatus(txHash) {
74
+ try {
75
+ return await this.provider.getTransactionStatus(txHash);
76
+ }
77
+ catch (error) {
78
+ throw new Error(`Failed to get transaction status: ${error.message}`);
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=transactionMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionMonitor.js","sourceRoot":"","sources":["../../../src/lib/utils/transactionMonitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Call, Account } from 'starknet';
2
+ export interface ExecuteV3Args {
3
+ call: Call;
4
+ account: Account;
5
+ }
6
+ export declare const getV3DetailsPayload: () => {
7
+ version: number;
8
+ maxFee: bigint;
9
+ };
10
+ export declare const executeV3Transaction: ({ call, account, }: ExecuteV3Args) => Promise<string>;
@@ -0,0 +1,15 @@
1
+ export const getV3DetailsPayload = () => {
2
+ return {
3
+ version: 3,
4
+ maxFee: 10n ** 16n,
5
+ };
6
+ };
7
+ export const executeV3Transaction = async ({ call, account, }) => {
8
+ const { transaction_hash } = await account.execute(call, getV3DetailsPayload());
9
+ const receipt = await account.waitForTransaction(transaction_hash);
10
+ if (!receipt.isSuccess()) {
11
+ throw new Error('Transaction confirmed but failed');
12
+ }
13
+ return transaction_hash;
14
+ };
15
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils/utils.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,GAAG,IAAI,GAAG;KACnB,CAAC;AACJ,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,EACzC,IAAI,EACJ,OAAO,GACO,EAAmB,EAAE;IACnC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAChD,IAAI,EACJ,mBAAmB,EAAE,CACtB,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import z from 'zod';
2
+ export declare const swapSchema: z.ZodObject<{
3
+ sellTokenSymbol: z.ZodString;
4
+ buyTokenSymbol: z.ZodString;
5
+ sellAmount: z.ZodNumber;
6
+ }, "strip", z.ZodTypeAny, {
7
+ sellTokenSymbol: string;
8
+ buyTokenSymbol: string;
9
+ sellAmount: number;
10
+ }, {
11
+ sellTokenSymbol: string;
12
+ buyTokenSymbol: string;
13
+ sellAmount: number;
14
+ }>;
15
+ export declare const batchSwapSchema: z.ZodObject<{
16
+ sellTokenSymbols: z.ZodArray<z.ZodString, "many">;
17
+ buyTokenSymbols: z.ZodArray<z.ZodString, "many">;
18
+ sellAmounts: z.ZodArray<z.ZodNumber, "many">;
19
+ }, "strip", z.ZodTypeAny, {
20
+ sellTokenSymbols: string[];
21
+ buyTokenSymbols: string[];
22
+ sellAmounts: number[];
23
+ }, {
24
+ sellTokenSymbols: string[];
25
+ buyTokenSymbols: string[];
26
+ sellAmounts: number[];
27
+ }>;
28
+ export declare const routeSchema: z.ZodObject<{
29
+ sellTokenSymbol: z.ZodString;
30
+ buyTokenSymbol: z.ZodString;
31
+ sellAmount: z.ZodNumber;
32
+ }, "strip", z.ZodTypeAny, {
33
+ sellTokenSymbol: string;
34
+ buyTokenSymbol: string;
35
+ sellAmount: number;
36
+ }, {
37
+ sellTokenSymbol: string;
38
+ buyTokenSymbol: string;
39
+ sellAmount: number;
40
+ }>;
41
+ export type RouteSchemaType = z.infer<typeof routeSchema>;
@@ -0,0 +1,25 @@
1
+ import z from 'zod';
2
+ export const swapSchema = z.object({
3
+ sellTokenSymbol: z
4
+ .string()
5
+ .describe("Symbol of the token to sell (e.g., 'ETH', 'USDC')"),
6
+ buyTokenSymbol: z
7
+ .string()
8
+ .describe("Symbol of the token to buy (e.g., 'ETH', 'USDC')"),
9
+ sellAmount: z.number().positive().describe('Amount of tokens to sell'),
10
+ });
11
+ export const batchSwapSchema = z.object({
12
+ sellTokenSymbols: z.array(z.string()).describe('Symbols of tokens to sell'),
13
+ buyTokenSymbols: z.array(z.string()).describe('Symbols of tokens to buy'),
14
+ sellAmounts: z.array(z.number()).describe('Amounts of tokens to sell'),
15
+ });
16
+ export const routeSchema = z.object({
17
+ sellTokenSymbol: z
18
+ .string()
19
+ .describe("Symbol of the token to sell (e.g., 'ETH', 'USDC')"),
20
+ buyTokenSymbol: z
21
+ .string()
22
+ .describe("Symbol of the token to buy (e.g., 'ETH', 'USDC')"),
23
+ sellAmount: z.number().positive().describe('Amount of tokens to sell'),
24
+ });
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,CAAC,MAAM,CAAC;IACjC,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,CAAC,mDAAmD,CAAC;IAChE,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACvE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAC3E,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACzE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;CACvE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,eAAe,EAAE,CAAC;SACf,MAAM,EAAE;SACR,QAAQ,CAAC,mDAAmD,CAAC;IAChE,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACvE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Account, Call } from 'starknet';
2
+ export declare class ApprovalService {
3
+ private fibrous;
4
+ constructor();
5
+ checkAndGetApproveToken(account: Account, tokenAddress: string, spenderAddress: string, amount: string): Promise<Call | null>;
6
+ }
@@ -0,0 +1,39 @@
1
+ import { Contract } from 'starknet';
2
+ import { ERC20_ABI } from '../lib/abis/erc20Abi.js';
3
+ import { Router } from 'fibrous-router-sdk';
4
+ import { BigNumber } from '@ethersproject/bignumber';
5
+ export class ApprovalService {
6
+ constructor() {
7
+ this.fibrous = new Router();
8
+ }
9
+ async checkAndGetApproveToken(account, tokenAddress, spenderAddress, amount) {
10
+ try {
11
+ const contract = new Contract(ERC20_ABI, tokenAddress, account);
12
+ const allowanceResult = await contract.allowance(account.address, spenderAddress);
13
+ let currentAllowance;
14
+ if (Array.isArray(allowanceResult)) {
15
+ currentAllowance = BigInt(allowanceResult[0].toString());
16
+ }
17
+ else if (typeof allowanceResult === 'object' &&
18
+ allowanceResult !== null) {
19
+ const value = Object.values(allowanceResult)[0];
20
+ currentAllowance = BigInt(value.toString());
21
+ }
22
+ else {
23
+ currentAllowance = BigInt(allowanceResult.toString());
24
+ }
25
+ const requiredAmount = BigInt(amount);
26
+ if (currentAllowance < requiredAmount) {
27
+ const calldata = await this.fibrous.buildApproveStarknet(BigNumber.from(amount), tokenAddress);
28
+ return calldata;
29
+ }
30
+ else {
31
+ return null;
32
+ }
33
+ }
34
+ catch (error) {
35
+ throw new Error(`Failed to approve token: ${error instanceof Error ? error.message : 'Unknown error'}`);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/tools/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,QAAQ,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,MAAM,OAAO,eAAe;IAE1B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,OAAgB,EAChB,YAAoB,EACpB,cAAsB,EACtB,MAAc;QAEd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;YAEhE,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,SAAS,CAC9C,OAAO,CAAC,OAAO,EACf,cAAc,CACf,CAAC;YAEF,IAAI,gBAAwB,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,IACL,OAAO,eAAe,KAAK,QAAQ;gBACnC,eAAe,KAAK,IAAI,EACxB,CAAC;gBACD,MAAM,KAAK,GAAQ,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAEtC,IAAI,gBAAgB,GAAG,cAAc,EAAE,CAAC;gBACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,CACtD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EACtB,YAAY,CACb,CAAC;gBAEF,OAAO,QAAQ,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACvF,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,62 @@
1
+ import { Router as FibrousRouter } from 'fibrous-router-sdk';
2
+ import { BigNumber } from '@ethersproject/bignumber';
3
+ import { BatchSwapParams } from '../lib/types/index.js';
4
+ import { onchainWrite } from '@kasarlabs/ask-starknet-core';
5
+ export declare class BatchSwapService {
6
+ private env;
7
+ private walletAddress;
8
+ private tokenService;
9
+ private approvalService;
10
+ private router;
11
+ constructor(env: onchainWrite, walletAddress: string, routerInstance?: FibrousRouter);
12
+ initialize(): Promise<void>;
13
+ extractBatchSwapParams(params: BatchSwapParams): {
14
+ sellTokenAddresses: string[];
15
+ buyTokenAddresses: string[];
16
+ sellAmounts: BigNumber[];
17
+ };
18
+ executeSwapTransaction(params: BatchSwapParams): Promise<{
19
+ status: string;
20
+ message: string;
21
+ transactionHash: string;
22
+ sellAmounts: number[] | BigNumber[];
23
+ sellTokenSymbols: string[];
24
+ buyTokenSymbols: string[];
25
+ receipt: import("starknet").TransactionReceipt;
26
+ events: Event[];
27
+ error?: undefined;
28
+ } | {
29
+ status: string;
30
+ error: string;
31
+ message?: undefined;
32
+ transactionHash?: undefined;
33
+ sellAmounts?: undefined;
34
+ sellTokenSymbols?: undefined;
35
+ buyTokenSymbols?: undefined;
36
+ receipt?: undefined;
37
+ events?: undefined;
38
+ }>;
39
+ private monitorSwapStatus;
40
+ }
41
+ export declare const createSwapService: (env: onchainWrite, walletAddress?: string) => BatchSwapService;
42
+ export declare const batchSwapTokens: (env: onchainWrite, params: BatchSwapParams) => Promise<{
43
+ status: string;
44
+ message: string;
45
+ transactionHash: string;
46
+ sellAmounts: number[] | BigNumber[];
47
+ sellTokenSymbols: string[];
48
+ buyTokenSymbols: string[];
49
+ receipt: import("starknet").TransactionReceipt;
50
+ events: Event[];
51
+ error?: undefined;
52
+ } | {
53
+ status: string;
54
+ error: string;
55
+ message?: undefined;
56
+ transactionHash?: undefined;
57
+ sellAmounts?: undefined;
58
+ sellTokenSymbols?: undefined;
59
+ buyTokenSymbols?: undefined;
60
+ receipt?: undefined;
61
+ events?: undefined;
62
+ }>;
@@ -0,0 +1,120 @@
1
+ import { Account, constants } from 'starknet';
2
+ import { ApprovalService } from './approval.js';
3
+ import { TokenService } from './fetchTokens.js';
4
+ import { Router as FibrousRouter } from 'fibrous-router-sdk';
5
+ import { BigNumber } from '@ethersproject/bignumber';
6
+ import { getV3DetailsPayload } from '../lib/utils/utils.js';
7
+ import { TransactionMonitor } from '../lib/utils/transactionMonitor.js';
8
+ import { SLIPPAGE_PERCENTAGE } from '../lib/constants/index.js';
9
+ export class BatchSwapService {
10
+ constructor(env, walletAddress, routerInstance) {
11
+ this.env = env;
12
+ this.walletAddress = walletAddress;
13
+ this.tokenService = new TokenService();
14
+ this.approvalService = new ApprovalService();
15
+ this.router = routerInstance || new FibrousRouter();
16
+ }
17
+ async initialize() {
18
+ await this.tokenService.initializeTokens();
19
+ }
20
+ extractBatchSwapParams(params) {
21
+ const sellTokens = [];
22
+ const buyTokens = [];
23
+ const sellAmounts = [];
24
+ for (let i = 0; i < params.sellTokenSymbols.length; i++) {
25
+ const { sellToken, buyToken } = this.tokenService.validateTokenPair(params.sellTokenSymbols[i], params.buyTokenSymbols[i]);
26
+ const sellAmount = BigNumber.from(params.sellAmounts[i]);
27
+ sellTokens.push(sellToken.address);
28
+ buyTokens.push(buyToken.address);
29
+ sellAmounts.push(sellAmount);
30
+ }
31
+ return {
32
+ sellTokenAddresses: sellTokens,
33
+ buyTokenAddresses: buyTokens,
34
+ sellAmounts: sellAmounts,
35
+ };
36
+ }
37
+ async executeSwapTransaction(params) {
38
+ try {
39
+ await this.initialize();
40
+ const provider = this.env.provider;
41
+ const account = new Account(provider, this.walletAddress, this.env.account.signer, undefined, constants.TRANSACTION_VERSION.V3);
42
+ const swapParams = this.extractBatchSwapParams(params);
43
+ const routes = [];
44
+ for (let i = 0; i < swapParams.sellAmounts.length; i++) {
45
+ const route = await this.router.getBestRoute(swapParams.sellAmounts[i], swapParams.sellTokenAddresses[i], swapParams.buyTokenAddresses[i], 'starknet');
46
+ routes.push(route);
47
+ }
48
+ for (let i = 0; i < routes.length; i++) {
49
+ console.error(`${i}. Route information: `, {
50
+ sellToken: params.sellTokenSymbols[i],
51
+ buyToken: params.buyTokenSymbols[i],
52
+ sellAmount: params.sellAmounts[i],
53
+ buyAmount: routes[i] && routes[i].success
54
+ ? routes[i].outputAmount
55
+ : 'N/A',
56
+ });
57
+ }
58
+ const destinationAddress = account.address;
59
+ const swapCalls = await this.router.buildBatchTransaction(swapParams.sellAmounts, swapParams.sellTokenAddresses, swapParams.buyTokenAddresses, SLIPPAGE_PERCENTAGE, destinationAddress, 'starknet');
60
+ if (!swapCalls) {
61
+ throw new Error('Calldata not available for this swap');
62
+ }
63
+ let calldata = [];
64
+ for (let i = 0; i < swapCalls.length; i++) {
65
+ const approveCall = await this.approvalService.checkAndGetApproveToken(account, swapParams.sellTokenAddresses[i], this.router.STARKNET_ROUTER_ADDRESS, swapParams.sellAmounts[i].toString());
66
+ if (approveCall) {
67
+ calldata = [approveCall, swapCalls[i]];
68
+ }
69
+ else {
70
+ calldata = [swapCalls[i]];
71
+ }
72
+ }
73
+ const swapResult = await account.execute(calldata, getV3DetailsPayload());
74
+ const { receipt, events } = await this.monitorSwapStatus(swapResult.transaction_hash);
75
+ return {
76
+ status: 'success',
77
+ message: `Successfully swapped ${params.sellAmounts} ${params.sellTokenSymbols} for ${params.buyTokenSymbols}`,
78
+ transactionHash: swapResult.transaction_hash,
79
+ sellAmounts: params.sellAmounts,
80
+ sellTokenSymbols: params.sellTokenSymbols,
81
+ buyTokenSymbols: params.buyTokenSymbols,
82
+ receipt,
83
+ events,
84
+ };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ status: 'failure',
89
+ error: error instanceof Error ? error.message : 'Unknown error',
90
+ };
91
+ }
92
+ }
93
+ async monitorSwapStatus(txHash) {
94
+ const transactionMonitor = new TransactionMonitor(this.env.provider);
95
+ const receipt = await transactionMonitor.waitForTransaction(txHash, (status) => console.error('Swap status:', status));
96
+ const events = await transactionMonitor.getTransactionEvents(txHash);
97
+ return { receipt, events };
98
+ }
99
+ }
100
+ export const createSwapService = (env, walletAddress) => {
101
+ if (!walletAddress) {
102
+ throw new Error('Wallet address not configured');
103
+ }
104
+ return new BatchSwapService(env, walletAddress);
105
+ };
106
+ export const batchSwapTokens = async (env, params) => {
107
+ const accountAddress = env.account?.address;
108
+ try {
109
+ const swapService = createSwapService(env, accountAddress);
110
+ const result = await swapService.executeSwapTransaction(params);
111
+ return result;
112
+ }
113
+ catch (error) {
114
+ return {
115
+ status: 'failure',
116
+ error: error instanceof Error ? error.message : 'Unknown error',
117
+ };
118
+ }
119
+ };
120
+ //# sourceMappingURL=batchSwap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchSwap.js","sourceRoot":"","sources":["../../src/tools/batchSwap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { RouteResponse } from 'fibrous-router-sdk';
2
+ import { RouteSchemaType } from '../schemas/index.js';
3
+ export interface RouteResult {
4
+ status: 'success' | 'failure';
5
+ route?: RouteResponse | null;
6
+ error?: string;
7
+ }
8
+ export declare class RouteFetchService {
9
+ private tokenService;
10
+ private router;
11
+ constructor();
12
+ initialize(): Promise<void>;
13
+ fetchRoute(params: RouteSchemaType): Promise<RouteResult>;
14
+ }
15
+ export declare const getRouteFibrous: (params: RouteSchemaType) => Promise<RouteResult>;
@@ -0,0 +1,57 @@
1
+ import { TokenService } from './fetchTokens.js';
2
+ import { Router as FibrousRouter } from 'fibrous-router-sdk';
3
+ import { BigNumber } from '@ethersproject/bignumber';
4
+ export class RouteFetchService {
5
+ constructor() {
6
+ this.tokenService = new TokenService();
7
+ this.router = new FibrousRouter();
8
+ }
9
+ async initialize() {
10
+ await this.tokenService.initializeTokens();
11
+ }
12
+ async fetchRoute(params) {
13
+ try {
14
+ await this.initialize();
15
+ const { sellToken, buyToken } = this.tokenService.validateTokenPair(params.sellTokenSymbol, params.buyTokenSymbol);
16
+ const formattedAmount = BigInt(params.sellAmount.toString());
17
+ const route = await this.router.getBestRoute(BigNumber.from(formattedAmount.toString()), sellToken.address, buyToken.address, 'starknet');
18
+ if (!route?.success) {
19
+ return {
20
+ status: 'failure',
21
+ error: 'No routes available for this swap',
22
+ };
23
+ }
24
+ if (!route) {
25
+ return {
26
+ status: 'failure',
27
+ error: 'No valid route found in quote',
28
+ };
29
+ }
30
+ return {
31
+ status: 'success',
32
+ route,
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ status: 'failure',
38
+ error: error instanceof Error ? error.message : 'Unknown error',
39
+ };
40
+ }
41
+ }
42
+ }
43
+ export const getRouteFibrous = async (params) => {
44
+ try {
45
+ const tokenService = new TokenService();
46
+ await tokenService.initializeTokens();
47
+ const routeService = new RouteFetchService();
48
+ return routeService.fetchRoute(params);
49
+ }
50
+ catch (error) {
51
+ return {
52
+ status: 'failure',
53
+ error: error instanceof Error ? error.message : 'Unknown error',
54
+ };
55
+ }
56
+ };
57
+ //# sourceMappingURL=fetchRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchRoute.js","sourceRoot":"","sources":["../../src/tools/fetchRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,IAAI,aAAa,EAAiB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AASrD,MAAM,OAAO,iBAAiB;IAI5B;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAuB;QACtC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAExB,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CACjE,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,cAAc,CACtB,CAAC;YAEF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAC1C,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,EAC1C,SAAS,CAAC,OAAO,EACjB,QAAQ,CAAC,OAAO,EAChB,UAAU,CACX,CAAC;YAEF,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;gBACpB,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,mCAAmC;iBAC3C,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,+BAA+B;iBACvC,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,KAAK;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,MAAuB,EACD,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC7C,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}