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.
- package/CHANGELOG.md +182 -1
- package/README.md +76 -47
- package/dist/anvil.d.ts +17 -19
- package/dist/anvil.d.ts.map +1 -1
- package/dist/anvil.js +124 -228
- package/dist/anvil.js.map +1 -1
- package/dist/chain-meta.d.ts.map +1 -1
- package/dist/chain-meta.js +19 -8
- package/dist/chain-meta.js.map +1 -1
- package/dist/chains.d.ts +9 -1
- package/dist/chains.d.ts.map +1 -1
- package/dist/chains.js +11 -2
- package/dist/chains.js.map +1 -1
- package/dist/clear-signing.d.ts.map +1 -1
- package/dist/clear-signing.js +17 -6
- package/dist/clear-signing.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +24 -0
- package/dist/context.js.map +1 -0
- package/dist/hosted.d.ts +12 -0
- package/dist/hosted.d.ts.map +1 -0
- package/dist/hosted.js +12 -0
- package/dist/hosted.js.map +1 -0
- package/dist/http-server.d.ts +13 -0
- package/dist/http-server.d.ts.map +1 -1
- package/dist/http-server.js +22 -7
- package/dist/http-server.js.map +1 -1
- package/dist/index.js +20 -12
- package/dist/index.js.map +1 -1
- package/dist/kv-storage.d.ts +2 -1
- package/dist/kv-storage.d.ts.map +1 -1
- package/dist/kv-storage.js +5 -2
- package/dist/kv-storage.js.map +1 -1
- package/dist/lib.d.ts +24 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +23 -0
- package/dist/lib.js.map +1 -0
- package/dist/mcp-server.d.ts +4 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +43 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/oauth.d.ts +57 -8
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +133 -63
- package/dist/oauth.js.map +1 -1
- package/dist/preview.d.ts +7 -0
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +21 -7
- package/dist/preview.js.map +1 -1
- package/dist/signing-requests.d.ts +81 -0
- package/dist/signing-requests.d.ts.map +1 -0
- package/dist/signing-requests.js +138 -0
- package/dist/signing-requests.js.map +1 -0
- package/dist/tools/index.d.ts +27 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +50 -15
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/{advanced.d.ts → read/advanced.d.ts} +39 -30
- package/dist/tools/read/advanced.d.ts.map +1 -0
- package/dist/tools/{advanced.js → read/advanced.js} +53 -41
- package/dist/tools/read/advanced.js.map +1 -0
- package/dist/tools/{balance.d.ts → read/balance.d.ts} +8 -7
- package/dist/tools/read/balance.d.ts.map +1 -0
- package/dist/tools/{balance.js → read/balance.js} +18 -33
- package/dist/tools/read/balance.js.map +1 -0
- package/dist/tools/{contract-info.d.ts → read/contract-info.d.ts} +20 -15
- package/dist/tools/read/contract-info.d.ts.map +1 -0
- package/dist/tools/{contract-info.js → read/contract-info.js} +54 -123
- package/dist/tools/read/contract-info.js.map +1 -0
- package/dist/tools/{contract.d.ts → read/contract.d.ts} +14 -12
- package/dist/tools/read/contract.d.ts.map +1 -0
- package/dist/tools/{contract.js → read/contract.js} +3 -2
- package/dist/tools/read/contract.js.map +1 -0
- package/dist/tools/read/ens.d.ts +104 -0
- package/dist/tools/read/ens.d.ts.map +1 -0
- package/dist/tools/{ens.js → read/ens.js} +25 -33
- package/dist/tools/read/ens.js.map +1 -0
- package/dist/tools/read/gas.d.ts +171 -0
- package/dist/tools/read/gas.d.ts.map +1 -0
- package/dist/tools/read/gas.js +333 -0
- package/dist/tools/read/gas.js.map +1 -0
- package/dist/tools/read/logs.d.ts +101 -0
- package/dist/tools/read/logs.d.ts.map +1 -0
- package/dist/tools/read/logs.js +211 -0
- package/dist/tools/read/logs.js.map +1 -0
- package/dist/tools/{signatures.d.ts → read/signatures.d.ts} +8 -4
- package/dist/tools/read/signatures.d.ts.map +1 -0
- package/dist/tools/{signatures.js → read/signatures.js} +4 -3
- package/dist/tools/read/signatures.js.map +1 -0
- package/dist/tools/read/signing.d.ts +27 -0
- package/dist/tools/read/signing.d.ts.map +1 -0
- package/dist/tools/read/signing.js +81 -0
- package/dist/tools/read/signing.js.map +1 -0
- package/dist/tools/sign/errors.d.ts +9 -0
- package/dist/tools/sign/errors.d.ts.map +1 -0
- package/dist/tools/sign/errors.js +29 -0
- package/dist/tools/sign/errors.js.map +1 -0
- package/dist/tools/sign/transactions.d.ts +141 -0
- package/dist/tools/sign/transactions.d.ts.map +1 -0
- package/dist/tools/sign/transactions.js +361 -0
- package/dist/tools/sign/transactions.js.map +1 -0
- package/dist/tools/sign/wallet.d.ts +50 -0
- package/dist/tools/sign/wallet.d.ts.map +1 -0
- package/dist/tools/sign/wallet.js +180 -0
- package/dist/tools/sign/wallet.js.map +1 -0
- package/dist/utils.d.ts +23 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +48 -3
- package/dist/utils.js.map +1 -1
- package/dist/wallet-client.d.ts +34 -4
- package/dist/wallet-client.d.ts.map +1 -1
- package/dist/wallet-client.js +106 -27
- package/dist/wallet-client.js.map +1 -1
- package/dist/walletconnect.d.ts +100 -13
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js +215 -50
- package/dist/walletconnect.js.map +1 -1
- package/package.json +12 -9
- package/src/anvil.ts +150 -271
- package/src/chain-meta.ts +16 -7
- package/src/chains.ts +14 -2
- package/src/clear-signing.ts +15 -9
- package/src/client.ts +0 -1
- package/src/context.ts +27 -0
- package/src/hosted.ts +11 -0
- package/src/http-server.ts +38 -8
- package/src/index.ts +20 -13
- package/src/kv-storage.ts +6 -3
- package/src/lib.ts +24 -0
- package/src/mcp-server.ts +47 -0
- package/src/oauth.ts +181 -69
- package/src/preview.ts +28 -7
- package/src/signing-requests.ts +198 -0
- package/src/tools/index.ts +78 -16
- package/src/tools/{advanced.ts → read/advanced.ts} +74 -43
- package/src/tools/{balance.ts → read/balance.ts} +20 -35
- package/src/tools/{contract-info.ts → read/contract-info.ts} +66 -146
- package/src/tools/{contract.ts → read/contract.ts} +4 -3
- package/src/tools/{ens.ts → read/ens.ts} +27 -34
- package/src/tools/read/gas.ts +443 -0
- package/src/tools/read/logs.ts +281 -0
- package/src/tools/{signatures.ts → read/signatures.ts} +5 -5
- package/src/tools/read/signing.ts +92 -0
- package/src/tools/sign/errors.ts +28 -0
- package/src/tools/sign/transactions.ts +479 -0
- package/src/tools/sign/wallet.ts +216 -0
- package/src/utils.ts +52 -3
- package/src/wallet-client.ts +107 -24
- package/src/walletconnect.ts +250 -48
- package/dist/tools/advanced.d.ts.map +0 -1
- package/dist/tools/advanced.js.map +0 -1
- package/dist/tools/balance.d.ts.map +0 -1
- package/dist/tools/balance.js.map +0 -1
- package/dist/tools/contract-info.d.ts.map +0 -1
- package/dist/tools/contract-info.js.map +0 -1
- package/dist/tools/contract.d.ts.map +0 -1
- package/dist/tools/contract.js.map +0 -1
- package/dist/tools/ens.d.ts +0 -119
- package/dist/tools/ens.d.ts.map +0 -1
- package/dist/tools/ens.js.map +0 -1
- package/dist/tools/gas.d.ts +0 -99
- package/dist/tools/gas.d.ts.map +0 -1
- package/dist/tools/gas.js +0 -181
- package/dist/tools/gas.js.map +0 -1
- package/dist/tools/logs.d.ts +0 -39
- package/dist/tools/logs.d.ts.map +0 -1
- package/dist/tools/logs.js +0 -230
- package/dist/tools/logs.js.map +0 -1
- package/dist/tools/signatures.d.ts.map +0 -1
- package/dist/tools/signatures.js.map +0 -1
- package/dist/tools/transactions.d.ts +0 -155
- package/dist/tools/transactions.d.ts.map +0 -1
- package/dist/tools/transactions.js +0 -365
- package/dist/tools/transactions.js.map +0 -1
- package/src/tools/gas.ts +0 -219
- package/src/tools/logs.ts +0 -293
- package/src/tools/transactions.ts +0 -456
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,187 @@
|
|
|
2
2
|
|
|
3
3
|
Notable changes per release. Dates are release dates; unreleased work sits at the top.
|
|
4
4
|
|
|
5
|
+
## [3.1.0] — 2026-10-01
|
|
6
|
+
|
|
7
|
+
Mostly fixes, several of them for security — worth taking on any hosted server.
|
|
8
|
+
|
|
9
|
+
From this release `web3-wallet-relay` shares the server's version number, jumping from 2.0.0
|
|
10
|
+
to 3.1.0. The two speak one protocol that carries no version of its own, so the package
|
|
11
|
+
version is what matches them: a relay hosted on its own runs at the version of the server
|
|
12
|
+
pointing at it. `web3-tools-mcp` still pins it exactly.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- A host's `Login` can name the `credential` it checks, binding every code and token issued
|
|
17
|
+
under it so that rotating the secret revokes them, and its `page()` is told which client
|
|
18
|
+
is asking and where the code will go.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- `trace_transaction`'s `traceType` is `trace`, `prestate` or `stateDiff`. `vmTrace` is gone:
|
|
23
|
+
it ran the prestate tracer under another name, and `stateDiff` asked for a tracer no node
|
|
24
|
+
has. Traces too large for an agent's context are cut short and say so.
|
|
25
|
+
- `get_logs` returns at most 1,000 logs, with `truncated` and the `nextBlock` to continue
|
|
26
|
+
from. `toBlock` is inclusive on both paths, a list in `eventArgs` is an OR filter, and an
|
|
27
|
+
invalid `address` is an error rather than a filter silently dropped.
|
|
28
|
+
- `get_balance`, `read_contract` and `batch_resolve_ens_names` take at most 25 items.
|
|
29
|
+
- ENS tools take `mainnet`, `linea` or `base` — the chains that have a resolver — and the
|
|
30
|
+
no-op `universalResolver` parameter is gone.
|
|
31
|
+
- `render.yaml` is a single service: the relay runs inside the MCP server, as on Fly.
|
|
32
|
+
- Keeping OAuth state in Upstash needs per-field hash expiry (`HEXPIRE`, Redis ≥ 7.4), so
|
|
33
|
+
expired tokens no longer pile up. The file store prunes them on write.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- `send_erc20_token` no longer assumes 18 decimals. It reads them on-chain and refuses a
|
|
38
|
+
`decimals` that disagrees; a token whose decimals cannot be read needs them passed.
|
|
39
|
+
- `write_contract` takes numeric arguments only as safe integers — pass a large uint or int
|
|
40
|
+
as a string — and coerces string arguments to their ABI types, as `read_contract` does.
|
|
41
|
+
- `sign_message` sends the browser the message hex-encoded, as the phone gets it, so both
|
|
42
|
+
sign the same bytes. The phone signs on a chain its session approved, not mainnet.
|
|
43
|
+
- Phone signing on `localhost` is refused up front: the phone has no route to that node. Use
|
|
44
|
+
the browser.
|
|
45
|
+
- The signing preview names each labelled address as `Name (0x…)`, shows token amounts with
|
|
46
|
+
the token's address, and gives an amount whose decimals are unknown as the raw integer,
|
|
47
|
+
marked so, rather than assuming 18. Its summary includes `to`.
|
|
48
|
+
- `get_logs` over Hypersync no longer drops the last block, reports a response cut short
|
|
49
|
+
by the server, or scans from genesis when `fromBlock` is omitted.
|
|
50
|
+
- `get_error_signature` hashes tuple parameters correctly.
|
|
51
|
+
- `get_gas_price` shows sub-gwei L2 prices instead of "0.00", and costs in the chain's own
|
|
52
|
+
native token.
|
|
53
|
+
- An invalid, expired or replayed OAuth code or refresh token answers `invalid_grant`, not a
|
|
54
|
+
500, so connectors re-authorise instead of retrying.
|
|
55
|
+
- Etherscan errors say why ("Invalid API Key", rate limit) rather than "NOTOK".
|
|
56
|
+
- `npx web3-wallet-relay` starts the relay.
|
|
57
|
+
|
|
58
|
+
### Security
|
|
59
|
+
|
|
60
|
+
- The provider API key no longer appears in tool output.
|
|
61
|
+
- `get_ens_avatar` returns the raw avatar record rather than fetching it server-side.
|
|
62
|
+
- Requests carry `expiresAt`, and the signing page cancels an approval that arrives after
|
|
63
|
+
the request timed out or was disconnected. A request that failed any way but an explicit
|
|
64
|
+
rejection now reports `outcome_unknown` — it may still have been broadcast — instead of
|
|
65
|
+
`rejected_or_failed`, so an agent checks before retrying rather than paying twice.
|
|
66
|
+
- The signing page is hardened against script injection and framing, with a strict CSP.
|
|
67
|
+
- OAuth refresh tokens expire, and rotating `MCP_TOKEN` revokes every token issued under
|
|
68
|
+
it — existing tokens predate the binding, so single-token deployments re-authorise once.
|
|
69
|
+
The login page names the client and where it redirects, and cannot be framed.
|
|
70
|
+
`MCP_TRUST_PROXY` lets rate limiting see client addresses behind a proxy.
|
|
71
|
+
- The hosted signer link is no longer written to the logs.
|
|
72
|
+
|
|
73
|
+
## [3.0.0] — 2026-09-26
|
|
74
|
+
|
|
75
|
+
The theme is multi-tenancy: one server can now carry several people without their wallets
|
|
76
|
+
meeting. Nothing turns that on by itself — a server still authenticates its deployment
|
|
77
|
+
rather than a person, so everyone on it remains the same user until something issues
|
|
78
|
+
distinct identities.
|
|
79
|
+
|
|
80
|
+
`web3-wallet-relay` goes to 2.0.0 alongside, and `web3-tools-mcp` pins it exactly: the
|
|
81
|
+
handshake changed, so a mismatched pair cannot pair at all.
|
|
82
|
+
|
|
83
|
+
### Changed
|
|
84
|
+
|
|
85
|
+
- **Tracing uses a node that is already running, instead of starting one.** Each trace used
|
|
86
|
+
to spawn an Anvil fork and kill it afterwards, which on a shared server is unbounded child
|
|
87
|
+
processes. It now talks to `ANVIL_RPC_URL`, defaulting to `127.0.0.1:8545` — any node
|
|
88
|
+
exposing `debug_traceCall` will do, and a provider whose RPC can trace is still preferred.
|
|
89
|
+
|
|
90
|
+
Anvil serves no block below its own fork height, so replaying an older transaction means
|
|
91
|
+
re-forking the node there, which clears whatever state it held. That only happens with
|
|
92
|
+
`ANVIL_ALLOW_RESET=1`; without it the trace fails and says so. The node is returned to
|
|
93
|
+
head afterwards rather than left pinned to an old block.
|
|
94
|
+
|
|
95
|
+
Re-forking reads state from the chain's configured RPC, so tracing an old transaction
|
|
96
|
+
needs one with archive access — a provider key or a `CUSTOM_RPC`. The hard-coded archive
|
|
97
|
+
endpoint for Arbitrum is gone.
|
|
98
|
+
|
|
99
|
+
### Added
|
|
100
|
+
|
|
101
|
+
- **Several phone wallets can be paired at once** — a hot wallet and a hardware one, say.
|
|
102
|
+
`pair_phone_wallet` used to report that one was already paired and stop; it now pairs, and
|
|
103
|
+
says which wallets the new one joins. `wallet_status` lists them all, and the signing
|
|
104
|
+
tools take `account` to choose between them, as does `disconnect_phone_wallet` — which
|
|
105
|
+
still clears everything when no account is named. With one wallet paired nothing changes,
|
|
106
|
+
and omitting `account` uses the most recently paired.
|
|
107
|
+
- **`simulate_bundle`** runs several transactions in order in one block, each on the state
|
|
108
|
+
the last left — approve then swap, deposit then borrow. Offered with an Alchemy key.
|
|
109
|
+
- **Signing requests outlive their call.** One not approved in time comes back with a
|
|
110
|
+
`requestId`, and `check_signing_request` collects it instead of a second prompt landing in
|
|
111
|
+
the wallet. A phone request returns as soon as the wallet has it, and both signers wait
|
|
112
|
+
for the receipt, reporting mined, reverted or still pending. The signing page shows every
|
|
113
|
+
request waiting, approvable in any order.
|
|
114
|
+
- A host assembling its own server can mount routes, hand a pairing made under a
|
|
115
|
+
placeholder to the address it proved, and draw the pairing QR as SVG (`qrSvg`).
|
|
116
|
+
- The server declares an icon, so a connector list shows more than a letter.
|
|
117
|
+
- `pair_phone_wallet` warns when the same wallet app is already paired, and reports a
|
|
118
|
+
pairing the wallet ended itself.
|
|
119
|
+
|
|
120
|
+
### Fixed
|
|
121
|
+
|
|
122
|
+
- An ERC-721 `Transfer` reads as a token id, not as an ERC-20 transfer of nothing.
|
|
123
|
+
|
|
124
|
+
### Security
|
|
125
|
+
|
|
126
|
+
- **Signing is scoped to whoever asked for it.** Every tool call now carries the identity it
|
|
127
|
+
is acting for, and both signers are keyed by it: a wallet page reaches only the person it
|
|
128
|
+
belongs to, and a phone session is matched by a binding recorded when it was approved.
|
|
129
|
+
Sessions were previously picked as "the most recently paired", so on a server with more
|
|
130
|
+
than one user a signing request could be sent to somebody else's phone — and
|
|
131
|
+
`disconnect_phone_wallet` ended everybody's sessions. Phones paired before this keep
|
|
132
|
+
working on a single-user server.
|
|
133
|
+
|
|
134
|
+
- **Relay tokens name the room they admit you to**, signed by the relay's secret, so the
|
|
135
|
+
server can mint a pair per person and the relay needs no record of who exists. Naming a
|
|
136
|
+
room without the signature is refused.
|
|
137
|
+
|
|
138
|
+
- **The relay bounds what one room can take.** A frame over 512KB is refused, rather than
|
|
139
|
+
the 100MB the WebSocket library would otherwise accept, and a room holds at most 16
|
|
140
|
+
connections. Neither is reachable in normal use — contract creation calldata tops out
|
|
141
|
+
near 98KB of hex, and a person needs a wallet tab or two plus a requester per editor
|
|
142
|
+
session — but without them one connection could exhaust the process for everybody else.
|
|
143
|
+
|
|
144
|
+
- **`localhost` is not a chain a hosted server will accept.** It resolves to the machine
|
|
145
|
+
running the server, so on a shared deployment it was a way to aim requests at whatever
|
|
146
|
+
that host had listening on its own loopback. Self-hosted runs are unaffected.
|
|
147
|
+
|
|
148
|
+
The same switch keeps a hosted server from probing its own loopback for a tracing node
|
|
149
|
+
and from opening a browser on itself. The CLI flips it with `MCP_HTTP_PORT`; a host that
|
|
150
|
+
assembles its own server from the library sets `MCP_HOSTED=1` before importing it, and
|
|
151
|
+
`startHttpServer` refuses to run without one of the two.
|
|
152
|
+
|
|
153
|
+
- **The relay drops a frame it cannot use instead of dying on it.** A peer that had
|
|
154
|
+
authenticated could send `null` — valid JSON, not an object — and take the relay down,
|
|
155
|
+
along with the MCP server it is embedded in when hosted. Tokens are also compared in
|
|
156
|
+
constant time.
|
|
157
|
+
|
|
158
|
+
- **A request signs from the account it named.** With a session exposing several
|
|
159
|
+
addresses, `account` chose the session but the transaction was still sent from its first
|
|
160
|
+
address. Concurrent pairings on one server no longer overwrite each other's ownership
|
|
161
|
+
record, and a hosted server closes a person's idle relay socket after ten minutes
|
|
162
|
+
instead of holding one open per person forever.
|
|
163
|
+
|
|
164
|
+
- **The signing page and the MCP server now hold different tokens.** One token granted both
|
|
165
|
+
roles, and a relay client may either answer transaction proposals (the page) or make them
|
|
166
|
+
(the server). The page's token is the exposed one — it rides in a URL you open, keep in
|
|
167
|
+
history and show on screen — so anyone who saw it could push proposals at your wallet.
|
|
168
|
+
The page's token is derived from the server's and grants the signing role only; the
|
|
169
|
+
server's never reaches a browser.
|
|
170
|
+
|
|
171
|
+
**Re-open the signing page from the link the server prints.** Pairing URLs issued before
|
|
172
|
+
this carry a token the relay no longer accepts for signing.
|
|
173
|
+
|
|
174
|
+
- **The signing page no longer takes the transaction's value from the preview.** The preview
|
|
175
|
+
travels with the request and is forwarded untouched, so a hostile requester could state
|
|
176
|
+
one amount while the calldata did another. The value is now read from the transaction
|
|
177
|
+
itself, and the calldata is shown even when a decoded view is available, so a claim that
|
|
178
|
+
disagrees with the bytes is visible on the same screen.
|
|
179
|
+
|
|
180
|
+
- **A relay can serve several people without their wallets meeting.** Connections resolve to
|
|
181
|
+
a room, and a transaction only ever reaches a page in the same one. Previously the relay
|
|
182
|
+
offered each transaction to whichever page was first in its pool, broadcast the first
|
|
183
|
+
signer's address to every requester, and let any page answer a request by its id. A
|
|
184
|
+
self-hosted relay keeps one room and behaves exactly as before.
|
|
185
|
+
|
|
5
186
|
## [2.0.2] — 2026-09-22
|
|
6
187
|
|
|
7
188
|
### Fixed
|
|
@@ -80,7 +261,7 @@ sign it.
|
|
|
80
261
|
`call_contract_write` is now `write_contract` — the old pair gave no hint which one
|
|
81
262
|
spent gas. The names now match viem's, and a saved prompt naming the old ones will need
|
|
82
263
|
updating.
|
|
83
|
-
- Every supported chain now lives in one table ([mcp/src/chains.ts](mcp/src/chains.ts)). Adding a
|
|
264
|
+
- Every supported chain now lives in one table ([mcp/src/chains.ts](https://github.com/hajnalben/web3-tools-mcp/blob/main/mcp/src/chains.ts)). Adding a
|
|
84
265
|
chain is a single entry; the tool schemas, RPC selection, explorer links, Hypersync
|
|
85
266
|
routing and `--help` all derive from it.
|
|
86
267
|
- Tool errors surface the underlying failure rather than a re-wrapped message that hid it.
|
package/README.md
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
**Your agent proposes the transaction. You approve it — in your own wallet, on your phone.** 📱
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
32 MCP tools for reading any EVM network and signing transactions in *your own* wallet.
|
|
8
8
|
Every transaction is decoded, named and simulated before you approve it.
|
|
9
9
|
|
|
10
10
|
[](https://www.npmjs.com/package/web3-tools-mcp)
|
|
11
11
|
[](https://www.npmjs.com/package/web3-tools-mcp)
|
|
12
12
|
[](https://nodejs.org)
|
|
13
|
-
[](LICENSE)
|
|
13
|
+
[](https://github.com/hajnalben/web3-tools-mcp/blob/main/LICENSE)
|
|
14
14
|
|
|
15
15
|
</div>
|
|
16
16
|
|
|
@@ -22,7 +22,7 @@ One entry in that client's MCP config:
|
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
Each app keeps that config somewhere different —
|
|
25
|
-
[the file paths are below ↓](#-setup). You need Node.js ≥ 20; `npx` fetches the rest.
|
|
25
|
+
[the file paths are below ↓](#-setup). You need Node.js ≥ 20.19; `npx` fetches the rest.
|
|
26
26
|
|
|
27
27
|
**ChatGPT, Grok** and **claude.ai** cannot launch anything locally — they only reach a URL.
|
|
28
28
|
[Host it once ↓](#-hosting) and add it as a connector, and there is nothing running on your
|
|
@@ -91,7 +91,7 @@ npx web3-tools-mcp --walletconnect-project-id YOUR_PROJECT_ID
|
|
|
91
91
|
| 💾 | **It sticks.** The session is stored on disk (or in Redis when hosted), so it survives restarts and redeploys. Pair once, not once a day |
|
|
92
92
|
| ✍️ | **You choose each time.** Every signing tool takes a required `signWith`, so the agent asks whether this one goes to your phone or the browser. A paired phone never quietly claims a request |
|
|
93
93
|
| 🧾 | **You still see the decode.** The full preview comes back in the tool response — your wallet shows its own summary, so read ours before you approve theirs |
|
|
94
|
-
| 🔌 | **Drop it any time.** `disconnect_phone_wallet`
|
|
94
|
+
| 🔌 | **Drop it any time.** `disconnect_phone_wallet` drops the wallet you name by `account`, or every session and pairing when you name none |
|
|
95
95
|
|
|
96
96
|
Works with **MetaMask · Rabby · Trust · Coinbase Wallet** — anything speaking WalletConnect v2.
|
|
97
97
|
|
|
@@ -123,28 +123,36 @@ returns the page URL any time you want to open it yourself.
|
|
|
123
123
|
## 🧰 Tools
|
|
124
124
|
|
|
125
125
|
<details>
|
|
126
|
-
<summary><b>
|
|
126
|
+
<summary><b>32 tools</b> — reads, writes, ENS, logs, tracing</summary>
|
|
127
127
|
|
|
128
128
|
### ✍️ Transactions & signing
|
|
129
129
|
| Tool | |
|
|
130
130
|
| --- | --- |
|
|
131
|
-
| `write_contract` | Send a transaction calling a state-changing function, via your wallet |
|
|
131
|
+
| `write_contract` | Send a transaction calling a state-changing function, via your wallet. Pass large integers as strings |
|
|
132
132
|
| `send_native_token` | Send ETH or a native token |
|
|
133
|
-
| `send_erc20_token` | Send an ERC-20 |
|
|
134
|
-
| `sign_message` | Sign a message |
|
|
135
|
-
| `
|
|
133
|
+
| `send_erc20_token` | Send an ERC-20, with decimals read on-chain — a `decimals` you pass must agree |
|
|
134
|
+
| `sign_message` | Sign a message — the same bytes on either signer |
|
|
135
|
+
| `check_signing_request` | Collect a request still awaiting approval, by its `requestId` |
|
|
136
|
+
| `wallet_status` | Every signer and whether it is ready — phone wallets and the browser page |
|
|
136
137
|
| `pair_phone_wallet` | Pair a phone over WalletConnect, returns a QR |
|
|
137
|
-
| `disconnect_phone_wallet` | Drop every
|
|
138
|
+
| `disconnect_phone_wallet` | Drop one paired wallet by `account`, or every session and pairing |
|
|
138
139
|
|
|
139
140
|
The four signing tools take a required `signWith` of `phone` or `browser`. There is no
|
|
140
141
|
default on purpose — the agent has to ask you, so a request never lands on a device you are
|
|
141
|
-
not holding.
|
|
142
|
+
not holding. On `localhost` only the browser can sign; a phone has no route to your node.
|
|
143
|
+
With several phones paired, the optional `account` picks one by address;
|
|
144
|
+
omitted, the most recently paired is used.
|
|
145
|
+
|
|
146
|
+
A request not approved within the call comes back with a `requestId` instead of hanging,
|
|
147
|
+
and `check_signing_request` collects it — asking again would put a second prompt in front
|
|
148
|
+
of your wallet.
|
|
142
149
|
|
|
143
150
|
### 📜 Contracts
|
|
144
151
|
| Tool | |
|
|
145
152
|
| --- | --- |
|
|
146
|
-
| `read_contract` | Read state via view/pure functions — batched, no wallet, no gas |
|
|
153
|
+
| `read_contract` | Read state via view/pure functions — batched (up to 25 calls), no wallet, no gas |
|
|
147
154
|
| `simulate_contract` | Simulate without broadcasting, with gas |
|
|
155
|
+
| `simulate_bundle` | Simulate several transactions in order, each on the state the last left — approve → swap. Needs `ALCHEMY_API_KEY` |
|
|
148
156
|
| `get_contract_abi` | ABI, with proxy detection and verification status |
|
|
149
157
|
| `get_contract_source_code` | Verified source, proxies included |
|
|
150
158
|
| `get_contract_source_file` | One file out of the cached source |
|
|
@@ -157,14 +165,20 @@ not holding.
|
|
|
157
165
|
### ⛓️ Chain data
|
|
158
166
|
| Tool | |
|
|
159
167
|
| --- | --- |
|
|
160
|
-
| `get_balance` | Native or ERC-20 balances — batched |
|
|
161
|
-
| `get_logs` | Query and decode events,
|
|
168
|
+
| `get_balance` | Native or ERC-20 balances — batched, up to 25 queries |
|
|
169
|
+
| `get_logs` | Query and decode events; Hypersync when the RPC refuses the range. At most 1,000 logs — past that it returns `truncated` and the `nextBlock` to continue from. A list in `eventArgs` matches any of its values |
|
|
162
170
|
| `get_block_info` | Block data |
|
|
163
171
|
| `get_storage_at` | Storage slots, with type decoding |
|
|
164
172
|
| `get_gas_price` | Current gas — legacy and EIP-1559 |
|
|
165
173
|
| `estimate_gas` | Gas for any transaction |
|
|
166
|
-
| `trace_transaction` | Call tree,
|
|
167
|
-
| `debug_call` | Trace a call without broadcasting,
|
|
174
|
+
| `trace_transaction` | Call tree, prestate or state diff |
|
|
175
|
+
| `debug_call` | Trace a call without broadcasting, through a node at `ANVIL_RPC_URL` |
|
|
176
|
+
|
|
177
|
+
Tracing prefers an RPC that exposes `debug_*`, and otherwise uses a node you already run at
|
|
178
|
+
`ANVIL_RPC_URL` (default `127.0.0.1:8545`, e.g. `anvil --fork-url …`) — nothing is started
|
|
179
|
+
for you. Replaying a transaction older than the fork re-forks that node, clearing its state,
|
|
180
|
+
so it happens only with `ANVIL_ALLOW_RESET=1`. A hosted server has no default and traces only
|
|
181
|
+
through an explicit `ANVIL_RPC_URL`.
|
|
168
182
|
|
|
169
183
|
### 🏷️ ENS
|
|
170
184
|
| Tool | |
|
|
@@ -172,8 +186,10 @@ not holding.
|
|
|
172
186
|
| `resolve_ens_name` | Name → address |
|
|
173
187
|
| `reverse_resolve_ens` | Address → name |
|
|
174
188
|
| `get_ens_text_record` | Text records |
|
|
175
|
-
| `get_ens_avatar` |
|
|
176
|
-
| `batch_resolve_ens_names` |
|
|
189
|
+
| `get_ens_avatar` | The raw avatar record — URL, data URI or NFT reference, not fetched |
|
|
190
|
+
| `batch_resolve_ens_names` | Up to 25 names at once |
|
|
191
|
+
|
|
192
|
+
ENS tools take `mainnet` (ENS), `linea` (Linea Names) or `base` (Basenames).
|
|
177
193
|
|
|
178
194
|
</details>
|
|
179
195
|
|
|
@@ -196,7 +212,7 @@ not holding.
|
|
|
196
212
|
| Unichain | 130 | ✅ |
|
|
197
213
|
| Localhost | 1337 | ❌ |
|
|
198
214
|
|
|
199
|
-
Adding one is a single entry in [`mcp/src/chains.ts`](mcp/src/chains.ts).
|
|
215
|
+
Adding one is a single entry in [`mcp/src/chains.ts`](https://github.com/hajnalben/web3-tools-mcp/blob/main/mcp/src/chains.ts).
|
|
200
216
|
|
|
201
217
|
</details>
|
|
202
218
|
|
|
@@ -291,7 +307,7 @@ What you lose is reach, not stability — so here is the honest version:
|
|
|
291
307
|
| `WALLETCONNECT_PROJECT_ID` | [walletconnect](https://dashboard.walletconnect.com) | 📱 **No phone signing at all.** Browser wallet only, so a hosted instance has no way to sign |
|
|
292
308
|
| `ALCHEMY_API_KEY`<br>or `INFURA_API_KEY`<br>or `CUSTOM_RPC` | [alchemy](https://alchemy.com) · [infura](https://infura.io) | **No historical state.** Public endpoints answer `403 Archive requests require a personal token`, which takes out balances, storage and calls at a past block, event ranges, and `trace_transaction` |
|
|
293
309
|
| `ETHERSCAN_API_KEY` | [etherscan](https://etherscan.io/apis) | `get_contract_abi`, `get_contract_source_code` and `get_contract_source_file` refuse. Signing previews still decode — they try Sourcify first, then recover the ABI from bytecode |
|
|
294
|
-
| `HYPERSYNC_API_KEY` | [envio](https://envio.dev) |
|
|
310
|
+
| `HYPERSYNC_API_KEY` | [envio](https://envio.dev) | `get_logs` asks the RPC first and falls back to Hypersync when the RPC refuses the range. Without a token that fallback is gone, so wide or past ranges depend on your provider's limits |
|
|
295
311
|
|
|
296
312
|
So with nothing configured you get current balances, contract reads, gas, ENS, simulation
|
|
297
313
|
and browser signing. Add `WALLETCONNECT_PROJECT_ID` for your phone and one provider key for
|
|
@@ -299,7 +315,7 @@ history, and everything above lights up.
|
|
|
299
315
|
|
|
300
316
|
Every key has a matching flag (`--etherscan-api-key`, …), RPC selection falls back
|
|
301
317
|
Alchemy → Infura → public, and `CUSTOM_RPC` overrides all of it.
|
|
302
|
-
`npx web3-tools-mcp --help` lists them; [.env.example](.env.example) documents each one.
|
|
318
|
+
`npx web3-tools-mcp --help` lists them; [.env.example](https://github.com/hajnalben/web3-tools-mcp/blob/main/.env.example) documents each one.
|
|
303
319
|
|
|
304
320
|
```bash
|
|
305
321
|
npx web3-tools-mcp --etherscan-api-key KEY --walletconnect-project-id ID
|
|
@@ -319,26 +335,34 @@ transaction at your phone.
|
|
|
319
335
|
<a href="https://fly.io/docs/launch/"><img src="https://img.shields.io/badge/Deploy%20on-Fly.io-8b5cf6?style=for-the-badge&logo=flydotio&logoColor=white" alt="Deploy on Fly.io" height="32"></a>
|
|
320
336
|
|
|
321
337
|
**Render** reads `render.yaml`, generates `MCP_TOKEN` and asks for `WALLETCONNECT_PROJECT_ID`
|
|
322
|
-
—
|
|
338
|
+
— one click, on a paid `starter` instance with a 1 GB disk so it stays awake and keeps the
|
|
339
|
+
pairing. `MCP_PUBLIC_URL` defaults to the service's `onrender.com` address; set it only for a
|
|
340
|
+
custom domain.
|
|
323
341
|
|
|
324
342
|
**Fly** ships no deploy button, so it is four commands. Worth it for a personal instance:
|
|
325
343
|
volumes come with any plan, so the pairing survives redeploys without paying for a disk.
|
|
326
344
|
|
|
327
345
|
```bash
|
|
328
|
-
fly launch --no-deploy --copy-config
|
|
346
|
+
fly launch --no-deploy --copy-config # then set MCP_PUBLIC_URL in fly.toml to https://<app>.fly.dev
|
|
329
347
|
fly volumes create data --size 1
|
|
330
348
|
fly secrets set MCP_TOKEN=$(openssl rand -hex 24) WALLETCONNECT_PROJECT_ID=<id>
|
|
331
349
|
fly deploy
|
|
332
350
|
```
|
|
333
351
|
|
|
352
|
+
Without the right `MCP_PUBLIC_URL` the OAuth metadata and the wallet links point somewhere
|
|
353
|
+
clients cannot reach. Both `fly.toml` and `render.yaml` set `MCP_TRUST_PROXY=1`, so rate
|
|
354
|
+
limiting sees client addresses rather than the platform's proxy.
|
|
355
|
+
|
|
334
356
|
<details>
|
|
335
357
|
<summary>🐳 <b>Docker, and connecting a client</b></summary>
|
|
336
358
|
|
|
337
359
|
There is a plain `Dockerfile` too, so Railway, Cloud Run or your own box work the same way:
|
|
338
360
|
|
|
339
361
|
```bash
|
|
362
|
+
docker build -t web3-tools-mcp .
|
|
340
363
|
docker run -p 8080:8080 \
|
|
341
364
|
-e MCP_TOKEN=<long random string> \
|
|
365
|
+
-e MCP_PUBLIC_URL=https://your-host \
|
|
342
366
|
-e WALLETCONNECT_PROJECT_ID=<id> \
|
|
343
367
|
web3-tools-mcp
|
|
344
368
|
```
|
|
@@ -352,49 +376,54 @@ claude mcp add --transport http web3-tools https://your-host/mcp \
|
|
|
352
376
|
|
|
353
377
|
Clients that cannot send a header — claude.ai connectors, and the browser and phone apps —
|
|
354
378
|
use OAuth, which the server implements against the same credential: it shows a page asking
|
|
355
|
-
for `MCP_TOKEN` and issues a token once you paste it. No identity provider, no accounts.
|
|
356
|
-
`MCP_PUBLIC_URL` to the address clients reach you on, since OAuth metadata must advertise it.
|
|
379
|
+
for `MCP_TOKEN` and issues a token once you paste it. No identity provider, no accounts.
|
|
357
380
|
|
|
358
381
|
> 🔐 **`MCP_TOKEN` is mandatory** and the server refuses to start without it. Anyone who
|
|
359
382
|
> reaches `/mcp` while your phone is paired can push signing prompts at it. You would still
|
|
360
383
|
> approve each one, but that is a phishing surface, not a feature.
|
|
361
384
|
|
|
385
|
+
| Variable | |
|
|
386
|
+
| --- | --- |
|
|
387
|
+
| `MCP_HTTP_PORT` | Serve over HTTP on this port instead of stdio. Also switches on the hosted guards: no `localhost` chain, no loopback tracing node |
|
|
388
|
+
| `MCP_HTTP_HOST` | Bind address, default `0.0.0.0` |
|
|
389
|
+
| `MCP_TOKEN` | The one credential, as a bearer header or through OAuth. Changing it revokes every OAuth token issued against the old one |
|
|
390
|
+
| `MCP_PUBLIC_URL` | The address clients reach you on — advertised in OAuth metadata and used for wallet links |
|
|
391
|
+
| `MCP_TRUST_PROXY` | Reverse-proxy hops to trust for client IPs in rate limiting. `1` behind Fly or Render; off by default |
|
|
392
|
+
| `MCP_HOSTED` | The hosted guards without `MCP_HTTP_PORT`, for a host assembling its own server from the library |
|
|
393
|
+
| `XDG_CONFIG_HOME` | Where pairings, OAuth tokens and the relay token are stored, under `web3-tools-mcp/` |
|
|
394
|
+
| `UPSTASH_REDIS_REST_URL`<br>`UPSTASH_REDIS_REST_TOKEN` | Keep sessions and tokens in Redis instead. Needs per-field hash expiry (`HEXPIRE`: Upstash, or Redis ≥ 7.4) |
|
|
395
|
+
| `WALLET_TOKEN` | Relay secret. Unset, a hosted server mints one per boot |
|
|
396
|
+
| `WALLET_SERVER_URL` | A separately hosted relay, below |
|
|
397
|
+
| `ANVIL_RPC_URL`<br>`ANVIL_ALLOW_RESET` | Tracing node, and whether it may be re-forked — see Tools |
|
|
398
|
+
|
|
362
399
|
Two things decide whether the pairing survives:
|
|
363
400
|
|
|
364
401
|
- ⏰ **Keep the instance awake.** Sleeping drops the WalletConnect socket, so the first
|
|
365
402
|
transaction after an idle period waits for the host to wake — about a minute on a free tier.
|
|
366
403
|
- 💾 **Give the session somewhere durable.** Most hosts have an ephemeral filesystem, so a
|
|
367
404
|
plain file is lost on redeploy and you rescan the QR. Attach a volume and point
|
|
368
|
-
`XDG_CONFIG_HOME` at it (what `render.yaml`
|
|
369
|
-
`UPSTASH_REDIS_REST_TOKEN` ([Upstash](https://upstash.com)
|
|
405
|
+
`XDG_CONFIG_HOME` at it (what `render.yaml` and `fly.toml` do), or set
|
|
406
|
+
`UPSTASH_REDIS_REST_URL` and `UPSTASH_REDIS_REST_TOKEN` ([Upstash](https://upstash.com)
|
|
407
|
+
has a free plan).
|
|
370
408
|
|
|
371
409
|
Render's free Key Value instance is not an option here — no persistence, so the pairing
|
|
372
410
|
disappears at its next maintenance.
|
|
373
411
|
|
|
374
412
|
Both signers work on a hosted instance. The signing page is served from the same port as
|
|
375
413
|
`/mcp`, so `https://your-host/#t=<relay token>` is your wallet page — no second service to
|
|
376
|
-
deploy. Ask the agent for `wallet_status` to get the link; it is behind `MCP_TOKEN
|
|
377
|
-
relay
|
|
378
|
-
redeploy.
|
|
414
|
+
deploy. Ask the agent for `wallet_status` to get the link; it is behind `MCP_TOKEN` and never written to the logs. Unless
|
|
415
|
+
you set `WALLET_TOKEN`, the relay secret is minted fresh each boot rather than stored, so the
|
|
416
|
+
URL changes when you redeploy.
|
|
379
417
|
|
|
380
418
|
</details>
|
|
381
419
|
|
|
382
420
|
<details>
|
|
383
421
|
<summary>🖇️ <b>Host the signing page</b> separately</summary>
|
|
384
422
|
|
|
385
|
-
The relay is its own package, [`wallet-relay
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
```bash
|
|
390
|
-
WALLET_TOKEN=<long random string> \
|
|
391
|
-
WALLET_PUBLIC_URL=https://wallet.example.com \
|
|
392
|
-
npx web3-wallet-relay
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
Then point the server at it with `WALLET_SERVER_URL` and the same `WALLET_TOKEN`.
|
|
396
|
-
`render.yaml` deploys it as-is. Anyone holding `WALLET_TOKEN` can send your browser a
|
|
397
|
-
transaction to sign — treat it like a password, and always serve over HTTPS.
|
|
423
|
+
The relay is its own package, [`web3-wallet-relay`](https://github.com/hajnalben/web3-tools-mcp/tree/main/wallet-relay),
|
|
424
|
+
and runs anywhere that keeps a Node process alive and supports WebSockets. Its README covers
|
|
425
|
+
hosting it; run it at this server's version, then point the server at it with
|
|
426
|
+
`WALLET_SERVER_URL` and the same `WALLET_TOKEN`.
|
|
398
427
|
|
|
399
428
|
Locally nothing changes: the server embeds the same relay.
|
|
400
429
|
|
|
@@ -416,11 +445,11 @@ npm run typecheck
|
|
|
416
445
|
npm test
|
|
417
446
|
```
|
|
418
447
|
|
|
419
|
-
Two workspaces: [`mcp/`](mcp) is this server, [`wallet-relay/`](wallet-relay) is the signing
|
|
420
|
-
page. [CONTRIBUTING.md](CONTRIBUTING.md) covers running a checkout against a client, the
|
|
421
|
-
layout, and how to add a chain or a tool. Releases: [CHANGELOG.md](CHANGELOG.md).
|
|
448
|
+
Two workspaces: [`mcp/`](https://github.com/hajnalben/web3-tools-mcp/tree/main/mcp) is this server, [`wallet-relay/`](https://github.com/hajnalben/web3-tools-mcp/tree/main/wallet-relay) is the signing
|
|
449
|
+
page. [CONTRIBUTING.md](https://github.com/hajnalben/web3-tools-mcp/blob/main/CONTRIBUTING.md) covers running a checkout against a client, the
|
|
450
|
+
layout, and how to add a chain or a tool. Releases: [CHANGELOG.md](https://github.com/hajnalben/web3-tools-mcp/blob/main/CHANGELOG.md).
|
|
422
451
|
|
|
423
|
-
Requires Node.js ≥ 20.
|
|
452
|
+
Requires Node.js ≥ 20.19.
|
|
424
453
|
|
|
425
454
|
## 📄 License
|
|
426
455
|
|
package/dist/anvil.d.ts
CHANGED
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
forkUrl: string;
|
|
11
|
-
forkBlockNumber?: bigint;
|
|
12
|
-
port?: number;
|
|
13
|
-
chainId?: number;
|
|
14
|
-
}
|
|
15
|
-
export declare function isAnvilInstalled(): Promise<boolean>;
|
|
16
|
-
export declare function startAnvil(config: AnvilConfig): Promise<AnvilInstance>;
|
|
17
|
-
export declare function stopAnvil(instance: AnvilInstance): void;
|
|
18
|
-
export declare function withAnvil<T>(config: AnvilConfig, fn: (instance: AnvilInstance) => Promise<T>): Promise<T>;
|
|
19
|
-
export declare function traceTransactionWithAnvil(forkUrl: string, transactionHash: string, blockNumber: bigint, tracer?: 'callTracer' | 'prestateTracer' | 'stateDiffTracer', chainName?: string): Promise<unknown>;
|
|
1
|
+
/**
|
|
2
|
+
* The node to ask for traces, or undefined when there is none.
|
|
3
|
+
*
|
|
4
|
+
* Hosted, only an explicit setting counts: defaulting to loopback would turn every trace
|
|
5
|
+
* into a request against the server's own private network.
|
|
6
|
+
*/
|
|
7
|
+
export declare function debugRpcUrl(): string | undefined;
|
|
8
|
+
/** Whether a tracing node is reachable and actually offers the debug namespace. */
|
|
9
|
+
export declare function isDebugNodeAvailable(): Promise<boolean>;
|
|
20
10
|
export interface SimulateCallParams {
|
|
21
11
|
to: string;
|
|
22
12
|
data?: string;
|
|
@@ -24,6 +14,14 @@ export interface SimulateCallParams {
|
|
|
24
14
|
value?: bigint;
|
|
25
15
|
gas?: bigint;
|
|
26
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Replay a transaction through the tracing node.
|
|
19
|
+
*
|
|
20
|
+
* Run against the block before it, so the state is what the transaction actually saw. The
|
|
21
|
+
* node needs archive access to that block; without it this fails rather than quietly
|
|
22
|
+
* tracing against the wrong state.
|
|
23
|
+
*/
|
|
24
|
+
export declare function traceTransactionWithAnvil(forkUrl: string, transactionHash: string, blockNumber: bigint, tracer?: 'callTracer' | 'prestateTracer' | 'stateDiffTracer'): Promise<unknown>;
|
|
27
25
|
export declare function simulateCallWithTrace(forkUrl: string, params: SimulateCallParams, blockNumber?: bigint, tracer?: 'callTracer' | 'prestateTracer'): Promise<{
|
|
28
26
|
result: string;
|
|
29
27
|
trace: unknown;
|
package/dist/anvil.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anvil.d.ts","sourceRoot":"","sources":["../src/anvil.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anvil.d.ts","sourceRoot":"","sources":["../src/anvil.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,SAAS,CAGhD;AAMD,mFAAmF;AACnF,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAe7D;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AA0ED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,YAAY,GAAG,gBAAgB,GAAG,iBAAgC,GACzE,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAC1B,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,GAAE,YAAY,GAAG,gBAA+B,GACrD,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAC,CAiCD"}
|