web3-tools-mcp 2.0.2 → 3.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 (180) hide show
  1. package/CHANGELOG.md +182 -1
  2. package/README.md +76 -47
  3. package/dist/anvil.d.ts +17 -19
  4. package/dist/anvil.d.ts.map +1 -1
  5. package/dist/anvil.js +124 -228
  6. package/dist/anvil.js.map +1 -1
  7. package/dist/chain-meta.d.ts.map +1 -1
  8. package/dist/chain-meta.js +19 -8
  9. package/dist/chain-meta.js.map +1 -1
  10. package/dist/chains.d.ts +9 -1
  11. package/dist/chains.d.ts.map +1 -1
  12. package/dist/chains.js +11 -2
  13. package/dist/chains.js.map +1 -1
  14. package/dist/clear-signing.d.ts.map +1 -1
  15. package/dist/clear-signing.js +17 -6
  16. package/dist/clear-signing.js.map +1 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js.map +1 -1
  19. package/dist/context.d.ts +22 -0
  20. package/dist/context.d.ts.map +1 -0
  21. package/dist/context.js +24 -0
  22. package/dist/context.js.map +1 -0
  23. package/dist/hosted.d.ts +12 -0
  24. package/dist/hosted.d.ts.map +1 -0
  25. package/dist/hosted.js +12 -0
  26. package/dist/hosted.js.map +1 -0
  27. package/dist/http-server.d.ts +13 -0
  28. package/dist/http-server.d.ts.map +1 -1
  29. package/dist/http-server.js +22 -7
  30. package/dist/http-server.js.map +1 -1
  31. package/dist/index.js +20 -12
  32. package/dist/index.js.map +1 -1
  33. package/dist/kv-storage.d.ts +2 -1
  34. package/dist/kv-storage.d.ts.map +1 -1
  35. package/dist/kv-storage.js +5 -2
  36. package/dist/kv-storage.js.map +1 -1
  37. package/dist/lib.d.ts +24 -0
  38. package/dist/lib.d.ts.map +1 -0
  39. package/dist/lib.js +23 -0
  40. package/dist/lib.js.map +1 -0
  41. package/dist/mcp-server.d.ts +4 -0
  42. package/dist/mcp-server.d.ts.map +1 -0
  43. package/dist/mcp-server.js +43 -0
  44. package/dist/mcp-server.js.map +1 -0
  45. package/dist/oauth.d.ts +57 -8
  46. package/dist/oauth.d.ts.map +1 -1
  47. package/dist/oauth.js +133 -63
  48. package/dist/oauth.js.map +1 -1
  49. package/dist/preview.d.ts +7 -0
  50. package/dist/preview.d.ts.map +1 -1
  51. package/dist/preview.js +21 -7
  52. package/dist/preview.js.map +1 -1
  53. package/dist/signing-requests.d.ts +81 -0
  54. package/dist/signing-requests.d.ts.map +1 -0
  55. package/dist/signing-requests.js +138 -0
  56. package/dist/signing-requests.js.map +1 -0
  57. package/dist/tools/index.d.ts +27 -1
  58. package/dist/tools/index.d.ts.map +1 -1
  59. package/dist/tools/index.js +50 -15
  60. package/dist/tools/index.js.map +1 -1
  61. package/dist/tools/{advanced.d.ts → read/advanced.d.ts} +39 -30
  62. package/dist/tools/read/advanced.d.ts.map +1 -0
  63. package/dist/tools/{advanced.js → read/advanced.js} +53 -41
  64. package/dist/tools/read/advanced.js.map +1 -0
  65. package/dist/tools/{balance.d.ts → read/balance.d.ts} +8 -7
  66. package/dist/tools/read/balance.d.ts.map +1 -0
  67. package/dist/tools/{balance.js → read/balance.js} +18 -33
  68. package/dist/tools/read/balance.js.map +1 -0
  69. package/dist/tools/{contract-info.d.ts → read/contract-info.d.ts} +20 -15
  70. package/dist/tools/read/contract-info.d.ts.map +1 -0
  71. package/dist/tools/{contract-info.js → read/contract-info.js} +54 -123
  72. package/dist/tools/read/contract-info.js.map +1 -0
  73. package/dist/tools/{contract.d.ts → read/contract.d.ts} +14 -12
  74. package/dist/tools/read/contract.d.ts.map +1 -0
  75. package/dist/tools/{contract.js → read/contract.js} +3 -2
  76. package/dist/tools/read/contract.js.map +1 -0
  77. package/dist/tools/read/ens.d.ts +104 -0
  78. package/dist/tools/read/ens.d.ts.map +1 -0
  79. package/dist/tools/{ens.js → read/ens.js} +25 -33
  80. package/dist/tools/read/ens.js.map +1 -0
  81. package/dist/tools/read/gas.d.ts +171 -0
  82. package/dist/tools/read/gas.d.ts.map +1 -0
  83. package/dist/tools/read/gas.js +333 -0
  84. package/dist/tools/read/gas.js.map +1 -0
  85. package/dist/tools/read/logs.d.ts +101 -0
  86. package/dist/tools/read/logs.d.ts.map +1 -0
  87. package/dist/tools/read/logs.js +211 -0
  88. package/dist/tools/read/logs.js.map +1 -0
  89. package/dist/tools/{signatures.d.ts → read/signatures.d.ts} +8 -4
  90. package/dist/tools/read/signatures.d.ts.map +1 -0
  91. package/dist/tools/{signatures.js → read/signatures.js} +4 -3
  92. package/dist/tools/read/signatures.js.map +1 -0
  93. package/dist/tools/read/signing.d.ts +27 -0
  94. package/dist/tools/read/signing.d.ts.map +1 -0
  95. package/dist/tools/read/signing.js +81 -0
  96. package/dist/tools/read/signing.js.map +1 -0
  97. package/dist/tools/sign/errors.d.ts +9 -0
  98. package/dist/tools/sign/errors.d.ts.map +1 -0
  99. package/dist/tools/sign/errors.js +29 -0
  100. package/dist/tools/sign/errors.js.map +1 -0
  101. package/dist/tools/sign/transactions.d.ts +141 -0
  102. package/dist/tools/sign/transactions.d.ts.map +1 -0
  103. package/dist/tools/sign/transactions.js +361 -0
  104. package/dist/tools/sign/transactions.js.map +1 -0
  105. package/dist/tools/sign/wallet.d.ts +50 -0
  106. package/dist/tools/sign/wallet.d.ts.map +1 -0
  107. package/dist/tools/sign/wallet.js +180 -0
  108. package/dist/tools/sign/wallet.js.map +1 -0
  109. package/dist/utils.d.ts +23 -2
  110. package/dist/utils.d.ts.map +1 -1
  111. package/dist/utils.js +48 -3
  112. package/dist/utils.js.map +1 -1
  113. package/dist/wallet-client.d.ts +34 -4
  114. package/dist/wallet-client.d.ts.map +1 -1
  115. package/dist/wallet-client.js +106 -27
  116. package/dist/wallet-client.js.map +1 -1
  117. package/dist/walletconnect.d.ts +100 -13
  118. package/dist/walletconnect.d.ts.map +1 -1
  119. package/dist/walletconnect.js +215 -50
  120. package/dist/walletconnect.js.map +1 -1
  121. package/package.json +12 -9
  122. package/src/anvil.ts +150 -271
  123. package/src/chain-meta.ts +16 -7
  124. package/src/chains.ts +14 -2
  125. package/src/clear-signing.ts +15 -9
  126. package/src/client.ts +0 -1
  127. package/src/context.ts +27 -0
  128. package/src/hosted.ts +11 -0
  129. package/src/http-server.ts +38 -8
  130. package/src/index.ts +20 -13
  131. package/src/kv-storage.ts +6 -3
  132. package/src/lib.ts +24 -0
  133. package/src/mcp-server.ts +47 -0
  134. package/src/oauth.ts +181 -69
  135. package/src/preview.ts +28 -7
  136. package/src/signing-requests.ts +198 -0
  137. package/src/tools/index.ts +78 -16
  138. package/src/tools/{advanced.ts → read/advanced.ts} +74 -43
  139. package/src/tools/{balance.ts → read/balance.ts} +20 -35
  140. package/src/tools/{contract-info.ts → read/contract-info.ts} +66 -146
  141. package/src/tools/{contract.ts → read/contract.ts} +4 -3
  142. package/src/tools/{ens.ts → read/ens.ts} +27 -34
  143. package/src/tools/read/gas.ts +443 -0
  144. package/src/tools/read/logs.ts +281 -0
  145. package/src/tools/{signatures.ts → read/signatures.ts} +5 -5
  146. package/src/tools/read/signing.ts +92 -0
  147. package/src/tools/sign/errors.ts +28 -0
  148. package/src/tools/sign/transactions.ts +479 -0
  149. package/src/tools/sign/wallet.ts +216 -0
  150. package/src/utils.ts +52 -3
  151. package/src/wallet-client.ts +107 -24
  152. package/src/walletconnect.ts +250 -48
  153. package/dist/tools/advanced.d.ts.map +0 -1
  154. package/dist/tools/advanced.js.map +0 -1
  155. package/dist/tools/balance.d.ts.map +0 -1
  156. package/dist/tools/balance.js.map +0 -1
  157. package/dist/tools/contract-info.d.ts.map +0 -1
  158. package/dist/tools/contract-info.js.map +0 -1
  159. package/dist/tools/contract.d.ts.map +0 -1
  160. package/dist/tools/contract.js.map +0 -1
  161. package/dist/tools/ens.d.ts +0 -119
  162. package/dist/tools/ens.d.ts.map +0 -1
  163. package/dist/tools/ens.js.map +0 -1
  164. package/dist/tools/gas.d.ts +0 -99
  165. package/dist/tools/gas.d.ts.map +0 -1
  166. package/dist/tools/gas.js +0 -181
  167. package/dist/tools/gas.js.map +0 -1
  168. package/dist/tools/logs.d.ts +0 -39
  169. package/dist/tools/logs.d.ts.map +0 -1
  170. package/dist/tools/logs.js +0 -230
  171. package/dist/tools/logs.js.map +0 -1
  172. package/dist/tools/signatures.d.ts.map +0 -1
  173. package/dist/tools/signatures.js.map +0 -1
  174. package/dist/tools/transactions.d.ts +0 -155
  175. package/dist/tools/transactions.d.ts.map +0 -1
  176. package/dist/tools/transactions.js +0 -365
  177. package/dist/tools/transactions.js.map +0 -1
  178. package/src/tools/gas.ts +0 -219
  179. package/src/tools/logs.ts +0 -293
  180. package/src/tools/transactions.ts +0 -456
