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 +4 -5
- package/build/x402-payment.d.ts +11 -0
- package/build/x402-payment.js +13 -0
- package/package.json +1 -1
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
|
-
:
|
|
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.
|
|
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.
|
package/build/x402-payment.d.ts
CHANGED
|
@@ -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;
|
package/build/x402-payment.js
CHANGED
|
@@ -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.
|
|
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",
|