agentwallet-mcp 1.10.8 → 1.10.9

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/build/index.js CHANGED
@@ -13,7 +13,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
13
13
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
14
  import { z } from 'zod';
15
15
  import { assertPublicUrl, safeFetch } from './ssrf-guard.js';
16
- import { deriveX402Payment, isWithinCap, lookupTrustedDecimals, assertDeclaredDecimals, } from './x402-payment.js';
16
+ import { deriveX402Payment, isWithinCap, lookupTrustedDecimals, assertDeclaredDecimals, nativeDecimals, SOLANA_CHAIN_IDS, } from './x402-payment.js';
17
17
  import { isLocalMode, getLocalAddress, localWalletRecord, localSend, localNativeBalance, localTokenBalance, localSignMessage, resolveRpcUrl, } from './local-wallet.js';
18
18
  import { isSolanaLocalMode, getSolanaAddress, solanaWalletRecord, localSolBalance, localSplBalance, localSolTransfer, localSplTransfer, resolveSolanaRpc, } from './local-solana.js';
19
19
  /** True when either chain family is running non-custodially. */
@@ -258,7 +258,7 @@ async function handleX402Payment(x402Data, originalPath, originalMethod, origina
258
258
  const assetForDecimals = accept.asset || accept.extra?.token || '';
259
259
  const trustedDecimals = assetForDecimals
260
260
  ? await resolveTrustedDecimals(chainId, assetForDecimals)
261
- : 18; // native asset: value is already in wei-equivalent base units
261
+ : nativeDecimals(chainId); // native asset: 18 on EVM (wei), 9 on Solana (lamports)
262
262
  const { tokenAddress, rawAmount, decimals } = deriveX402Payment(accept, maxAutopay, trustedDecimals);
263
263
  // Send payment using our wallet (with X-AGW-SKIP-X402 to prevent recursion)
264
264
  let txHash;
@@ -310,7 +310,6 @@ function jsonResponse(data) {
310
310
  return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
311
311
  }
312
312
  // ─── Solana Helpers ───────────────────────────────────────────────
313
- const SOLANA_CHAIN_IDS = new Set([900, 901, 902]);
314
313
  function isSolanaChain(chainId) {
315
314
  return SOLANA_CHAIN_IDS.has(chainId);
316
315
  }
@@ -424,7 +423,7 @@ function resolveChainId(network) {
424
423
  const AddressSchema = z.string().regex(/^(0x[a-fA-F0-9]{40}|[1-9A-HJ-NP-Za-km-z]{32,44})$/, 'Must be a 0x-prefixed 40-hex EVM address or a base58 Solana address');
425
424
  const server = new McpServer({
426
425
  name: 'agentwallet',
427
- version: '1.10.8',
426
+ version: '1.10.9',
428
427
  }, {
429
428
  instructions: `AgentWallet gives AI agents their own blockchain wallets. Private keys are encrypted server-side and never exposed — agents sign and broadcast transactions without ever touching raw keys.
430
429
 
@@ -1032,7 +1031,7 @@ server.tool('pay_x402', 'Handle an x402 payment flow. Fetches a URL, and if the
1032
1031
  const assetForDecimals = option.asset || option.extra?.token || '';
1033
1032
  const trustedDecimals = assetForDecimals
1034
1033
  ? await resolveTrustedDecimals(chainId, assetForDecimals)
1035
- : 18;
1034
+ : nativeDecimals(chainId); // 18 on EVM (wei), 9 on Solana (lamports)
1036
1035
  assertDeclaredDecimals(option.requiredDecimals, trustedDecimals);
1037
1036
  // Human-readable amount, computed with trusted decimals so what the agent
1038
1037
  // is told matches what will actually leave the wallet.
@@ -81,4 +81,15 @@ export declare function deriveX402Payment(accept: X402AcceptLike, maxAutopayHuma
81
81
  * @param trustedDecimals token decimals from a trusted source, NOT the 402 body
82
82
  * @param capHuman cap in human-readable units of the asset (e.g. "1")
83
83
  */
84
+ /**
85
+ * Chain IDs this server treats as Solana (mainnet, devnet, testnet).
86
+ */
87
+ export declare const SOLANA_CHAIN_IDS: ReadonlySet<number>;
88
+ /**
89
+ * Decimals of a chain's NATIVE asset. EVM natives are 18 (wei); native SOL is
90
+ * 9 (lamports). The x402 cap and the human-readable amount must use this when
91
+ * a requirement names no token, otherwise a native-SOL requirement is measured
92
+ * against a cap inflated by 10**9 (AW-002, reported 2026-09-22).
93
+ */
94
+ export declare function nativeDecimals(chainId: number): number;
84
95
  export declare function isWithinCap(rawAmountRequired: string, trustedDecimals: number, capHuman: string): boolean;
@@ -146,6 +146,19 @@ export function deriveX402Payment(accept, maxAutopayHuman, trustedDecimals) {
146
146
  * @param trustedDecimals token decimals from a trusted source, NOT the 402 body
147
147
  * @param capHuman cap in human-readable units of the asset (e.g. "1")
148
148
  */
149
+ /**
150
+ * Chain IDs this server treats as Solana (mainnet, devnet, testnet).
151
+ */
152
+ export const SOLANA_CHAIN_IDS = new Set([900, 901, 902]);
153
+ /**
154
+ * Decimals of a chain's NATIVE asset. EVM natives are 18 (wei); native SOL is
155
+ * 9 (lamports). The x402 cap and the human-readable amount must use this when
156
+ * a requirement names no token, otherwise a native-SOL requirement is measured
157
+ * against a cap inflated by 10**9 (AW-002, reported 2026-09-22).
158
+ */
159
+ export function nativeDecimals(chainId) {
160
+ return SOLANA_CHAIN_IDS.has(chainId) ? 9 : 18;
161
+ }
149
162
  export function isWithinCap(rawAmountRequired, trustedDecimals, capHuman) {
150
163
  if (!/^\d+$/.test(rawAmountRequired)) {
151
164
  throw new Error(`Invalid maxAmountRequired "${rawAmountRequired}" (expected an integer base-unit amount).`);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agentwallet-mcp",
3
3
  "mcpName": "io.github.hifriendbot/agentwallet",
4
- "version": "1.10.8",
4
+ "version": "1.10.9",
5
5
  "description": "MCP server for AgentWallet: self-custody local signing on EVM and Solana, or hosted wallets. Sign, broadcast, pay x402 invoices, and accept x402 payments.",
6
6
  "type": "module",
7
7
  "main": "build/index.js",