@@ -1,8 +1,8 @@
1
1
  import { isAddress, namehash } from 'viem';
2
2
  import { normalize } from 'viem/ens';
3
3
  import { z } from 'zod';
4
- import { getClientManager, SUPPORTED_CHAINS } from '../client.js';
5
- import { createTool, formatResponse } from '../utils.js';
4
+ import { getClientManager } from '../../client.js';
5
+ import { createTool, formatResponse, MAX_BATCH } from '../../utils.js';
6
6
  // Base ENS Contract Addresses
7
7
  const BASE_ENS_CONTRACTS = {
8
8
  registry: '0xb94704422c2a1e396835a571837aa5ae53285a95',
@@ -143,29 +143,28 @@ async function getTextRecordBase(name, key) {
143
143
  return null;
144
144
  }
145
145
  }
146
+ /** Where a name service is deployed: ENS on mainnet, Linea Names on Linea, Basenames on Base. */
147
+ const ENS_CHAINS = ['mainnet', 'linea', 'base'];
148
+ const ensChain = z
149
+ .enum(ENS_CHAINS)
150
+ .default('mainnet')
151
+ .describe('Where the name lives: mainnet for .eth (ENS), linea for Linea Names, base for Basenames. Defaults to mainnet.');
146
152
  const EnsResolveSchema = z.object({
147
- chain: z
148
- .enum(SUPPORTED_CHAINS)
149
- .default('mainnet')
150
- .describe('Blockchain network (defaults to mainnet, as ENS is primarily on Ethereum)'),
151
- name: z.string().describe("ENS name to resolve to an address (e.g., 'vitalik.eth', 'example.eth')"),
152
- universalResolver: z.boolean().optional().describe('Use universal resolver for cross-chain resolution (defaults to true)')
153
+ chain: ensChain,
154
+ name: z.string().describe("ENS name to resolve to an address (e.g., 'vitalik.eth', 'example.eth')")
153
155
  });
