agenti: what we found
Solana x402 verifier rejects payments made with version 1 transactions (maxSupportedTransactionVersion: 0). MCP tools accept private keys and mnemonics as tool arguments, which puts them in the model's context and client logs.
Public since 2026-10-28. GitHub issue nirholas/agenti/issues/192 was posted.
Code: nirholas/agenti, their default branch on 2026-10-28. Reported to them: nirholas/agenti/issues/192.
Status: Open: no fix merged yet; Open: no fix merged yet
Findings
breaks money
Solana x402 verifier rejects payments made with version 1 transactions (maxSupportedTransactionVersion: 0)
packages/facilitator/src/solana/verifier.ts fetches the payer's transaction with maxSupportedTransactionVersion: 0. When the payment was sent as a version 1 transaction, the RPC refuses with error -32015 ("Transaction version (1) is not supported by the requesting client"), the catch turns it into Solana RPC error: ..., and the payment is treated as an outage instead of being verified. The buyer paid, and the request still fails.
Version 1 is common on mainnet now (around 40% of non-vote transactions in a block I sampled), and @solana/kit 8 clients build v1 when configured to.
@solana/web3.js 1.99.0 (the version in your packages) returns it fine with 1, so the fix is the one value. The same maxSupportedTransactionVersion: 0 is also in:
packages/sdk/src/solana/payments.ts(lines 375, 800, 847)packages/sdk/src/solana/events.ts(line 333)packages/mcp/src/server.ts(line 891)scripts/checks/check-solana-verifier.mjs(line 36)
packages/facilitator/src/solana/verifier.tspackages/sdk/src/solana/payments.ts:375packages/sdk/src/solana/payments.ts:800packages/sdk/src/solana/payments.ts:847packages/sdk/src/solana/events.ts:333packages/mcp/src/server.ts:891scripts/checks/check-solana-verifier.mjs:36
getTransaction(<v1 signature>, { maxSupportedTransactionVersion: 0 }) -> error -32015
getTransaction(<v1 signature>, { maxSupportedTransactionVersion: 1 }) -> transaction (version 1, meta present)Fix: Changing each to maxSupportedTransactionVersion: 1 should cover it.
security
MCP tools accept private keys and mnemonics as tool arguments, which puts them in the model's context and client logs
8 of the 58 tools in packages/mcp/src/server.ts take key material as an argument:
evm_private_key:get_balance,pay,create_invoice,bnb_get_balance,bnb_transfer,bnb_swap,sign_messagemnemonic:derive_wallet
When a model fills one of these in (for example after a user pastes a key into chat, or a prompt-injected page asks it to), the key or phrase becomes part of the conversation sent to the model provider and is stored in the MCP client's logs and transcripts. Each tool already falls back to AGENTI_EVM_PRIVATE_KEY, so the argument isn't needed for normal use.
packages/mcp/src/server.ts
Fix: Drop the key arguments and read keys only from the environment (or a local keystore), so a key can never travel through the model. If you'd rather keep them, a warning in each tool description ("never pass a key here; set AGENTI_EVM_PRIVATE_KEY") would at least steer models away from it. generate_wallet returning private keys in its output has the same exposure.
What we measured
| What | Result | How | Checked |
|---|---|---|---|
| Reported to them | nirholas/agenti/issues/192, posted 2026-10-28 | https://github.com/nirholas/agenti/issues/192 | Oct 28, 2026, 2:30 AM UTC |
| Status | Open: no fix merged yet | GitHub issue nirholas/agenti#192 | Oct 31, 2026, 1:55 AM UTC |
| Reported to them | nirholas/agenti/issues/193, posted 2026-10-28 | https://github.com/nirholas/agenti/issues/193 | Oct 28, 2026, 2:30 AM UTC |
| Status | Open: no fix merged yet | GitHub issue nirholas/agenti#193 | Oct 31, 2026, 1:55 AM UTC |
Tools run on this project
Check it yourself
Every Pulse tool, live on mainnet, starting with tx_version. Paste any signature from this report, or your own.
Toolbox
Pick any tool, change any input, run it on mainnet, and reopen any call to change it and run it again.
Ctrl ↵ runs the tool
Run when code can't find or read a transaction that is on chain, or before relying on code that reads other people's transactions. Read the docs
Response
Run the request to see the live response. The inputs are real mainnet data, so it works as it is.
Your calls 0
Calls you run appear here and stay in this browser. Open one to change its inputs and run it again.