@kasarlabs/erc20-mcp 0.1.0 → 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.
@@ -0,0 +1,156 @@
1
+ import { Contract } from 'starknet';
2
+ import { detectAbiType } from '../lib/utils/utils.js';
3
+ import { validateAndParseAddress } from 'starknet';
4
+ import { OLD_ERC20_ABI } from '../lib/abis/old.js';
5
+ import { shortString } from 'starknet';
6
+ function decodeCairoString(words) {
7
+ if (!words?.length)
8
+ return 'UNKNOWN';
9
+ const len = parseInt(words[0], 16);
10
+ if (isNaN(len) || len < 0 || len > 1000)
11
+ return 'UNKNOWN';
12
+ const data = words.slice(1, 1 + len);
13
+ if (data.length !== len)
14
+ return 'UNKNOWN';
15
+ try {
16
+ return data.map((w) => shortString.decodeShortString(w)).join('');
17
+ }
18
+ catch {
19
+ return 'UNKNOWN';
20
+ }
21
+ }
22
+ function decodeMaybeShortString(word) {
23
+ try {
24
+ const decoded = shortString.decodeShortString(word);
25
+ if (!decoded || decoded.trim() === '') {
26
+ return 'UNKNOWN';
27
+ }
28
+ return decoded;
29
+ }
30
+ catch {
31
+ return 'UNKNOWN';
32
+ }
33
+ }
34
+ function decodeByteArray(byteArray) {
35
+ try {
36
+ if (typeof byteArray === 'string') {
37
+ return byteArray.trim() === '' ? 'UNKNOWN' : byteArray;
38
+ }
39
+ if (byteArray && typeof byteArray === 'object') {
40
+ let result = '';
41
+ if (Array.isArray(byteArray.data)) {
42
+ for (const bytes31 of byteArray.data) {
43
+ try {
44
+ result += shortString.decodeShortString(bytes31);
45
+ }
46
+ catch {
47
+ }
48
+ }
49
+ }
50
+ if (byteArray.pending_word && Number(byteArray.pending_word_len) > 0) {
51
+ try {
52
+ const pendingWord = shortString.decodeShortString(byteArray.pending_word);
53
+ result += pendingWord.substring(0, Number(byteArray.pending_word_len));
54
+ }
55
+ catch {
56
+ }
57
+ }
58
+ return result.trim() === '' ? 'UNKNOWN' : result;
59
+ }
60
+ return 'UNKNOWN';
61
+ }
62
+ catch {
63
+ return 'UNKNOWN';
64
+ }
65
+ }
66
+ async function callSymbolRaw(provider, address, entrypoint) {
67
+ const res = await provider.callContract({
68
+ contractAddress: address,
69
+ entrypoint,
70
+ calldata: [],
71
+ });
72
+ return Array.isArray(res) ? res : (res?.result ?? []);
73
+ }
74
+ export const getSymbol = async (env, params) => {
75
+ try {
76
+ if (!params?.assetAddress) {
77
+ throw new Error('Asset address is required');
78
+ }
79
+ const provider = env.provider;
80
+ const address = validateAndParseAddress(params.assetAddress);
81
+ const abi = await detectAbiType(address, provider);
82
+ const contract = new Contract(abi, address, provider);
83
+ let out = [];
84
+ try {
85
+ out = await callSymbolRaw(provider, address, 'symbol');
86
+ }
87
+ catch {
88
+ out = await callSymbolRaw(provider, address, 'get_symbol');
89
+ }
90
+ let symbol = 'UNKNOWN';
91
+ const isNewABI = abi !== OLD_ERC20_ABI;
92
+ if (out.length === 1) {
93
+ symbol = decodeMaybeShortString(out[0]);
94
+ }
95
+ else if (out.length > 1) {
96
+ if (isNewABI) {
97
+ try {
98
+ const dataLen = parseInt(out[0], 16) || 0;
99
+ symbol = decodeByteArray({
100
+ data: out.slice(1, 1 + dataLen),
101
+ pending_word: out[1 + dataLen],
102
+ pending_word_len: parseInt(out[2 + dataLen], 16) || 0,
103
+ });
104
+ }
105
+ catch {
106
+ symbol = decodeCairoString(out);
107
+ }
108
+ }
109
+ else {
110
+ symbol = decodeCairoString(out);
111
+ }
112
+ }
113
+ else {
114
+ try {
115
+ const r = await contract.symbol();
116
+ if (typeof r === 'string') {
117
+ symbol = r.trim() === '' ? 'UNKNOWN' : r;
118
+ }
119
+ else if (typeof r === 'bigint') {
120
+ symbol = decodeMaybeShortString('0x' + r.toString(16));
121
+ }
122
+ else if (typeof r === 'object' && r != null) {
123
+ if (isNewABI && ('data' in r || 'pending_word' in r)) {
124
+ symbol = decodeByteArray(r);
125
+ }
126
+ else {
127
+ const maybe = (r.symbol ?? r.res ?? r.value);
128
+ if (typeof maybe === 'string') {
129
+ symbol =
130
+ maybe.trim() === '' ? 'UNKNOWN' : decodeMaybeShortString(maybe);
131
+ }
132
+ else if (maybe && typeof maybe === 'object') {
133
+ symbol = decodeByteArray(maybe);
134
+ }
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ }
140
+ }
141
+ if (symbol !== 'UNKNOWN' && symbol.trim() !== '') {
142
+ symbol = symbol.toUpperCase();
143
+ }
144
+ else {
145
+ symbol = 'UNKNOWN';
146
+ }
147
+ return { status: 'success', symbol };
148
+ }
149
+ catch (error) {
150
+ return {
151
+ status: 'failure',
152
+ error: error instanceof Error ? error.message : 'Unknown error',
153
+ };
154
+ }
155
+ };
156
+ //# sourceMappingURL=getSymbol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSymbol.js","sourceRoot":"","sources":["../../src/tools/getSymbol.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import { onchainWrite } from '@kasarlabs/ask-starknet-core';
1
+ import { RpcProvider } from 'starknet';
2
+ import { onchainRead } from '@kasarlabs/ask-starknet-core';
2
3
  import { z } from 'zod';
3
4
  import { getTotalSupplySchema } from '../schemas/index.js';
4
- export declare const getTotalSupply: (env: onchainWrite, params: z.infer<typeof getTotalSupplySchema>) => Promise<{
5
+ export declare function callTotalSupplyRaw(provider: RpcProvider, address: string): Promise<bigint>;
6
+ export declare const getTotalSupply: (env: onchainRead, params: z.infer<typeof getTotalSupplySchema>) => Promise<{
5
7
  status: string;
6
8
  totalSupply: string;
7
- symbol: string;
8
9
  error?: undefined;
9
10
  } | {
10
11
  status: string;
11
12
  error: string;
12
13
  totalSupply?: undefined;
13
- symbol?: undefined;
14
14
  }>;
@@ -1,18 +1,47 @@
1
- import { Contract } from 'starknet';
2
- import { validateToken, formatBalance, detectAbiType, extractAssetInfo, } from '../lib/utils/utils.js';
1
+ import { validateToken, formatBalance, uint256HexToBigInt, } from '../lib/utils/utils.js';
2
+ export async function callTotalSupplyRaw(provider, address) {
3
+ const entrypoints = ['totalSupply', 'total_supply', 'get_total_supply'];
4
+ let lastErr = null;
5
+ for (const entrypoint of entrypoints) {
6
+ try {
7
+ const res = await provider.callContract({
8
+ contractAddress: address,
9
+ entrypoint,
10
+ calldata: [],
11
+ });
12
+ const out = Array.isArray(res)
13
+ ? res
14
+ : Array.isArray(res?.result)
15
+ ? res.result
16
+ : [];
17
+ if (out.length === 2) {
18
+ return uint256HexToBigInt(out[0], out[1]);
19
+ }
20
+ if (out.length > 2) {
21
+ throw new Error(`Invalid totalSupply response: expected Uint256 (2 values), got ${out.length} values. ` +
22
+ `This may indicate a malformed contract response.`);
23
+ }
24
+ if (out.length === 1) {
25
+ throw new Error(`Invalid totalSupply response: expected Uint256 (2 values), got 1 value. ` +
26
+ `This may indicate a malformed contract response or non-standard implementation.`);
27
+ }
28
+ }
29
+ catch (e) {
30
+ lastErr = e;
31
+ }
32
+ }
33
+ throw new Error(`totalSupply not found or unreadable on ${address} ` +
34
+ (lastErr instanceof Error ? `(${lastErr.message})` : ''));
35
+ }
3
36
  export const getTotalSupply = async (env, params) => {
4
37
  try {
5
38
  const provider = env.provider;
6
- const { assetSymbol, assetAddress } = extractAssetInfo(params.asset);
7
- const token = await validateToken(provider, assetSymbol, assetAddress);
8
- const abi = await detectAbiType(token.address, provider);
9
- const tokenContract = new Contract(abi, token.address, provider);
10
- const totalSupply = await tokenContract.total_supply();
39
+ const token = await validateToken(provider, params.asset.assetAddress, params.asset.assetSymbol);
40
+ const totalSupply = await callTotalSupplyRaw(provider, token.address);
11
41
  const formattedSupply = formatBalance(totalSupply, token.decimals);
12
42
  return {
13
43
  status: 'success',
14
44
  totalSupply: formattedSupply,
15
- symbol: token.symbol,
16
45
  };
17
46
  }
18
47
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"getTotalSupply.js","sourceRoot":"","sources":["../../src/tools/getTotalSupply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAY/B,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAiB,EACjB,MAA4C,EAC5C,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErE,MAAM,KAAK,GAAe,MAAM,aAAa,CAC3C,QAAQ,EACR,WAAW,EACX,YAAY,CACb,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEzD,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,CAAC;QAEvD,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,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"}
1
+ {"version":3,"file":"getTotalSupply.js","sourceRoot":"","sources":["../../src/tools/getTotalSupply.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAc/B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAqB,EACrB,OAAe;IAEf,MAAM,WAAW,GAEb,CAAC,aAAa,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAExD,IAAI,OAAO,GAAY,IAAI,CAAC;IAE5B,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC;gBACtC,eAAe,EAAE,OAAO;gBACxB,UAAU;gBACV,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YAGH,MAAM,GAAG,GAAa,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBACtC,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,GAAW,EAAE,MAAM,CAAC;oBACnC,CAAC,CAAE,GAAW,CAAC,MAAM;oBACrB,CAAC,CAAC,EAAE,CAAC;YAET,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,kEAAkE,GAAG,CAAC,MAAM,WAAW;oBACrF,kDAAkD,CACrD,CAAC;YACJ,CAAC;YAID,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CACb,0EAA0E;oBACxE,iFAAiF,CACpF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAGD,MAAM,IAAI,KAAK,CACb,0CAA0C,OAAO,GAAG;QAClD,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3D,CAAC;AACJ,CAAC;AAeD,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAgB,EAChB,MAA4C,EAC5C,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,MAAM,KAAK,GAAe,MAAM,aAAa,CAC3C,QAAQ,EACR,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,WAAW,CACzB,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEtE,MAAM,eAAe,GAAG,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,eAAe;SAC7B,CAAC;IACJ,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"}
@@ -1,10 +1,10 @@
1
1
  import { onchainWrite } from '@kasarlabs/ask-starknet-core';
2
2
  import { z } from 'zod';
3
3
  import { transferSchema } from '../schemas/index.js';
4
- export declare const transfer: (env: onchainWrite, params: z.infer<typeof transferSchema>) => Promise<string | {
4
+ import { TransferResult } from '../lib/types/types.js';
5
+ export declare const transfer: (env: onchainWrite, params: z.infer<typeof transferSchema>) => Promise<TransferResult | {
5
6
  status: string;
6
7
  amount: string;
7
- symbol: string;
8
8
  recipients_address: string;
9
9
  transaction_hash: string;
10
10
  }>;
@@ -1,11 +1,10 @@
1
1
  import { Contract } from 'starknet';
2
- import { validateAndFormatParams, executeV3Transaction, validateToken, detectAbiType, extractAssetInfo, } from '../lib/utils/utils.js';
2
+ import { validateAndFormatParams, executeV3Transaction, validateToken, detectAbiType, } from '../lib/utils/utils.js';
3
3
  export const transfer = async (env, params) => {
4
4
  try {
5
5
  const provider = env.provider;
6
6
  const account = env.account;
7
- const { assetSymbol, assetAddress } = extractAssetInfo(params.asset);
8
- const token = await validateToken(provider, assetSymbol, assetAddress);
7
+ const token = await validateToken(provider, params.asset.assetAddress, params.asset.assetSymbol);
9
8
  const abi = await detectAbiType(token.address, provider);
10
9
  const { address, amount } = validateAndFormatParams(params.recipientAddress, params.amount, token.decimals);
11
10
  const recipientAddress = address;
@@ -29,7 +28,6 @@ export const transfer = async (env, params) => {
29
28
  return {
30
29
  status: 'success',
31
30
  amount: params.amount,
32
- symbol: token.symbol,
33
31
  recipients_address: recipientAddress,
34
32
  transaction_hash: txH,
35
33
  };
@@ -40,7 +38,7 @@ export const transfer = async (env, params) => {
40
38
  error: error instanceof Error ? error.message : 'Unknown error',
41
39
  step: 'transfer execution',
42
40
  };
43
- return JSON.stringify(transferResult);
41
+ return transferResult;
44
42
  }
45
43
  };
46
44
  //# sourceMappingURL=transfer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/tools/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAc/B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,GAAiB,EACjB,MAAsC,EACtC,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAE5B,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErE,MAAM,KAAK,GAAe,MAAM,aAAa,CAC3C,QAAQ,EACR,WAAW,EACX,YAAY,CACb,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,uBAAuB,CACjD,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,MAAM,EACb,KAAK,CAAC,QAAQ,CACf,CAAC;QAEF,MAAM,gBAAgB,GAAG,OAAO,CAAC;QAGjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,+FAA+F,OAAO,CAAC,OAAO,YAAY,KAAK,CAAC,OAAO,EAAE,CAC1I,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5D,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE;YAC7C,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;YACrC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,kBAAkB,EAAE,gBAAgB;YACpC,gBAAgB,EAAE,GAAG;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,GAAmB;YACrC,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;YAC/D,IAAI,EAAE,oBAAoB;SAC3B,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/tools/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAc/B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,GAAiB,EACjB,MAAsC,EACtC,EAAE;IACF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAE5B,MAAM,KAAK,GAAe,MAAM,aAAa,CAC3C,QAAQ,EACR,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,WAAW,CACzB,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,uBAAuB,CACjD,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,MAAM,EACb,KAAK,CAAC,QAAQ,CACf,CAAC;QAEF,MAAM,gBAAgB,GAAG,OAAO,CAAC;QAGjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,+FAA+F,OAAO,CAAC,OAAO,YAAY,KAAK,CAAC,OAAO,EAAE,CAC1I,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5D,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE;YAC7C,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;YACrC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,kBAAkB,EAAE,gBAAgB;YACpC,gBAAgB,EAAE,GAAG;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,GAAmB;YACrC,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;YAC/D,IAAI,EAAE,oBAAoB;SAC3B,CAAC;QACF,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC,CAAC"}
@@ -1,11 +1,10 @@
1
1
  import { Contract, validateAndParseAddress, } from 'starknet';
2
- import { validateAndFormatParams, executeV3Transaction, validateToken, detectAbiType, extractAssetInfo, } from '../lib/utils/utils.js';
2
+ import { validateAndFormatParams, executeV3Transaction, validateToken, detectAbiType, } from '../lib/utils/utils.js';
3
3
  export const transferFrom = async (env, params) => {
4
4
  try {
5
5
  const account = env.account;
6
6
  const provider = env.provider;
7
- const { assetSymbol, assetAddress } = extractAssetInfo(params.asset);
8
- const token = await validateToken(provider, assetSymbol, assetAddress);
7
+ const token = await validateToken(provider, params.asset.assetAddress, params.asset.assetSymbol);
9
8
  const abi = await detectAbiType(token.address, provider);
10
9
  const { address, amount } = validateAndFormatParams(params.fromAddress, params.amount, token.decimals);
11
10
  const fromAddress = address;
@@ -1 +1 @@
1
- {"version":3,"file":"transferFrom.js","sourceRoot":"","sources":["../../src/tools/transferFrom.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,uBAAuB,GAExB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAe/B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,GAAiB,EACjB,MAA0C,EAC1C,EAAE;IACF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErE,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,uBAAuB,CACjD,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,MAAM,EACb,KAAK,CAAC,QAAQ,CACf,CAAC;QAEF,MAAM,WAAW,GAAG,OAAO,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE5D,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE;YAClD,WAAW;YACX,SAAS;YACT,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;YACrC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,GAAG;SACrB,CAAC;IACJ,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"}
1
+ {"version":3,"file":"transferFrom.js","sourceRoot":"","sources":["../../src/tools/transferFrom.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,uBAAuB,GAExB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAe/B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,GAAiB,EACjB,MAA0C,EAC1C,EAAE;IACF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE9B,MAAM,KAAK,GAAG,MAAM,aAAa,CAC/B,QAAQ,EACR,MAAM,CAAC,KAAK,CAAC,YAAY,EACzB,MAAM,CAAC,KAAK,CAAC,WAAW,CACzB,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,uBAAuB,CACjD,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,MAAM,EACb,KAAK,CAAC,QAAQ,CACf,CAAC;QAEF,MAAM,WAAW,GAAG,OAAO,CAAC;QAC5B,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE5D,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE;YAClD,WAAW;YACX,SAAS;YACT,MAAM;SACP,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;YACrC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,eAAe,EAAE,GAAG;SACrB,CAAC;IACJ,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kasarlabs/erc20-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "main": "index.js",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,7 +16,7 @@
16
16
  "build"
17
17
  ],
18
18
  "dependencies": {
19
- "@kasarlabs/ask-starknet-core": "0.1.0",
19
+ "@kasarlabs/ask-starknet-core": "0.1.1",
20
20
  "@langchain/core": "^0.3.42",
21
21
  "@modelcontextprotocol/sdk": "^1.11.2",
22
22
  "dotenv": "^16.4.7",
@@ -39,5 +39,5 @@
39
39
  "publishConfig": {
40
40
  "access": "public"
41
41
  },
42
- "gitHead": "2239ec60f8e369abd318807cecd22fe97c0ab917"
42
+ "gitHead": "4212f968456c2a170aac99306a899ae43458e23c"
43
43
  }