154
156
  const EnsReverseResolveSchema = z.object({
155
- chain: z.enum(SUPPORTED_CHAINS).default('mainnet').describe('Blockchain network (defaults to mainnet)'),
156
- address: z.string().describe('Ethereum address to resolve to an ENS name'),
157
- universalResolver: z.boolean().optional().describe('Use universal resolver for cross-chain resolution (defaults to true)')
157
+ chain: ensChain,
158
+ address: z.string().describe('Ethereum address to resolve to an ENS name')
158
159
  });
159
160
  const EnsTextRecordSchema = z.object({
160
- chain: z.enum(SUPPORTED_CHAINS).default('mainnet').describe('Blockchain network (defaults to mainnet)'),
161
+ chain: ensChain,
161
162
  name: z.string().describe('ENS name to query text records from'),
162
- key: z.string().describe("Text record key (e.g., 'avatar', 'description', 'email', 'url', 'com.twitter', 'com.github')"),
163
- universalResolver: z.boolean().optional().describe('Use universal resolver for cross-chain resolution (defaults to true)')
163
+ key: z.string().describe("Text record key (e.g., 'avatar', 'description', 'email', 'url', 'com.twitter', 'com.github')")
164
164
  });
165
165
  const EnsBatchResolveSchema = z.object({
166
- chain: z.enum(SUPPORTED_CHAINS).default('mainnet').describe('Blockchain network (defaults to mainnet)'),
167
- names: z.array(z.string()).describe('Array of ENS names to resolve to addresses in a single batch'),
168
- universalResolver: z.boolean().optional().describe('Use universal resolver for cross-chain resolution (defaults to true)')
166
+ chain: ensChain,
167
+ names: z.array(z.string()).max(MAX_BATCH).describe('Array of ENS names to resolve to addresses in a single batch')
169
168
  });
170
169
  export default {
171
170
  resolve_ens_name: createTool('Resolve ENS Name to Address', 'Resolve an ENS name to its Ethereum address. ENS names are human-readable identifiers (like vitalik.eth) that resolve to Ethereum addresses.', EnsResolveSchema, async (args) => {
@@ -181,8 +180,7 @@ export default {
181
180
  const clientManager = getClientManager();
182
181
  const client = clientManager.getClient(args.chain);
183
182
  address = await client.getEnsAddress({
184
- name: normalizedName,
185
- universalResolverAddress: args.universalResolver !== false ? undefined : undefined
183
+ name: normalizedName
186
184
  });
187
185
  }
188
186
  if (!address) {
@@ -217,8 +215,7 @@ export default {
217
215
  const clientManager = getClientManager();
218
216
  const client = clientManager.getClient(args.chain);
219
217
  ensName = await client.getEnsName({
220
- address: args.address,
221
- universalResolverAddress: args.universalResolver !== false ? undefined : undefined
218
+ address: args.address
222
219
  });
223
220
  }
224
221
  if (!ensName) {
@@ -251,8 +248,7 @@ export default {
251
248
  const client = clientManager.getClient(args.chain);
252
249
  textRecord = await client.getEnsText({
253
250
  name: normalizedName,
254
- key: args.key,
255
- universalResolverAddress: args.universalResolver !== false ? undefined : undefined
251
+ key: args.key
256
252
  });
257
253
  }
258
254
  if (!textRecord) {
@@ -275,10 +271,9 @@ export default {
275
271
  chain: args.chain
276
272
  });
277
273
  }),
278
- get_ens_avatar: createTool('Get ENS Avatar', 'Get the avatar URI for an ENS name. Returns the avatar URL if set.', z.object({
279
- chain: z.enum(SUPPORTED_CHAINS).default('mainnet').describe('Blockchain network (defaults to mainnet)'),
280
- name: z.string().describe('ENS name to get avatar from'),
281
- universalResolver: z.boolean().optional().describe('Use universal resolver for cross-chain resolution (defaults to true)')
274
+ get_ens_avatar: createTool('Get ENS Avatar', 'Get the raw avatar text record for an ENS name: an https/ipfs URL, a data URI, or an NFT reference (eip155:1/erc721:0x…/1). It is not fetched or resolved to an image.', z.object({
275
+ chain: ensChain,
276
+ name: z.string().describe('ENS name to get avatar from')
282
277
  }), async (args) => {
283
278
  // Normalize the ENS name
284
279
  const normalizedName = normalize(args.name);
@@ -291,10 +286,8 @@ export default {
291
286
  // Use viem's built-in ENS resolution for other chains
292
287
  const clientManager = getClientManager();
293
288
  const client = clientManager.getClient(args.chain);
294
- avatar = await client.getEnsAvatar({
295
- name: normalizedName,
296
- universalResolverAddress: args.universalResolver !== false ? undefined : undefined
297
- });
289
+ // getEnsAvatar would fetch the record's URL (or the NFT's metadata) from this server.
290
+ avatar = await client.getEnsText({ name: normalizedName, key: 'avatar' });
298
291
  }
299
292
  if (!avatar) {
300
293
  return formatResponse({
@@ -328,8 +321,7 @@ export default {
328
321
  const clientManager = getClientManager();
329
322
  const client = clientManager.getClient(args.chain);
330
323
  address = await client.getEnsAddress({
331
- name: normalizedName,
332
- universalResolverAddress: args.universalResolver !== false ? undefined : undefined
324
+ name: normalizedName
333
325
  });
334
326
  }
335
327
  return {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../src/tools/read/ens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ import { z } from 'zod';
2
+ declare const _default: {
3
+ simulate_contract: {
4
+ title: string;
5
+ description: string;
6
+ schema: z.ZodObject<{
7
+ chain: z.ZodEnum<["mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
8
+ contractAddress: z.ZodString;
9
+ functionAbi: z.ZodString;
10
+ args: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>, "many">>;
11
+ from: z.ZodOptional<z.ZodString>;
12
+ value: z.ZodOptional<z.ZodString>;
13
+ blockNumber: z.ZodOptional<z.ZodString>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
16
+ contractAddress: string;
17
+ functionAbi: string;
18
+ blockNumber?: string | undefined;
19
+ from?: string | undefined;
20
+ value?: string | undefined;
21
+ args?: (string | number | boolean | null)[] | undefined;
22
+ }, {
23
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
24
+ contractAddress: string;
25
+ functionAbi: string;
26
+ blockNumber?: string | undefined;
27
+ from?: string | undefined;
28
+ value?: string | undefined;
29
+ args?: (string | number | boolean | null)[] | undefined;
30
+ }>;
31
+ handler: (args: {
32
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
33
+ contractAddress: string;
34
+ functionAbi: string;
35
+ blockNumber?: string | undefined;
36
+ from?: string | undefined;
37
+ value?: string | undefined;
38
+ args?: (string | number | boolean | null)[] | undefined;
39
+ }, identity: string) => Promise<import("../../types.js").ToolResult>;
40
+ available: (() => boolean) | undefined;
41
+ };
42
+ simulate_bundle: {
43
+ title: string;
44
+ description: string;
45
+ schema: z.ZodObject<{
46
+ chain: z.ZodEnum<["mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
47
+ from: z.ZodOptional<z.ZodString>;
48
+ calls: z.ZodArray<z.ZodObject<{
49
+ to: z.ZodString;
50
+ functionAbi: z.ZodOptional<z.ZodString>;
51
+ args: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>, "many">>;
52
+ data: z.ZodOptional<z.ZodString>;
53
+ value: z.ZodOptional<z.ZodString>;
54
+ from: z.ZodOptional<z.ZodString>;
55
+ }, "strip", z.ZodTypeAny, {
56
+ to: string;
57
+ from?: string | undefined;
58
+ value?: string | undefined;
59
+ data?: string | undefined;
60
+ args?: (string | number | boolean | null)[] | undefined;
61
+ functionAbi?: string | undefined;
62
+ }, {
63
+ to: string;
64
+ from?: string | undefined;
65
+ value?: string | undefined;
66
+ data?: string | undefined;
67
+ args?: (string | number | boolean | null)[] | undefined;
68
+ functionAbi?: string | undefined;
69
+ }>, "many">;
70
+ blockNumber: z.ZodOptional<z.ZodString>;
71
+ }, "strip", z.ZodTypeAny, {
72
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
73
+ calls: {
74
+ to: string;
75
+ from?: string | undefined;
76
+ value?: string | undefined;
77
+ data?: string | undefined;
78
+ args?: (string | number | boolean | null)[] | undefined;
79
+ functionAbi?: string | undefined;
80
+ }[];
81
+ blockNumber?: string | undefined;
82
+ from?: string | undefined;
83
+ }, {
84
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
85
+ calls: {
86
+ to: string;
87
+ from?: string | undefined;
88
+ value?: string | undefined;
89
+ data?: string | undefined;
90
+ args?: (string | number | boolean | null)[] | undefined;
91
+ functionAbi?: string | undefined;
92
+ }[];
93
+ blockNumber?: string | undefined;
94
+ from?: string | undefined;
95
+ }>;
96
+ handler: (args: {
97
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
98
+ calls: {
99
+ to: string;
100
+ from?: string | undefined;
101
+ value?: string | undefined;
102
+ data?: string | undefined;
103
+ args?: (string | number | boolean | null)[] | undefined;
104
+ functionAbi?: string | undefined;
105
+ }[];
106
+ blockNumber?: string | undefined;
107
+ from?: string | undefined;
108
+ }, identity: string) => Promise<import("../../types.js").ToolResult>;
109
+ available: (() => boolean) | undefined;
110
+ };
111
+ estimate_gas: {
112
+ title: string;
113
+ description: string;
114
+ schema: z.ZodObject<{
115
+ chain: z.ZodEnum<["mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
116
+ to: z.ZodOptional<z.ZodString>;
117
+ from: z.ZodOptional<z.ZodString>;
118
+ value: z.ZodOptional<z.ZodString>;
119
+ data: z.ZodOptional<z.ZodString>;
120
+ functionAbi: z.ZodOptional<z.ZodString>;
121
+ args: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>, "many">>;
122
+ }, "strip", z.ZodTypeAny, {
123
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
124
+ from?: string | undefined;
125
+ to?: string | undefined;
126
+ value?: string | undefined;
127
+ data?: string | undefined;
128
+ args?: (string | number | boolean | null)[] | undefined;
129
+ functionAbi?: string | undefined;
130
+ }, {
131
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
132
+ from?: string | undefined;
133
+ to?: string | undefined;
134
+ value?: string | undefined;
135
+ data?: string | undefined;
136
+ args?: (string | number | boolean | null)[] | undefined;
137
+ functionAbi?: string | undefined;
138
+ }>;
139
+ handler: (args: {
140
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
141
+ from?: string | undefined;
142
+ to?: string | undefined;
143
+ value?: string | undefined;
144
+ data?: string | undefined;
145
+ args?: (string | number | boolean | null)[] | undefined;
146
+ functionAbi?: string | undefined;
147
+ }, identity: string) => Promise<import("../../types.js").ToolResult>;
148
+ available: (() => boolean) | undefined;
149
+ };
150
+ get_gas_price: {
151
+ title: string;
152
+ description: string;
153
+ schema: z.ZodObject<{
154
+ chain: z.ZodEnum<["mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost", ...("mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost")[]]>;
155
+ formatted: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
156
+ }, "strip", z.ZodTypeAny, {
157
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
158
+ formatted: boolean;
159
+ }, {
160
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
161
+ formatted?: boolean | undefined;
162
+ }>;
163
+ handler: (args: {
164
+ chain: "mainnet" | "arbitrum" | "avalanche" | "base" | "bnb" | "gnosis" | "sonic" | "optimism" | "polygon" | "zksync" | "linea" | "unichain" | "localhost";
165
+ formatted: boolean;
166
+ }, identity: string) => Promise<import("../../types.js").ToolResult>;
167
+ available: (() => boolean) | undefined;
168
+ };
169
+ };
170
+ export default _default;
171
+ //# sourceMappingURL=gas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../src/tools/read/gas.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwKvB,wBAqQC"}
@@ -0,0 +1,333 @@
1
+ import { decodeFunctionResult, encodeFunctionData, formatEther, formatGwei, isAddress, parseAbiItem, toHex } from 'viem';
2
+ import { simulateBlocks } from 'viem/actions';
3
+ import { z } from 'zod';
4
+ import { getClientManager, SUPPORTED_CHAINS } from '../../client.js';
5
+ import { enrichTransfers } from '../../preview.js';
6
+ import { convertArgumentsToTypes, createTool, formatResponse, MAX_BATCH, rpcReason } from '../../utils.js';
7
+ /** Alchemy's bundle method takes at most this many transactions. */
8
+ const ALCHEMY_BUNDLE_LIMIT = 3;
9
+ /** Where eth_simulateV1's traced native transfers say they come from. */
10
+ const NATIVE_TOKEN = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
11
+ const argsSchema = z.array(z.union([z.string(), z.number(), z.boolean(), z.null()]));
12
+ function bundleCall(call, from, index) {
13
+ const sender = call.from ?? from;
14
+ if (!isAddress(call.to))
15
+ throw new Error(`Call ${index}: invalid to address ${call.to}`);
16
+ if (sender && !isAddress(sender))
17
+ throw new Error(`Call ${index}: invalid from address ${sender}`);
18
+ if (call.functionAbi && call.data)
19
+ throw new Error(`Call ${index}: give functionAbi and args, or data — not both`);
20
+ const abi = call.functionAbi ? parseAbiItem(call.functionAbi) : undefined;
21
+ const data = abi
22
+ ? encodeFunctionData({ abi: [abi], functionName: abi.name, args: convertArgumentsToTypes(call.args ?? [], abi.inputs) })
23
+ : call.data;
24
+ return { from: sender, to: call.to, data, value: call.value ? BigInt(call.value) : undefined, abi };
25
+ }
26
+ /** Native, ERC20, ERC721 and ERC1155 changes with token metadata — on Alchemy's paid plans only. */
27
+ async function viaAlchemy(chain, calls, blockNumber) {
28
+ const client = getClientManager().getClient(chain);
29
+ const transactions = calls.map((call) => ({
30
+ from: call.from,
31
+ to: call.to,
32
+ data: call.data,
33
+ value: call.value !== undefined ? toHex(call.value) : undefined
34
+ }));
35
+ const params = blockNumber === undefined ? [transactions] : [transactions, toHex(blockNumber)];
36
+ const outcomes = (await client.request({ method: 'alchemy_simulateAssetChangesBundle', params }));
37
+ return outcomes.map((outcome) => ({
38
+ status: outcome.error ? 'failure' : 'success',
39
+ gasUsed: outcome.gasUsed ? BigInt(outcome.gasUsed).toString() : undefined,
40
+ error: outcome.error?.message,
41
+ assetChanges: outcome.changes.map((change) => ({
42
+ assetType: change.assetType,
43
+ token: change.contractAddress,
44
+ symbol: change.symbol,
45
+ tokenId: change.tokenId,
46
+ from: change.from,
47
+ to: change.to,
48
+ amount: change.amount,
49
+ rawAmount: change.rawAmount
50
+ }))
51
+ }));
52
+ }
53
+ function decodeResult(abi, data) {
54
+ if (!abi?.outputs.length)
55
+ return data;
56
+ try {
57
+ return decodeFunctionResult({ abi: [abi], functionName: abi.name, data });
58
+ }
59
+ catch {
60
+ return data;
61
+ }
62
+ }
63
+ /**
64
+ * Any RPC with eth_simulateV1: decoded return values, and native, ERC20 and ERC721 transfers.
65
+ *
66
+ * ponytail: ERC1155 moves tokens with TransferSingle / TransferBatch, which are not read
67
+ * here, so those changes are missing on this path. Parse them if 1155 bundles matter.
68
+ */
69
+ async function viaSimulateV1(chain, calls, blockNumber) {
70
+ const client = getClientManager().getClient(chain);
71
+ const [block] = await simulateBlocks(client, {
72
+ blocks: [{ calls: calls.map((call) => ({ account: call.from, to: call.to, data: call.data, value: call.value })) }],
73
+ traceTransfers: true,
74
+ validation: false,
75
+ ...(blockNumber !== undefined && { blockNumber })
76
+ });
77
+ if (!block)
78
+ throw new Error('The RPC returned no simulated block');
79
+ const nativeSymbol = client.chain?.nativeCurrency.symbol;
80
+ return Promise.all(block.calls.map(async (call, index) => {
81
+ const error = call.error;
82
+ const transfers = await enrichTransfers(chain, (call.logs ?? []));
83
+ return {
84
+ status: call.status,
85
+ gasUsed: call.gasUsed.toString(),
86
+ error: call.status === 'success' ? undefined : (error?.shortMessage ?? error?.message ?? 'execution reverted'),
87
+ result: call.status === 'success' ? decodeResult(calls[index]?.abi, call.data) : undefined,
88
+ assetChanges: transfers.map((transfer) => {
89
+ if (transfer.tokenId !== undefined) {
90
+ return {
91
+ assetType: 'ERC721',
92
+ token: transfer.token,
93
+ symbol: transfer.symbol,
94
+ tokenId: transfer.tokenId,
95
+ from: transfer.from,
96
+ to: transfer.to,
97
+ amount: '1',
98
+ rawAmount: '1'
99
+ };
100
+ }
101
+ const native = transfer.token.toLowerCase() === NATIVE_TOKEN;
102
+ return {
103
+ assetType: native ? 'NATIVE' : 'ERC20',
104
+ token: native ? undefined : transfer.token,
105
+ symbol: native ? nativeSymbol : transfer.symbol,
106
+ from: transfer.from,
107
+ to: transfer.to,
108
+ amount: native ? formatEther(BigInt(transfer.amount)) : transfer.humanAmount,
109
+ rawAmount: transfer.amount
110
+ };
111
+ })
112
+ };
113
+ }));
114
+ }
115
+ export default {
116
+ simulate_contract: createTool('Simulate Contract Call', 'Simulate a contract call (including state-changing functions) without broadcasting. Returns simulation result and estimated gas.', z.object({
117
+ chain: z.enum(SUPPORTED_CHAINS).describe('Blockchain network to simulate on'),
118
+ contractAddress: z.string().describe('Contract address to call'),
119
+ functionAbi: z
120
+ .string()
121
+ .describe('Function ABI signature (e.g., "function transfer(address to, uint256 amount)"). Can be any function type.'),
122
+ args: z
123
+ .array(z.union([z.string(), z.number(), z.boolean(), z.null()]))
124
+ .optional()
125
+ .describe('Function arguments in order matching the ABI signature'),
126
+ from: z.string().optional().describe('Sender address (defaults to zero address)'),
127
+ value: z.string().optional().describe('ETH value to send with the transaction (in wei as string)'),
128
+ blockNumber: z.string().optional().describe('Block number for simulation (defaults to latest)')
129
+ }), async (args) => {
130
+ if (!isAddress(args.contractAddress)) {
131
+ throw new Error(`Invalid contract address: ${args.contractAddress}`);
132
+ }
133
+ if (args.from && !isAddress(args.from)) {
134
+ throw new Error(`Invalid from address: ${args.from}`);
135
+ }
136
+ const clientManager = getClientManager();
137
+ const client = clientManager.getClient(args.chain);
138
+ try {
139
+ const abiItem = parseAbiItem(args.functionAbi);
140
+ const convertedArgs = convertArgumentsToTypes(args.args || [], abiItem.inputs);
141
+ const tx = {
142
+ to: args.contractAddress,
143
+ data: encodeFunctionData({ abi: [abiItem], functionName: abiItem.name, args: convertedArgs }),
144
+ account: args.from ? args.from : undefined,
145
+ value: args.value ? BigInt(args.value) : undefined,
146
+ blockNumber: args.blockNumber ? BigInt(args.blockNumber) : undefined
147
+ };
148
+ const result = await client.call(tx);
149
+ const gasEstimate = await client.estimateGas(tx);
150
+ // Decode the result if the function has outputs
151
+ let decodedResult = result.data;
152
+ if (abiItem.outputs && abiItem.outputs.length > 0 && result.data) {
153
+ decodedResult = decodeFunctionResult({
154
+ abi: [abiItem],
155
+ functionName: abiItem.name,
156
+ data: result.data
157
+ });
158
+ }
159
+ return formatResponse({
160
+ success: true,
161
+ chain: args.chain,
162
+ contractAddress: args.contractAddress,
163
+ functionName: abiItem.name,
164
+ result: decodedResult,
165
+ rawData: result.data,
166
+ gasEstimate: gasEstimate.toString(),
167
+ blockNumber: args.blockNumber || 'latest'
168
+ });
169
+ }
170
+ catch (error) {
171
+ return formatResponse({
172
+ success: false,
173
+ chain: args.chain,
174
+ contractAddress: args.contractAddress,
175
+ error: rpcReason(error),
176
+ reverted: String(error instanceof Error ? error.message : error).includes('revert')
177
+ });
178
+ }
179
+ }),
180
+ simulate_bundle: createTool('Simulate Transaction Bundle', 'Simulate several transactions in order, in one block, each seeing the state the previous ones left — e.g. ' +
181
+ 'approve then swap, or deposit then borrow. Nothing is broadcast. Returns per transaction whether it ' +
182
+ 'succeeded, gas used, the revert reason, and the assets that moved. Up to 3 transactions go through ' +
183
+ "Alchemy's asset-change simulation (native, ERC20, ERC721, ERC1155, with symbols) where the plan allows it; " +
184
+ 'otherwise eth_simulateV1, which adds decoded return values but reports only native and ERC20 transfers.', z.object({
185
+ chain: z.enum(SUPPORTED_CHAINS).describe('Blockchain network to simulate on'),
186
+ from: z.string().optional().describe('Sender for every transaction that does not name its own'),
187
+ calls: z
188
+ .array(z.object({
189
+ to: z.string().describe('Contract or recipient address'),
190
+ functionAbi: z
191
+ .string()
192
+ .optional()
193
+ .describe('Function signature to encode the call, e.g. "function approve(address spender, uint256 amount)"'),
194
+ args: argsSchema.optional().describe('Arguments for functionAbi, in order'),
195
+ data: z.string().optional().describe('Raw calldata, instead of functionAbi and args'),
196
+ value: z.string().optional().describe('Native value to send, in wei'),
197
+ from: z.string().optional().describe('Sender of this transaction, if not the bundle-wide from')
198
+ }))
199
+ .min(1)
200
+ .max(MAX_BATCH)
201
+ .describe('Transactions to run, in order'),
202
+ blockNumber: z.string().optional().describe('Block to simulate on top of (defaults to latest)')
203
+ }), async (args) => {
204
+ const chain = args.chain;
205
+ const calls = args.calls.map((call, index) => bundleCall(call, args.from, index));
206
+ const blockNumber = args.blockNumber ? BigInt(args.blockNumber) : undefined;
207
+ let outcomes;
208
+ let via = 'alchemy_simulateAssetChangesBundle';
209
+ let fallbackReason;
210
+ if (calls.length <= ALCHEMY_BUNDLE_LIMIT) {
211
+ try {
212
+ outcomes = await viaAlchemy(chain, calls, blockNumber);
213
+ }
214
+ catch (error) {
215
+ // A free plan, a chain Alchemy does not simulate on, or a custom RPC that is not Alchemy.
216
+ fallbackReason = rpcReason(error);
217
+ }
218
+ }
219
+ else {
220
+ fallbackReason = `Alchemy simulates at most ${ALCHEMY_BUNDLE_LIMIT} transactions per bundle`;
221
+ }
222
+ if (!outcomes) {
223
+ via = 'eth_simulateV1';
224
+ try {
225
+ outcomes = await viaSimulateV1(chain, calls, blockNumber);
226
+ }
227
+ catch (error) {
228
+ return formatResponse({ success: false, chain, error: rpcReason(error), alchemyBundleError: fallbackReason });
229
+ }
230
+ }
231
+ return formatResponse({
232
+ success: outcomes.every((outcome) => outcome.status === 'success'),
233
+ chain,
234
+ via,
235
+ ...(fallbackReason && { fallbackReason }),
236
+ totalGasUsed: outcomes.reduce((sum, outcome) => sum + BigInt(outcome.gasUsed ?? 0), 0n),
237
+ calls: outcomes.map((outcome, index) => ({
238
+ index,
239
+ to: calls[index]?.to,
240
+ ...(calls[index]?.abi && { functionName: calls[index].abi.name }),
241
+ ...outcome
242
+ }))
243
+ });
244
+ },
245
+ // Offered only where a provider RPC backs it: public endpoints rarely serve eth_simulateV1.
246
+ () => Boolean(getClientManager().getConfig().alchemyApiKey)),
247
+ estimate_gas: createTool('Estimate Gas', 'Estimate gas required for a transaction. Supports contract calls, transfers, and deployments.', z.object({
248
+ chain: z.enum(SUPPORTED_CHAINS).describe('Blockchain network'),
249
+ to: z.string().optional().describe('Recipient address (omit for contract deployment)'),
250
+ from: z.string().optional().describe('Sender address (optional)'),
251
+ value: z.string().optional().describe('ETH value to send (in wei as string)'),
252
+ data: z.string().optional().describe('Transaction data (hex string for contract calls or deployment bytecode)'),
253
+ functionAbi: z.string().optional().describe('Optional: Function ABI signature to encode call data automatically'),
254
+ args: z
255
+ .array(z.union([z.string(), z.number(), z.boolean(), z.null()]))
256
+ .optional()
257
+ .describe('Optional: Function arguments (only used with functionAbi)')
258
+ }), async (args) => {
259
+ if (args.to && !isAddress(args.to)) {
260
+ throw new Error(`Invalid to address: ${args.to}`);
261
+ }
262
+ if (args.from && !isAddress(args.from)) {
263
+ throw new Error(`Invalid from address: ${args.from}`);
264
+ }
265
+ const clientManager = getClientManager();
266
+ const client = clientManager.getClient(args.chain);
267
+ let callData = args.data;
268
+ // If functionAbi is provided, encode the call data
269
+ if (args.functionAbi) {
270
+ const abiItem = parseAbiItem(args.functionAbi);
271
+ const convertedArgs = convertArgumentsToTypes(args.args || [], abiItem.inputs);
272
+ callData = encodeFunctionData({
273
+ abi: [abiItem],
274
+ functionName: abiItem.name,
275
+ args: convertedArgs
276
+ });
277
+ }
278
+ const gasEstimate = await client.estimateGas({
279
+ to: args.to ? args.to : undefined,
280
+ account: args.from ? args.from : undefined,
281
+ value: args.value ? BigInt(args.value) : undefined,
282
+ data: callData
283
+ });
284
+ return formatResponse({
285
+ success: true,
286
+ chain: args.chain,
287
+ gasEstimate: gasEstimate.toString(),
288
+ to: args.to,
289
+ from: args.from,
290
+ value: args.value
291
+ });
292
+ }),
293
+ get_gas_price: createTool('Get Gas Price', 'Get current gas prices for a chain. Returns both legacy gasPrice and EIP-1559 fees (maxFeePerGas, maxPriorityFeePerGas).', z.object({
294
+ chain: z.enum(SUPPORTED_CHAINS).describe('Blockchain network'),
295
+ formatted: z.boolean().optional().default(true).describe('Return prices in Gwei (default: true). If false, returns wei.')
296
+ }), async (args) => {
297
+ const clientManager = getClientManager();
298
+ const client = clientManager.getClient(args.chain);
299
+ // Get both legacy and EIP-1559 gas prices
300
+ const [gasPrice, feeData] = await Promise.all([
301
+ client.getGasPrice(),
302
+ client.estimateFeesPerGas().catch(() => null) // Some chains don't support EIP-1559
303
+ ]);
304
+ const formatPrice = (wei) => `${formatGwei(wei)} Gwei`;
305
+ const response = {
306
+ chain: args.chain,
307
+ timestamp: new Date().toISOString(),
308
+ legacy: {
309
+ gasPrice: args.formatted ? formatPrice(gasPrice) : gasPrice.toString(),
310
+ gasPriceWei: gasPrice.toString()
311
+ }
312
+ };
313
+ // Add EIP-1559 data if available
314
+ if (feeData) {
315
+ response.eip1559 = {
316
+ maxFeePerGas: args.formatted ? formatPrice(feeData.maxFeePerGas) : feeData.maxFeePerGas.toString(),
317
+ maxPriorityFeePerGas: args.formatted
318
+ ? formatPrice(feeData.maxPriorityFeePerGas)
319
+ : feeData.maxPriorityFeePerGas.toString(),
320
+ maxFeePerGasWei: feeData.maxFeePerGas.toString(),
321
+ maxPriorityFeePerGasWei: feeData.maxPriorityFeePerGas.toString()
322
+ };
323
+ // Calculate estimated total cost for a standard 21000 gas transaction
324
+ const standardGasLimit = 21000n;
325
+ const estimatedCost = feeData.maxFeePerGas * standardGasLimit;
326
+ response.eip1559.estimatedCostFor21kGas = args.formatted
327
+ ? `${formatEther(estimatedCost)} ${client.chain?.nativeCurrency.symbol ?? 'ETH'}`
328
+ : estimatedCost.toString();
329
+ }
330
+ return formatResponse(response);
331
+ })
332
+ };
333
+ //# sourceMappingURL=gas.js.map