@moonpay/cli 0.4.2 → 0.4.3
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/dist/{chunk-DAQDHLPY.js → chunk-BSUHFW7I.js} +44 -25
- package/dist/chunk-BSUHFW7I.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/{mcp-QLBMU7OH.js → mcp-7A6UP5CV.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-DAQDHLPY.js.map +0 -1
- /package/dist/{mcp-QLBMU7OH.js.map → mcp-7A6UP5CV.js.map} +0 -0
|
@@ -2264,8 +2264,48 @@ function signBitcoin2(privateKey, messageBytes) {
|
|
|
2264
2264
|
return { signature: "0x" + Buffer.from(sig).toString("hex") };
|
|
2265
2265
|
}
|
|
2266
2266
|
|
|
2267
|
-
// src/tools/wallet/
|
|
2268
|
-
|
|
2267
|
+
// src/tools/wallet/prompt.ts
|
|
2268
|
+
function promptPassword(prompt) {
|
|
2269
|
+
return new Promise((resolve, reject) => {
|
|
2270
|
+
if (!process.stdin.isTTY) {
|
|
2271
|
+
const { createInterface: createInterface3 } = __require("readline");
|
|
2272
|
+
const rl = createInterface3({ input: process.stdin, output: process.stderr });
|
|
2273
|
+
rl.question(prompt, (answer) => {
|
|
2274
|
+
rl.close();
|
|
2275
|
+
resolve(answer);
|
|
2276
|
+
});
|
|
2277
|
+
return;
|
|
2278
|
+
}
|
|
2279
|
+
process.stderr.write(prompt);
|
|
2280
|
+
process.stdin.setRawMode(true);
|
|
2281
|
+
process.stdin.resume();
|
|
2282
|
+
process.stdin.setEncoding("utf8");
|
|
2283
|
+
let password = "";
|
|
2284
|
+
const onData = (ch) => {
|
|
2285
|
+
const code = ch.charCodeAt(0);
|
|
2286
|
+
if (ch === "\r" || ch === "\n" || code === 13 || code === 10) {
|
|
2287
|
+
process.stdin.setRawMode(false);
|
|
2288
|
+
process.stdin.pause();
|
|
2289
|
+
process.stdin.removeListener("data", onData);
|
|
2290
|
+
process.stderr.write("\n");
|
|
2291
|
+
resolve(password);
|
|
2292
|
+
} else if (code === 3) {
|
|
2293
|
+
process.stdin.setRawMode(false);
|
|
2294
|
+
process.stdin.pause();
|
|
2295
|
+
process.stdin.removeListener("data", onData);
|
|
2296
|
+
process.stderr.write("\n");
|
|
2297
|
+
reject(new Error("Aborted"));
|
|
2298
|
+
} else if (code === 127 || code === 8) {
|
|
2299
|
+
if (password.length > 0) {
|
|
2300
|
+
password = password.slice(0, -1);
|
|
2301
|
+
}
|
|
2302
|
+
} else {
|
|
2303
|
+
password += ch;
|
|
2304
|
+
}
|
|
2305
|
+
};
|
|
2306
|
+
process.stdin.on("data", onData);
|
|
2307
|
+
});
|
|
2308
|
+
}
|
|
2269
2309
|
|
|
2270
2310
|
// src/tools/wallet/lock/schema.ts
|
|
2271
2311
|
import { z as z8 } from "zod";
|
|
@@ -2279,15 +2319,6 @@ var walletLockSchema = defineToolSchema({
|
|
|
2279
2319
|
});
|
|
2280
2320
|
|
|
2281
2321
|
// src/tools/wallet/lock/tool.ts
|
|
2282
|
-
async function promptPassword(prompt) {
|
|
2283
|
-
const rl = createInterface3({ input: process.stdin, output: process.stderr });
|
|
2284
|
-
return new Promise((resolve) => {
|
|
2285
|
-
rl.question(prompt, (answer) => {
|
|
2286
|
-
rl.close();
|
|
2287
|
-
resolve(answer);
|
|
2288
|
-
});
|
|
2289
|
-
});
|
|
2290
|
-
}
|
|
2291
2322
|
var walletLock = createTool(walletLockSchema, async () => {
|
|
2292
2323
|
if (isVaultLocked()) {
|
|
2293
2324
|
throw new Error("Vault is already locked.");
|
|
@@ -2304,9 +2335,6 @@ var walletLock = createTool(walletLockSchema, async () => {
|
|
|
2304
2335
|
return { locked: true };
|
|
2305
2336
|
});
|
|
2306
2337
|
|
|
2307
|
-
// src/tools/wallet/unlock/tool.ts
|
|
2308
|
-
import { createInterface as createInterface4 } from "readline";
|
|
2309
|
-
|
|
2310
2338
|
// src/tools/wallet/unlock/schema.ts
|
|
2311
2339
|
import { z as z9 } from "zod";
|
|
2312
2340
|
var walletUnlockSchema = defineToolSchema({
|
|
@@ -2319,20 +2347,11 @@ var walletUnlockSchema = defineToolSchema({
|
|
|
2319
2347
|
});
|
|
2320
2348
|
|
|
2321
2349
|
// src/tools/wallet/unlock/tool.ts
|
|
2322
|
-
async function promptPassword2(prompt) {
|
|
2323
|
-
const rl = createInterface4({ input: process.stdin, output: process.stderr });
|
|
2324
|
-
return new Promise((resolve) => {
|
|
2325
|
-
rl.question(prompt, (answer) => {
|
|
2326
|
-
rl.close();
|
|
2327
|
-
resolve(answer);
|
|
2328
|
-
});
|
|
2329
|
-
});
|
|
2330
|
-
}
|
|
2331
2350
|
var walletUnlock = createTool(walletUnlockSchema, async () => {
|
|
2332
2351
|
if (!isVaultLocked()) {
|
|
2333
2352
|
throw new Error("Vault is not locked.");
|
|
2334
2353
|
}
|
|
2335
|
-
const password = await
|
|
2354
|
+
const password = await promptPassword("Enter password to decrypt vault: ");
|
|
2336
2355
|
unlockVault(password);
|
|
2337
2356
|
return { unlocked: true };
|
|
2338
2357
|
});
|
|
@@ -2441,4 +2460,4 @@ export {
|
|
|
2441
2460
|
walletUnlock,
|
|
2442
2461
|
bitcoinBalanceRetrieve
|
|
2443
2462
|
};
|
|
2444
|
-
//# sourceMappingURL=chunk-
|
|
2463
|
+
//# sourceMappingURL=chunk-BSUHFW7I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/client.ts","../src/generated/schemas.json","../src/tools/wallet/create/tool.ts","../src/tools/shared.ts","../src/tools/wallet/vault.ts","../src/tools/wallet/create/schema.ts","../src/tools/wallet/import/tool.ts","../src/tools/wallet/import/schema.ts","../src/tools/wallet/list/schema.ts","../src/tools/wallet/list/tool.ts","../src/tools/wallet/retrieve/schema.ts","../src/tools/wallet/retrieve/tool.ts","../src/tools/wallet/delete/schema.ts","../src/tools/wallet/delete/tool.ts","../src/tools/transaction/sign/tool.ts","../src/tools/transaction/sign/schema.ts","../src/tools/message/sign/tool.ts","../src/tools/message/sign/schema.ts","../src/tools/wallet/prompt.ts","../src/tools/wallet/lock/schema.ts","../src/tools/wallet/lock/tool.ts","../src/tools/wallet/unlock/schema.ts","../src/tools/wallet/unlock/tool.ts","../src/tools/bitcoin/balance/tool.ts","../src/tools/bitcoin/balance/schema.ts"],"sourcesContent":["import { spawn } from \"child_process\";\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { createInterface } from \"node:readline\";\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".config\", \"moonpay\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\nconst CREDENTIALS_PATH = path.join(CONFIG_DIR, \"credentials.json\");\nconst LOCK_PATH = path.join(CONFIG_DIR, \".credentials.lock\");\n\n/** Built-in config used when no ~/.config/moonpay/config.json exists. */\nexport const DEFAULT_CONFIG: Config = {\n baseUrl: \"https://agents.moonpay.com\",\n clientId: \"mooniq_zin3s5jz3olzkdfxpmbeaogv\",\n};\n\nexport type Config = {\n baseUrl: string;\n clientId: string;\n clientSecret?: string;\n};\n\nexport type Credentials = {\n accessToken: string;\n refreshToken: string | null;\n expiresAt: number;\n baseUrl: string;\n};\n\nfunction ensureConfigDir() {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction atomicWriteFileSync(\n filePath: string,\n data: string,\n mode: number,\n) {\n const tmp = filePath + `.tmp.${process.pid}`;\n fs.writeFileSync(tmp, data, { encoding: \"utf-8\", mode });\n fs.renameSync(tmp, filePath);\n}\n\nconst LOCK_STALE_MS = 30_000;\n\nfunction acquireLock(): (() => void) | null {\n ensureConfigDir();\n try {\n const fd = fs.openSync(LOCK_PATH, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY, 0o600);\n fs.writeSync(fd, JSON.stringify({ pid: process.pid, ts: Date.now() }));\n fs.closeSync(fd);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n try {\n const lockData = JSON.parse(fs.readFileSync(LOCK_PATH, \"utf-8\"));\n if (Date.now() - lockData.ts < LOCK_STALE_MS) {\n return null;\n }\n } catch {\n // corrupt lock file\n }\n try { fs.unlinkSync(LOCK_PATH); } catch { /* already removed */ }\n try {\n const fd = fs.openSync(LOCK_PATH, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY, 0o600);\n fs.writeSync(fd, JSON.stringify({ pid: process.pid, ts: Date.now() }));\n fs.closeSync(fd);\n } catch {\n return null;\n }\n }\n return () => {\n try { fs.unlinkSync(LOCK_PATH); } catch { /* already removed */ }\n };\n}\n\nexport function getConfig(): Config | null {\n if (!fs.existsSync(CONFIG_PATH)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n if (!data.baseUrl || !data.clientId) return null;\n return data as Config;\n } catch {\n return null;\n }\n}\n\nexport function getConfigOrDefault(): Config {\n const fromFile = getConfig();\n if (fromFile) return fromFile;\n saveConfig(DEFAULT_CONFIG);\n return DEFAULT_CONFIG;\n}\n\nexport function getCredentials(): Credentials | null {\n if (!fs.existsSync(CREDENTIALS_PATH)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_PATH, \"utf-8\"));\n if (!data.accessToken || !data.baseUrl) return null;\n return data as Credentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(creds: Credentials) {\n ensureConfigDir();\n atomicWriteFileSync(CREDENTIALS_PATH, JSON.stringify(creds, null, 2), 0o600);\n}\n\nexport function saveConfig(config: Config) {\n ensureConfigDir();\n atomicWriteFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 0o600);\n}\n\nexport function clearCredentials() {\n if (fs.existsSync(CREDENTIALS_PATH)) {\n fs.unlinkSync(CREDENTIALS_PATH);\n }\n}\n\nexport function resolveBaseUrl(): string {\n const config = getConfig();\n const creds = getCredentials();\n return config?.baseUrl ?? creds?.baseUrl ?? DEFAULT_CONFIG.baseUrl;\n}\n\nfunction openBrowser(url: string): boolean {\n const platform = process.platform;\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args =\n platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\n try {\n spawn(cmd, args, { stdio: \"ignore\", detached: true }).unref();\n return true;\n } catch {\n return false;\n }\n}\n\nfunction promptLine(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * OAuth login flow.\n *\n * Redirects to a frontend callback page that displays the authorization code.\n * The user copies the code and pastes it into the terminal.\n * Works on desktop, headless servers, VPS, and SSH sessions.\n */\nconst LOGIN_STATE_PATH = path.join(CONFIG_DIR, \".login-state.json\");\n\ntype LoginOptions = {\n noBrowser?: boolean;\n code?: string;\n};\n\nexport async function login(config: Config, options: LoginOptions = {}): Promise<Credentials> {\n const callbackUrl = `${config.baseUrl}/callback`;\n\n // Step 2: complete login with a code from a previous --no-browser run\n if (options.code) {\n const stateData = loadLoginState();\n if (!stateData) {\n throw new Error(\"No pending login found. Run `mp login --no-browser` first.\");\n }\n return exchangeCode(config, options.code, callbackUrl, stateData.codeVerifier);\n }\n\n // Step 1: start the auth flow\n const state = crypto.randomUUID();\n const usePkce = !config.clientSecret;\n\n let codeVerifier: string | undefined;\n if (usePkce) {\n codeVerifier = generateCodeVerifier();\n }\n\n const authorizeParams = new URLSearchParams({\n client_id: config.clientId,\n redirect_uri: callbackUrl,\n response_type: \"code\",\n scope: \"profile email\",\n state,\n });\n if (usePkce && codeVerifier) {\n authorizeParams.set(\"code_challenge\", generateCodeChallenge(codeVerifier));\n authorizeParams.set(\"code_challenge_method\", \"S256\");\n }\n\n const authorizeUrl = `${config.baseUrl}/authorize?${authorizeParams.toString()}`;\n\n // Save PKCE state for --code step\n saveLoginState({ state, codeVerifier: codeVerifier ?? null });\n\n const opened = options.noBrowser ? false : openBrowser(authorizeUrl);\n\n // Always print the URL so it's visible in terminal/logs\n console.log(\"Open this URL in your browser to log in:\\n\");\n console.log(` ${authorizeUrl}\\n`);\n\n if (options.noBrowser) {\n console.log(\"Tip: you can run `open <url>` to open it directly.\");\n console.log(\"After authorizing, copy the code and run:\\n\");\n console.log(\" mp login --code <paste-code-here>\\n\");\n process.exit(0);\n }\n\n const code = await promptLine(\"Paste code: \");\n if (!code) {\n throw new Error(\"No authorization code provided.\");\n }\n\n return exchangeCode(config, code, callbackUrl, codeVerifier ?? null);\n}\n\nfunction saveLoginState(state: { state: string; codeVerifier: string | null }): void {\n ensureConfigDir();\n atomicWriteFileSync(LOGIN_STATE_PATH, JSON.stringify(state), 0o600);\n}\n\nfunction loadLoginState(): { state: string; codeVerifier: string | null } | null {\n if (!fs.existsSync(LOGIN_STATE_PATH)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(LOGIN_STATE_PATH, \"utf-8\"));\n fs.unlinkSync(LOGIN_STATE_PATH); // one-time use\n return data;\n } catch {\n return null;\n }\n}\n\nasync function exchangeCode(\n config: Config,\n code: string,\n callbackUrl: string,\n codeVerifier: string | null,\n): Promise<Credentials> {\n const tokenParams: Record<string, string> = {\n grant_type: \"authorization_code\",\n code,\n client_id: config.clientId,\n redirect_uri: callbackUrl,\n };\n if (config.clientSecret) {\n tokenParams.client_secret = config.clientSecret;\n }\n if (codeVerifier) {\n tokenParams.code_verifier = codeVerifier;\n }\n\n const tokenResponse = await fetch(`${config.baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(tokenParams),\n });\n\n if (!tokenResponse.ok) {\n const err = (await tokenResponse.json().catch(() => ({}))) as {\n error?: string;\n error_description?: string;\n };\n const msg = err.error_description ?? err.error ?? tokenResponse.statusText;\n throw new Error(`Token exchange failed: ${msg}`);\n }\n\n const tokens = await tokenResponse.json();\n const expiresAt = Date.now() + (tokens.expires_in ?? 3600) * 1000;\n\n const creds: Credentials = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? null,\n expiresAt,\n baseUrl: config.baseUrl,\n };\n\n saveCredentials(creds);\n return creds;\n}\n\nexport async function refreshCredentials(\n creds: Credentials,\n config: Config,\n): Promise<Credentials> {\n if (!creds.refreshToken) {\n throw new Error(\"No refresh token available\");\n }\n\n const unlock = acquireLock();\n if (!unlock) {\n await new Promise((r) => setTimeout(r, 2000));\n const fresh = getCredentials();\n if (fresh && fresh.expiresAt > Date.now()) {\n return fresh;\n }\n throw new Error(\"Token refresh failed (concurrent refresh in progress)\");\n }\n\n try {\n const latest = getCredentials();\n if (latest && latest.expiresAt > Date.now() + 60_000) {\n return latest;\n }\n\n const refreshParams: Record<string, string> = {\n grant_type: \"refresh_token\",\n refresh_token: creds.refreshToken,\n client_id: config.clientId,\n };\n if (config.clientSecret) {\n refreshParams.client_secret = config.clientSecret;\n }\n\n const tokenResponse = await fetch(`${config.baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(refreshParams),\n });\n\n if (!tokenResponse.ok) {\n throw new Error(\"Token refresh failed\");\n }\n\n const tokens = await tokenResponse.json();\n const expiresAt = Date.now() + (tokens.expires_in ?? 3600) * 1000;\n\n const newCreds: Credentials = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? creds.refreshToken,\n expiresAt,\n baseUrl: config.baseUrl,\n };\n\n saveCredentials(newCreds);\n return newCreds;\n } finally {\n unlock();\n }\n}\n\nconst TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;\n\nexport async function getValidToken(): Promise<string | null> {\n const creds = getCredentials();\n if (!creds) return null;\n\n const config = getConfig();\n if (!config || config.baseUrl !== creds.baseUrl) return null;\n\n if (Date.now() >= creds.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n if (creds.refreshToken) {\n try {\n const newCreds = await refreshCredentials(creds, config);\n return newCreds.accessToken;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n return creds.accessToken;\n}\n","/**\n * Remote tool client.\n * Attaches auth (Bearer token) if credentials are available, otherwise calls without auth.\n * Handles automatic token refresh on 401.\n */\n\nimport {\n getConfig,\n getCredentials,\n getValidToken,\n refreshCredentials,\n} from \"./auth\";\n\nexport async function callTool(\n baseUrl: string,\n toolName: string,\n params: Record<string, unknown>,\n): Promise<unknown> {\n const token = await getValidToken();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n let res = await fetch(`${baseUrl}/api/tools/${toolName}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(params),\n });\n\n // Auto-refresh on 401 if we have a refresh token\n if (res.status === 401 && token) {\n const creds = getCredentials();\n const config = getConfig();\n if (creds?.refreshToken && config && config.baseUrl === creds.baseUrl) {\n try {\n const newCreds = await refreshCredentials(creds, config);\n res = await fetch(`${baseUrl}/api/tools/${toolName}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${newCreds.accessToken}`,\n },\n body: JSON.stringify(params),\n });\n } catch {\n // Refresh failed, fall through\n }\n }\n }\n\n const data = await res.json();\n\n if (res.status === 401) {\n throw new Error(\"This command requires a MoonPay Agents account. Run `moonpay login` first.\");\n }\n\n if (res.status < 200 || res.status >= 300) {\n const err = data as { error?: string };\n throw new Error(err?.error ?? `Tool call failed (${res.status})`);\n }\n\n return data;\n}\n","[\n {\n \"name\": \"buy\",\n \"description\": \"Buy crypto with fiat via MoonPay. Returns a checkout URL to complete the purchase.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/buy_input\",\n \"definitions\": {\n \"buy_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"enum\": [\n \"sol\",\n \"usdc\",\n \"usdc_arbitrum\",\n \"usdc_base\",\n \"usdc_optimism\",\n \"usdc_sol\",\n \"usdc_polygon\",\n \"eth\",\n \"eth_polygon\",\n \"eth_optimism\",\n \"eth_base\",\n \"eth_arbitrum\"\n ],\n \"description\": \"MoonPay currency code: sol (Solana), usdc_sol (USDC on Solana), eth (Ethereum), usdc (USDC on Ethereum), usdc_base (USDC on Base), etc.\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"description\": \"Amount of the token to buy, in token units — not fiat. For example, 1.5 means 1.5 SOL, not $1.50.\"\n },\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Destination wallet address to receive the tokens\"\n },\n \"email\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"description\": \"Buyer email to pre-fill on the checkout page\"\n }\n },\n \"required\": [\n \"token\",\n \"amount\",\n \"wallet\",\n \"email\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_balance_list\",\n \"description\": \"List all token balances held in a wallet, including amount owned, current value in USD, and token details. Shows the complete token portfolio.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_balance_list_input\",\n \"definitions\": {\n \"token_balance_list_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Wallet address to check token balances for\"\n },\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain to check balances on (e.g. 'solana', 'ethereum', 'base')\"\n }\n },\n \"required\": [\n \"wallet\",\n \"chain\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_retrieve\",\n \"description\": \"Get detailed token information including market data, price changes, volume, trades, and holder statistics by token address\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_retrieve_input\",\n \"definitions\": {\n \"token_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Address of the token to retrieve\"\n },\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain network where the token exists\"\n }\n },\n \"required\": [\n \"token\",\n \"chain\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_search\",\n \"description\": \"Search for tokens by name, symbol, or address. Returns matching tokens with their market data including price, volume, and liquidity.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_search_input\",\n \"definitions\": {\n \"token_search_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"Search term - can be token name (e.g. 'Bitcoin'), symbol (e.g. 'BTC'), or partial match\"\n },\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain to search on (e.g. 'solana', 'ethereum', 'base')\"\n },\n \"limit\": {\n \"type\": [\n \"number\",\n \"null\"\n ],\n \"description\": \"Maximum number of results to return (optional, defaults to 5)\"\n }\n },\n \"required\": [\n \"query\",\n \"chain\",\n \"limit\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_swap_build\",\n \"description\": \"Build an unsigned swap transaction. Returns a base64-encoded transaction ready for signing.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_swap_build_input\",\n \"definitions\": {\n \"token_swap_build_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"input\": {\n \"type\": \"string\",\n \"description\": \"Mint address of the input token\"\n },\n \"output\": {\n \"type\": \"string\",\n \"description\": \"Mint address of the output token\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"description\": \"Amount of the input token to swap\"\n },\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Wallet address that will execute the swap\"\n }\n },\n \"required\": [\n \"input\",\n \"output\",\n \"amount\",\n \"wallet\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_swap_execute\",\n \"description\": \"Execute a signed swap transaction. Pass the signed transaction and requestId from token_swap_build.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_swap_execute_input\",\n \"definitions\": {\n \"token_swap_execute_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"transaction\": {\n \"type\": \"string\",\n \"description\": \"Base64-encoded signed transaction\"\n },\n \"requestId\": {\n \"type\": \"string\",\n \"description\": \"Request ID from token_swap_build\"\n }\n },\n \"required\": [\n \"transaction\",\n \"requestId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_transfer_build\",\n \"description\": \"Build an unsigned transfer transaction. Returns a base64-encoded transaction ready for signing. Handles both native SOL and SPL tokens.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_transfer_build_input\",\n \"definitions\": {\n \"token_transfer_build_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Wallet address to transfer from\"\n },\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Mint address of the token to transfer\"\n },\n \"to\": {\n \"type\": \"string\",\n \"description\": \"Recipient wallet address\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"description\": \"Amount to transfer in human-readable units (e.g. 1.5)\"\n }\n },\n \"required\": [\n \"wallet\",\n \"token\",\n \"to\",\n \"amount\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_trending_list\",\n \"description\": \"Get currently trending tokens on a blockchain. Perfect for discovering what's hot right now.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_trending_list_input\",\n \"definitions\": {\n \"token_trending_list_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain to get trending tokens from (e.g. 'solana', 'ethereum', 'base')\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"description\": \"Number of results per page\"\n },\n \"page\": {\n \"type\": \"number\",\n \"description\": \"The page number of results\"\n }\n },\n \"required\": [\n \"chain\",\n \"limit\",\n \"page\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"transaction_send\",\n \"description\": \"Broadcast a signed transaction to Solana. Simulates first, then sends and confirms.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/transaction_send_input\",\n \"definitions\": {\n \"transaction_send_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"transaction\": {\n \"type\": \"string\",\n \"description\": \"Base64-encoded signed transaction\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"Human-readable message describing the transaction\"\n }\n },\n \"required\": [\n \"transaction\",\n \"message\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"user_retrieve\",\n \"description\": \"Get the currently authenticated user\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/user_retrieve_input\",\n \"definitions\": {\n \"user_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_delete\",\n \"description\": \"Delete a bank account\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_delete_input\",\n \"definitions\": {\n \"virtual-account_bank-account_delete_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"bankAccountId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the bank account to delete\"\n }\n },\n \"required\": [\n \"bankAccountId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_eur_register\",\n \"description\": \"Register a EUR bank account for offramp payouts\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_eur_register_input\",\n \"definitions\": {\n \"virtual-account_bank-account_eur_register_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"iban\": {\n \"type\": \"string\",\n \"description\": \"IBAN for SEPA bank account\"\n },\n \"address\": {\n \"type\": \"object\",\n \"properties\": {\n \"street\": {\n \"type\": \"string\",\n \"description\": \"Street address\"\n },\n \"city\": {\n \"type\": \"string\",\n \"description\": \"City\"\n },\n \"state\": {\n \"type\": \"string\",\n \"description\": \"State or province\"\n },\n \"country\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code\"\n },\n \"postalCode\": {\n \"type\": \"string\",\n \"description\": \"Postal or ZIP code\"\n }\n },\n \"required\": [\n \"street\",\n \"city\",\n \"state\",\n \"country\",\n \"postalCode\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Address of the user that owns the bank account\"\n },\n \"email\": {\n \"type\": \"string\",\n \"description\": \"Email address of the user that owns the bank account\"\n },\n \"phoneNumber\": {\n \"type\": \"string\",\n \"description\": \"Phone number of the user\"\n },\n \"providerCountry\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code where the bank is located\"\n },\n \"providerName\": {\n \"type\": \"string\",\n \"description\": \"Name of the bank\"\n },\n \"givenName\": {\n \"type\": \"string\",\n \"description\": \"First/given name of the account holder\"\n },\n \"familyName\": {\n \"type\": \"string\",\n \"description\": \"Last/family name of the account holder\"\n }\n },\n \"required\": [\n \"iban\",\n \"address\",\n \"email\",\n \"phoneNumber\",\n \"providerCountry\",\n \"providerName\",\n \"givenName\",\n \"familyName\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_list\",\n \"description\": \"List registered bank accounts\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_list_input\",\n \"definitions\": {\n \"virtual-account_bank-account_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_retrieve\",\n \"description\": \"Get a bank account by currency\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_retrieve_input\",\n \"definitions\": {\n \"virtual-account_bank-account_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"currency\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency code (USD or EUR)\"\n }\n },\n \"required\": [\n \"currency\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_usd_register\",\n \"description\": \"Register a USD bank account for offramp payouts\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_usd_register_input\",\n \"definitions\": {\n \"virtual-account_bank-account_usd_register_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"ACH\",\n \"Wire\"\n ],\n \"description\": \"Type of bank account (ACH or Wire)\"\n },\n \"accountNumber\": {\n \"type\": \"string\",\n \"description\": \"Account number\"\n },\n \"routingNumber\": {\n \"type\": \"string\",\n \"description\": \"Routing number\"\n },\n \"address\": {\n \"type\": \"object\",\n \"properties\": {\n \"street\": {\n \"type\": \"string\",\n \"description\": \"Street address\"\n },\n \"city\": {\n \"type\": \"string\",\n \"description\": \"City\"\n },\n \"state\": {\n \"type\": \"string\",\n \"description\": \"State or province\"\n },\n \"country\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code\"\n },\n \"postalCode\": {\n \"type\": \"string\",\n \"description\": \"Postal or ZIP code\"\n }\n },\n \"required\": [\n \"street\",\n \"city\",\n \"state\",\n \"country\",\n \"postalCode\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Address of the user that owns the bank account\"\n },\n \"email\": {\n \"type\": \"string\",\n \"description\": \"Email address of the user that owns the bank account\"\n },\n \"phoneNumber\": {\n \"type\": \"string\",\n \"description\": \"Phone number of the user\"\n },\n \"providerCountry\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code where the bank is located\"\n },\n \"providerName\": {\n \"type\": \"string\",\n \"description\": \"Name of the bank\"\n },\n \"givenName\": {\n \"type\": \"string\",\n \"description\": \"First/given name of the account holder\"\n },\n \"familyName\": {\n \"type\": \"string\",\n \"description\": \"Last/family name of the account holder\"\n }\n },\n \"required\": [\n \"type\",\n \"accountNumber\",\n \"routingNumber\",\n \"address\",\n \"email\",\n \"phoneNumber\",\n \"providerCountry\",\n \"providerName\",\n \"givenName\",\n \"familyName\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_create\",\n \"description\": \"Create a virtual account and start KYC verification\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_create_input\",\n \"definitions\": {\n \"virtual-account_create_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_delete\",\n \"description\": \"Delete your virtual account\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_delete_input\",\n \"definitions\": {\n \"virtual-account_delete_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_identification_create\",\n \"description\": \"Create a KYC verification link to complete identity verification\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_identification_create_input\",\n \"definitions\": {\n \"virtual-account_identification_create_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_identification_list\",\n \"description\": \"List all KYC identifications\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_identification_list_input\",\n \"definitions\": {\n \"virtual-account_identification_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_identification_retrieve\",\n \"description\": \"Get the status of a KYC identification\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_identification_retrieve_input\",\n \"definitions\": {\n \"virtual-account_identification_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_create\",\n \"description\": \"Create an offramp to convert stablecoin to fiat\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_create_input\",\n \"definitions\": {\n \"virtual-account_offramp_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The name of the offramp\"\n },\n \"fiat\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency to convert to\"\n },\n \"stablecoin\": {\n \"type\": \"string\",\n \"enum\": [\n \"USDC\",\n \"USDT\",\n \"EURC\"\n ],\n \"description\": \"The stablecoin token to convert from\"\n }\n },\n \"required\": [\n \"name\",\n \"fiat\",\n \"stablecoin\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_delete\",\n \"description\": \"Cancel an offramp\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_delete_input\",\n \"definitions\": {\n \"virtual-account_offramp_delete_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"offrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the offramp to cancel\"\n }\n },\n \"required\": [\n \"offrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_initiate\",\n \"description\": \"Build an unsigned transaction to send stablecoin to an offramp deposit address\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_initiate_input\",\n \"definitions\": {\n \"virtual-account_offramp_initiate_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"The wallet address to send from\"\n },\n \"offrampId\": {\n \"type\": \"string\",\n \"description\": \"The ID of the offramp to initiate\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"The amount of stablecoin to send (in human-readable units, e.g., 100.5)\"\n }\n },\n \"required\": [\n \"wallet\",\n \"offrampId\",\n \"amount\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_list\",\n \"description\": \"List all offramps\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_list_input\",\n \"definitions\": {\n \"virtual-account_offramp_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_retrieve\",\n \"description\": \"Get offramp details\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_retrieve_input\",\n \"definitions\": {\n \"virtual-account_offramp_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"offrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the offramp to retrieve\"\n }\n },\n \"required\": [\n \"offrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_create\",\n \"description\": \"Create an onramp to convert fiat to stablecoin\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_create_input\",\n \"definitions\": {\n \"virtual-account_onramp_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The name of the onramp\"\n },\n \"fiat\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency to convert from\"\n },\n \"stablecoin\": {\n \"type\": \"string\",\n \"enum\": [\n \"USDC\",\n \"USDT\",\n \"EURC\"\n ],\n \"description\": \"The stablecoin token to convert to\"\n }\n },\n \"required\": [\n \"name\",\n \"fiat\",\n \"stablecoin\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_delete\",\n \"description\": \"Cancel an onramp\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_delete_input\",\n \"definitions\": {\n \"virtual-account_onramp_delete_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp to cancel\"\n }\n },\n \"required\": [\n \"onrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_list\",\n \"description\": \"List all onramps\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_list_input\",\n \"definitions\": {\n \"virtual-account_onramp_list_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"Created\",\n \"Authorized\",\n \"DepositAccountAdded\",\n \"Approved\",\n \"Rejected\",\n \"Cancelled\"\n ],\n \"description\": \"Status of the onramps to get\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_payment_create\",\n \"description\": \"Create an open banking payment link for an onramp\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_payment_create_input\",\n \"definitions\": {\n \"virtual-account_onramp_payment_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp\"\n },\n \"amount\": {\n \"type\": \"string\",\n \"description\": \"The amount to pay\"\n },\n \"fiat\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency (USD or EUR)\"\n }\n },\n \"required\": [\n \"onrampId\",\n \"amount\",\n \"fiat\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_payment_retrieve\",\n \"description\": \"Get the status of an open banking payment\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_payment_retrieve_input\",\n \"definitions\": {\n \"virtual-account_onramp_payment_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp this payment belongs to\"\n },\n \"paymentId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the payment to retrieve\"\n }\n },\n \"required\": [\n \"onrampId\",\n \"paymentId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_retrieve\",\n \"description\": \"Get onramp details and banking info\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_retrieve_input\",\n \"definitions\": {\n \"virtual-account_onramp_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp to retrieve\"\n }\n },\n \"required\": [\n \"onrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_retrieve\",\n \"description\": \"Get your virtual account status\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_retrieve_input\",\n \"definitions\": {\n \"virtual-account_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_signing_create\",\n \"description\": \"Sign a required document for your virtual account\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_signing_create_input\",\n \"definitions\": {\n \"virtual-account_signing_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"contentId\": {\n \"type\": \"string\",\n \"description\": \"The unique ID of the content to sign\"\n }\n },\n \"required\": [\n \"contentId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_signing_list\",\n \"description\": \"List all signed documents\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_signing_list_input\",\n \"definitions\": {\n \"virtual-account_signing_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_signing_required_list\",\n \"description\": \"List documents that require your signature\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_signing_required_list_input\",\n \"definitions\": {\n \"virtual-account_signing_required_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_transaction_list\",\n \"description\": \"List virtual account transactions\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_transaction_list_input\",\n \"definitions\": {\n \"virtual-account_transaction_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_wallet_list\",\n \"description\": \"List registered wallets\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_wallet_list_input\",\n \"definitions\": {\n \"virtual-account_wallet_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_wallet_register\",\n \"description\": \"Register a wallet using a signed verification message\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_wallet_register_input\",\n \"definitions\": {\n \"virtual-account_wallet_register_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"The wallet address to register\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"The verification message (from virtual-account_wallet_registration-message_create)\"\n },\n \"signature\": {\n \"type\": \"string\",\n \"description\": \"Base58-encoded signature of the message\"\n }\n },\n \"required\": [\n \"wallet\",\n \"message\",\n \"signature\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_wallet_registration-message_create\",\n \"description\": \"Create the verification message to register a wallet\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_wallet_registration-message_create_input\",\n \"definitions\": {\n \"virtual-account_wallet_registration-message_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"The wallet address to register\"\n }\n },\n \"required\": [\n \"wallet\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n }\n]","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { generateMnemonic } from \"@scure/bip39\";\nimport { wordlist as english } from \"@scure/bip39/wordlists/english\";\nimport { createTool } from \"../../shared\";\nimport { saveWalletMetadata, loadWallet, type WalletMetadata } from \"../server\";\nimport { addHdEntry, loadVault } from \"../vault\";\nimport { deriveAllAddresses } from \"../chains\";\nimport { walletCreateSchema } from \"./schema\";\n\nexport const walletCreate = createTool(walletCreateSchema, async (params) => {\n if (params.from) {\n if (params.account === null) {\n throw new Error(\"--account is required when using --from.\");\n }\n return deriveFromExisting(params.name, params.from, params.account);\n }\n\n return createNew(params.name);\n});\n\nfunction createNew(name: string) {\n const mnemonic = generateMnemonic(english, 128);\n const addresses = deriveAllAddresses(mnemonic);\n\n const vaultRef = addHdEntry(mnemonic);\n\n const metadata: WalletMetadata = {\n name,\n type: \"hd\",\n vaultRef,\n account: 0,\n addresses,\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n const backupDir = join(homedir(), \".config\", \"moonpay\", \"backups\");\n mkdirSync(backupDir, { recursive: true, mode: 0o700 });\n const backupPath = join(backupDir, `${name}.mnemonic`);\n writeFileSync(backupPath, mnemonic + \"\\n\", { mode: 0o600 });\n\n return { name, account: 0, addresses, backupPath };\n}\n\nfunction deriveFromExisting(name: string, from: string, account: number) {\n const source = loadWallet(from);\n\n if (source.type !== \"hd\") {\n throw new Error(\n `Wallet \"${from}\" is an imported single-key wallet. Only HD wallets support account derivation.`,\n );\n }\n\n const vault = loadVault();\n const entry = vault.entries[source.vaultRef];\n if (!entry || entry.type !== \"hd\") {\n throw new Error(`Vault entry for wallet \"${from}\" not found or is not HD.`);\n }\n\n const addresses = deriveAllAddresses(entry.mnemonic, account);\n\n const metadata: WalletMetadata = {\n name,\n type: \"hd\",\n vaultRef: source.vaultRef,\n account,\n addresses,\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n return { name, account, addresses, backupPath: null };\n}\n","import { z } from \"zod\";\n\n// ── Schema types ─────────────────────────────────────────────\n\nexport type ToolSchema<\n I extends z.ZodType = z.ZodType,\n O extends z.ZodType = z.ZodType,\n> = {\n name: string;\n description: string;\n input: I;\n output: O;\n};\n\nexport type ToolInput<TSchema extends ToolSchema> = z.infer<TSchema[\"input\"]>;\nexport type ToolOutput<TSchema extends ToolSchema> = z.infer<TSchema[\"output\"]>;\n\nexport const defineToolSchema = <\n TInput extends z.ZodType,\n TOutput extends z.ZodType,\n>(config: {\n name: string;\n description: string;\n input: TInput;\n output: TOutput;\n}): ToolSchema<TInput, TOutput> => config;\n\n// ── Tool wrapper ─────────────────────────────────────────────\n\nexport type Tool<TSchema extends ToolSchema = ToolSchema> = {\n schema: TSchema;\n handler: (params: z.input<TSchema[\"input\"]>) => Promise<z.output<TSchema[\"output\"]>>;\n};\n\n/**\n * Lightweight createTool for CLI local tools.\n * Validates input/output with Zod, no logging or context.\n */\nexport const createTool = <TSchema extends ToolSchema>(\n schema: TSchema,\n handler: (\n params: z.output<TSchema[\"input\"]>,\n ) => Promise<z.output<TSchema[\"output\"]>>,\n): Tool<TSchema> => ({\n schema,\n handler: async (params: z.input<TSchema[\"input\"]>) => {\n const parsedInput = schema.input.parse(params);\n const result = await handler(parsedInput);\n return schema.output.parse(result);\n },\n});\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n renameSync,\n mkdirSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n randomBytes,\n randomUUID,\n scryptSync,\n createCipheriv,\n createDecipheriv,\n} from \"node:crypto\";\nimport {\n vaultDataSchema,\n lockedVaultDataSchema,\n type VaultData,\n type LockedVaultData,\n type HdVaultEntry,\n type ImportedVaultEntry,\n type WalletMetadata,\n type KeyChain,\n KEY_CHAIN_MAP,\n type Chain,\n} from \"./models\";\nimport { deriveKeyForChain } from \"./chains\";\n\n// ── Paths ───────────────────────────────────────────────────\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"moonpay\");\nconst VAULT_PATH = join(CONFIG_DIR, \"vault.json\");\n\nexport function getVaultPath(): string {\n return VAULT_PATH;\n}\n\nfunction ensureConfigDir(): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n}\n\n// ── Vault CRUD ──────────────────────────────────────────────\n\n/**\n * Load the vault. Throws if locked or missing.\n */\nexport function loadVault(): VaultData {\n if (!existsSync(VAULT_PATH)) {\n // Auto-create empty vault on first access\n const empty: VaultData = { version: 1, entries: {} };\n saveVault(empty);\n return empty;\n }\n\n const raw = JSON.parse(readFileSync(VAULT_PATH, \"utf-8\"));\n\n // Check if locked\n const locked = lockedVaultDataSchema.safeParse(raw);\n if (locked.success) {\n throw new Error(\n \"Vault is locked. Run `mp wallet unlock` to decrypt it first.\",\n );\n }\n\n const result = vaultDataSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(\"Vault file is corrupted or has an unknown format.\");\n }\n\n return result.data;\n}\n\n/**\n * Save the vault atomically.\n */\nexport function saveVault(vault: VaultData): void {\n ensureConfigDir();\n const tmpPath = join(\n CONFIG_DIR,\n `.vault.${randomBytes(4).toString(\"hex\")}.tmp`,\n );\n writeFileSync(tmpPath, JSON.stringify(vault, null, 2), { mode: 0o600 });\n renameSync(tmpPath, VAULT_PATH);\n}\n\n/**\n * Check if the vault is currently locked.\n */\nexport function isVaultLocked(): boolean {\n if (!existsSync(VAULT_PATH)) return false;\n const raw = JSON.parse(readFileSync(VAULT_PATH, \"utf-8\"));\n return lockedVaultDataSchema.safeParse(raw).success;\n}\n\n// ── Vault entry management ──────────────────────────────────\n\n/**\n * Add an HD wallet entry to the vault. Returns the entry ID.\n */\nexport function addHdEntry(mnemonic: string): string {\n const vault = loadVault();\n const id = randomUUID();\n const entry: HdVaultEntry = { id, type: \"hd\", mnemonic };\n vault.entries[id] = entry;\n saveVault(vault);\n return id;\n}\n\n/**\n * Add an imported key entry to the vault. Returns the entry ID.\n */\nexport function addImportedEntry(\n chain: KeyChain,\n privateKey: string,\n): string {\n const vault = loadVault();\n const id = randomUUID();\n const entry: ImportedVaultEntry = { id, type: \"imported\", chain, privateKey };\n vault.entries[id] = entry;\n saveVault(vault);\n return id;\n}\n\n/**\n * Remove a vault entry by ID.\n */\nexport function removeVaultEntry(id: string): void {\n const vault = loadVault();\n delete vault.entries[id];\n saveVault(vault);\n}\n\n// ── Key resolution ──────────────────────────────────────────\n\n/**\n * Resolve the private key for a wallet on a specific chain.\n * For HD wallets, derives from the mnemonic.\n * For imported wallets, returns the stored key directly.\n */\nexport function resolveSigningKey(\n wallet: WalletMetadata,\n chain: Chain,\n): { privateKey: Uint8Array; address: string } {\n const vault = loadVault();\n const entry = vault.entries[wallet.vaultRef];\n if (!entry) {\n throw new Error(\n `Vault entry not found for wallet \"${wallet.name}\". The vault may be out of sync.`,\n );\n }\n\n const keyChain = KEY_CHAIN_MAP[chain];\n\n if (entry.type === \"imported\") {\n if (entry.chain !== keyChain) {\n throw new Error(\n `Wallet \"${wallet.name}\" was imported for ${entry.chain}, cannot sign for ${chain}.`,\n );\n }\n return {\n privateKey: decodePrivateKey(entry.privateKey, keyChain),\n address: wallet.addresses[keyChain]!,\n };\n }\n\n // HD wallet — derive key for chain at wallet's account index\n const derived = deriveKeyForChain(entry.mnemonic, keyChain, wallet.account ?? 0);\n return {\n privateKey: derived.privateKey,\n address: derived.address,\n };\n}\n\nfunction decodePrivateKey(key: string, chain: KeyChain): Uint8Array {\n if (chain === \"solana\") {\n // Solana keys are base58-encoded 64-byte secret keys\n const bs58 = require(\"bs58\") as typeof import(\"bs58\");\n return bs58.default.decode(key);\n }\n // EVM and Bitcoin keys are hex-encoded 32-byte private keys\n return Uint8Array.from(Buffer.from(key, \"hex\"));\n}\n\n// ── Encryption / Decryption ─────────────────────────────────\n\nconst SCRYPT_N = 2 ** 14; // ~16MB memory, secure and fast\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst KEY_LENGTH = 32; // AES-256\n\nfunction deriveEncryptionKey(password: string, salt: Buffer): Buffer {\n return scryptSync(password, salt, KEY_LENGTH, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n });\n}\n\n/**\n * Encrypt the vault with a password. Replaces the vault file with encrypted data.\n */\nexport function lockVault(password: string): void {\n const vault = loadVault(); // throws if already locked\n\n const salt = randomBytes(32);\n const key = deriveEncryptionKey(password, salt);\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n\n const plaintext = JSON.stringify(vault);\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n\n const locked: LockedVaultData = {\n version: 1,\n locked: true,\n ciphertext: encrypted.toString(\"base64\"),\n iv: iv.toString(\"base64\"),\n salt: salt.toString(\"base64\"),\n tag: tag.toString(\"base64\"),\n };\n\n ensureConfigDir();\n const tmpPath = join(\n CONFIG_DIR,\n `.vault.${randomBytes(4).toString(\"hex\")}.tmp`,\n );\n writeFileSync(tmpPath, JSON.stringify(locked, null, 2), { mode: 0o600 });\n renameSync(tmpPath, VAULT_PATH);\n}\n\n/**\n * Decrypt the vault with a password. Replaces the locked vault file with plaintext.\n */\nexport function unlockVault(password: string): void {\n if (!existsSync(VAULT_PATH)) {\n throw new Error(\"No vault found. Create a wallet first.\");\n }\n\n const raw = JSON.parse(readFileSync(VAULT_PATH, \"utf-8\"));\n const locked = lockedVaultDataSchema.safeParse(raw);\n if (!locked.success) {\n throw new Error(\"Vault is not locked.\");\n }\n\n const { ciphertext, iv, salt, tag } = locked.data;\n\n const saltBuf = Buffer.from(salt, \"base64\");\n const key = deriveEncryptionKey(password, saltBuf);\n const ivBuf = Buffer.from(iv, \"base64\");\n const tagBuf = Buffer.from(tag, \"base64\");\n const ciphertextBuf = Buffer.from(ciphertext, \"base64\");\n\n const decipher = createDecipheriv(\"aes-256-gcm\", key, ivBuf, { authTagLength: 16 });\n decipher.setAuthTag(tagBuf);\n\n let decrypted: Buffer;\n try {\n decrypted = Buffer.concat([\n decipher.update(ciphertextBuf),\n decipher.final(),\n ]);\n } catch {\n throw new Error(\"Wrong password.\");\n }\n\n const vault = vaultDataSchema.parse(JSON.parse(decrypted.toString(\"utf8\")));\n saveVault(vault);\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { keyChainSchema } from \"../models\";\n\nexport const walletCreateSchema = defineToolSchema({\n name: \"wallet_create\",\n description:\n \"Create a new multi-chain HD wallet. Generates a BIP39 mnemonic seed phrase and derives addresses for Solana, Ethereum (shared by Base, Arbitrum, Polygon, Optimism, BNB, Avalanche), Bitcoin, and Tron. \" +\n \"The mnemonic is saved to a local backup file (path returned in output) — it is never printed or returned in the response. \" +\n \"To derive additional accounts from the same mnemonic, pass --from with an existing wallet name and --account with the desired index.\",\n input: z.object({\n name: z.string().describe(\"Wallet name\"),\n from: z\n .string()\n .nullable()\n .describe(\"Name of an existing HD wallet to derive from. Uses the same mnemonic but a different account index. Omit to generate a new mnemonic.\"),\n account: z\n .number()\n .int()\n .min(0)\n .nullable()\n .describe(\"BIP44 account index (0, 1, 2, ...). Required when using --from. Omit for new wallets (defaults to 0).\"),\n }),\n output: z.object({\n name: z.string().describe(\"Wallet name\"),\n account: z.number().describe(\"BIP44 account index used for derivation\"),\n addresses: z\n .record(keyChainSchema, z.string())\n .describe(\"Derived addresses per chain (solana, ethereum, bitcoin, tron)\"),\n backupPath: z\n .string()\n .nullable()\n .describe(\"Path to the mnemonic backup file (0o600 permissions). Null when derived from an existing wallet.\"),\n }),\n});\n","import { validateMnemonic } from \"@scure/bip39\";\nimport { wordlist as english } from \"@scure/bip39/wordlists/english\";\nimport { Keypair } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { createInterface } from \"node:readline\";\nimport { createTool } from \"../../shared\";\nimport { saveWalletMetadata, type WalletMetadata } from \"../server\";\nimport { addHdEntry, addImportedEntry } from \"../vault\";\nimport { deriveAllAddresses } from \"../chains\";\nimport { KEY_CHAIN_MAP, type KeyChain } from \"../models\";\nimport { walletImportSchema } from \"./schema\";\n\nasync function promptSecret(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport const walletImport = createTool(walletImportSchema, async (params) => {\n if (params.mnemonic && params.key) {\n throw new Error(\"Provide either --mnemonic or --key, not both.\");\n }\n\n if (params.mnemonic) {\n return importMnemonic(params.name, params.mnemonic);\n }\n\n // Single-key import\n const chain = params.chain ? KEY_CHAIN_MAP[params.chain] : \"solana\";\n const key =\n params.key !== null\n ? params.key\n : await promptSecret(\"Enter private key: \");\n\n return importKey(params.name, chain, key);\n});\n\nasync function importMnemonic(\n name: string,\n mnemonic: string,\n): Promise<{ name: string; type: \"hd\"; addresses: Record<KeyChain, string> }> {\n const trimmed = mnemonic.trim().toLowerCase();\n if (!validateMnemonic(trimmed, english)) {\n throw new Error(\"Invalid BIP39 mnemonic.\");\n }\n\n const addresses = deriveAllAddresses(trimmed);\n const vaultRef = addHdEntry(trimmed);\n\n const metadata: WalletMetadata = {\n name,\n type: \"hd\",\n vaultRef,\n account: 0,\n addresses,\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n return { name, type: \"hd\", addresses };\n}\n\nasync function importKey(\n name: string,\n chain: KeyChain,\n key: string,\n): Promise<{\n name: string;\n type: \"imported\";\n addresses: Partial<Record<KeyChain, string>>;\n}> {\n let address: string;\n\n if (chain === \"solana\") {\n try {\n const secretKeyBytes = bs58.decode(key);\n const keypair = Keypair.fromSecretKey(secretKeyBytes);\n address = keypair.publicKey.toBase58();\n } catch {\n throw new Error(\n \"Invalid private key. Expected a base58-encoded Solana secret key.\",\n );\n }\n } else if (chain === \"ethereum\") {\n // For EVM, we expect a hex private key (32 bytes = 64 hex chars)\n const cleanKey = key.startsWith(\"0x\") ? key.slice(2) : key;\n if (!/^[0-9a-fA-F]{64}$/.test(cleanKey)) {\n throw new Error(\n \"Invalid private key. Expected a 64-character hex string for EVM.\",\n );\n }\n // Derive address from private key\n const { deriveKeyForChain } = await import(\"../chains\");\n // We can't use deriveKeyForChain here since it needs a mnemonic\n // Instead, derive address directly from the private key\n const { HDKey } = await import(\"@scure/bip32\");\n const ecc = await import(\"tiny-secp256k1\");\n const { createHash } = await import(\"node:crypto\");\n\n const privKeyBytes = Buffer.from(cleanKey, \"hex\");\n const pubKey = ecc.pointFromScalar(privKeyBytes);\n if (!pubKey) throw new Error(\"Invalid private key.\");\n const uncompressed = ecc.pointCompress(pubKey, false);\n const hash = createHash(\"sha3-256\")\n .update(uncompressed.slice(1))\n .digest();\n address = \"0x\" + hash.slice(-20).toString(\"hex\");\n key = cleanKey; // store without 0x prefix\n } else {\n // Bitcoin\n const cleanKey = key.startsWith(\"0x\") ? key.slice(2) : key;\n if (!/^[0-9a-fA-F]{64}$/.test(cleanKey)) {\n throw new Error(\n \"Invalid private key. Expected a 64-character hex string for Bitcoin.\",\n );\n }\n const bitcoin = await import(\"bitcoinjs-lib\");\n const ECPairFactory = (await import(\"ecpair\")).default;\n const ecc = await import(\"tiny-secp256k1\");\n const ECPair = ECPairFactory(ecc);\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(cleanKey, \"hex\"));\n const { address: btcAddress } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n });\n if (!btcAddress) throw new Error(\"Failed to derive Bitcoin address.\");\n address = btcAddress;\n key = cleanKey;\n }\n\n const vaultRef = addImportedEntry(chain, key);\n\n const metadata: WalletMetadata = {\n name,\n type: \"imported\",\n vaultRef,\n account: 0,\n addresses: { [chain]: address },\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n return { name, type: \"imported\", addresses: { [chain]: address } };\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema, keyChainSchema } from \"../models\";\n\nexport const walletImportSchema = defineToolSchema({\n name: \"wallet_import\",\n description:\n \"Import a wallet from a BIP39 mnemonic (HD, all chains) or a single private key (one chain). \" +\n \"Provide either --mnemonic or --key, not both.\",\n input: z.object({\n name: z.string().describe(\"Wallet name\"),\n mnemonic: z\n .string()\n .nullable()\n .describe(\"BIP39 mnemonic seed phrase (for HD wallet import)\"),\n key: z\n .string()\n .nullable()\n .describe(\n \"Private key: base58 for Solana, hex for EVM/Bitcoin (for single-chain import)\",\n ),\n chain: chainSchema\n .nullable()\n .describe(\n \"Chain for single-key import: solana, ethereum, base, arbitrum, or bitcoin (default solana)\",\n ),\n }),\n output: z.object({\n name: z.string().describe(\"Wallet name\"),\n type: z.enum([\"hd\", \"imported\"]).describe(\"Wallet type\"),\n addresses: z\n .record(keyChainSchema, z.string())\n .describe(\"Wallet addresses per chain\"),\n }),\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { walletInfoSchema } from \"../models\";\n\nexport const walletListSchema = defineToolSchema({\n name: \"wallet_list\",\n description: \"List all local wallets\",\n input: z.object({}),\n output: z.array(walletInfoSchema),\n});\n","import { createTool } from \"../../shared\";\nimport { loadAllWallets } from \"../server\";\nimport { walletListSchema } from \"./schema\";\n\nexport const walletList = createTool(walletListSchema, async () => {\n return loadAllWallets();\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { walletInfoSchema } from \"../models\";\n\nexport const walletRetrieveSchema = defineToolSchema({\n name: \"wallet_retrieve\",\n description: \"Get details of a specific wallet\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name or address\"),\n }),\n output: walletInfoSchema,\n});\n","import { createTool } from \"../../shared\";\nimport { loadWallet } from \"../server\";\nimport { walletRetrieveSchema } from \"./schema\";\n\nexport const walletRetrieve = createTool(\n walletRetrieveSchema,\n async (params) => {\n return loadWallet(params.wallet);\n },\n);\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletDeleteSchema = defineToolSchema({\n name: \"wallet_delete\",\n description:\n \"Permanently delete a local wallet. This removes the private key file and cannot be undone.\",\n input: z.object({\n wallet: z.string().describe(\"Name or address of the wallet to delete\"),\n confirm: z\n .boolean()\n .describe(\"Must be true to confirm deletion\"),\n }),\n output: z.object({\n name: z.string().describe(\"Name of the deleted wallet\"),\n deleted: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { loadWallet, deleteWalletFile } from \"../server\";\nimport { removeVaultEntry } from \"../vault\";\nimport { walletDeleteSchema } from \"./schema\";\n\nexport const walletDelete = createTool(walletDeleteSchema, async (params) => {\n if (!params.confirm) {\n throw new Error(\n \"Deletion not confirmed. Pass --confirm to permanently delete this wallet.\",\n );\n }\n\n const wallet = loadWallet(params.wallet);\n\n // Remove vault entry (mnemonic or private key)\n removeVaultEntry(wallet.vaultRef);\n\n // Remove metadata file\n deleteWalletFile(wallet.name);\n\n return { name: wallet.name, deleted: true as const };\n});\n","import { Keypair, VersionedTransaction } from \"@solana/web3.js\";\nimport { createTool } from \"../../shared\";\nimport { loadWallet } from \"../../wallet/server\";\nimport { resolveSigningKey } from \"../../wallet/vault\";\nimport { KEY_CHAIN_MAP, type Chain } from \"../../wallet/models\";\nimport { transactionSignSchema } from \"./schema\";\n\nexport const transactionSign = createTool(\n transactionSignSchema,\n async (params) => {\n const wallet = loadWallet(params.wallet);\n const chain = params.chain as Chain;\n const keyChain = KEY_CHAIN_MAP[chain];\n const { privateKey } = resolveSigningKey(wallet, chain);\n\n const txBytes = Buffer.from(params.transaction.trim(), \"base64\");\n\n switch (keyChain) {\n case \"solana\":\n return signSolana(privateKey, txBytes);\n case \"ethereum\":\n return signEvm(privateKey, txBytes);\n case \"bitcoin\":\n return signBitcoin(privateKey, txBytes);\n case \"tron\":\n return signEvm(privateKey, txBytes);\n }\n },\n);\n\nfunction signSolana(\n privateKey: Uint8Array,\n txBytes: Buffer,\n): { transaction: string } {\n const tx = VersionedTransaction.deserialize(txBytes);\n const keypair = Keypair.fromSecretKey(privateKey);\n tx.sign([keypair]);\n return { transaction: Buffer.from(tx.serialize()).toString(\"base64\") };\n}\n\nasync function signEvm(\n privateKey: Uint8Array,\n txBytes: Buffer,\n): Promise<{ transaction: string }> {\n const { createHash } = await import(\"node:crypto\");\n const ecc = await import(\"tiny-secp256k1\");\n\n // txBytes is an RLP-encoded unsigned transaction\n // Sign: keccak256(txBytes) -> secp256k1 ECDSA\n const hash = createHash(\"sha3-256\").update(txBytes).digest();\n const sig = ecc.sign(hash, privateKey);\n if (!sig) throw new Error(\"EVM signing failed\");\n\n // Return the signature appended to the transaction\n // In practice, EVM tx signing requires RLP re-encoding with v/r/s\n // This is a simplified version — full EVM tx signing would use ethers\n const signed = Buffer.concat([txBytes, Buffer.from(sig)]);\n return { transaction: signed.toString(\"base64\") };\n}\n\nasync function signBitcoin(\n privateKey: Uint8Array,\n txBytes: Buffer,\n): Promise<{ transaction: string }> {\n const bitcoin = await import(\"bitcoinjs-lib\");\n const ECPairFactory = (await import(\"ecpair\")).default;\n const ecc = await import(\"tiny-secp256k1\");\n\n const ECPair = ECPairFactory(ecc);\n const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKey));\n\n // Parse as PSBT and sign all inputs\n const psbt = bitcoin.Psbt.fromBase64(txBytes.toString(\"base64\"));\n psbt.signAllInputs(keyPair);\n\n return { transaction: psbt.toBase64() };\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema } from \"../../wallet/models\";\n\nexport const transactionSignSchema = defineToolSchema({\n name: \"transaction_sign\",\n description:\n \"Sign a transaction with a local wallet. Supports Solana (VersionedTransaction), EVM (RLP-encoded), and Bitcoin (PSBT) transactions.\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name or address\"),\n chain: chainSchema.describe(\n \"Chain: solana, ethereum, base, arbitrum, or bitcoin\",\n ),\n transaction: z\n .string()\n .describe(\"Base64-encoded unsigned transaction\"),\n }),\n output: z.object({\n transaction: z\n .string()\n .describe(\"Base64-encoded signed transaction\"),\n }),\n});\n","import { createHash } from \"node:crypto\";\nimport { Keypair } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport nacl from \"tweetnacl\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { createTool } from \"../../shared\";\nimport { loadWallet } from \"../../wallet/server\";\nimport { resolveSigningKey } from \"../../wallet/vault\";\nimport { KEY_CHAIN_MAP, type Chain } from \"../../wallet/models\";\nimport { messageSignSchema } from \"./schema\";\n\nexport const messageSign = createTool(messageSignSchema, async (params) => {\n const wallet = loadWallet(params.wallet);\n const chain = params.chain as Chain;\n const keyChain = KEY_CHAIN_MAP[chain];\n const { privateKey } = resolveSigningKey(wallet, chain);\n\n const messageBytes = Buffer.from(params.message, \"utf8\");\n\n switch (keyChain) {\n case \"solana\":\n return signSolana(privateKey, messageBytes);\n case \"ethereum\":\n return signEvm(privateKey, messageBytes);\n case \"bitcoin\":\n return signBitcoin(privateKey, messageBytes);\n case \"tron\":\n return signEvm(privateKey, messageBytes);\n }\n});\n\nfunction signSolana(\n privateKey: Uint8Array,\n messageBytes: Buffer,\n): { signature: string } {\n const keypair = Keypair.fromSecretKey(privateKey);\n const signatureBytes = nacl.sign.detached(messageBytes, keypair.secretKey);\n return { signature: bs58.encode(signatureBytes) };\n}\n\nfunction signEvm(\n privateKey: Uint8Array,\n messageBytes: Buffer,\n): { signature: string } {\n // EIP-191 personal sign: prefix the message\n const prefix = Buffer.from(\n `\\x19Ethereum Signed Message:\\n${messageBytes.length}`,\n \"utf8\",\n );\n const prefixed = Buffer.concat([prefix, messageBytes]);\n const hash = createHash(\"sha3-256\").update(prefixed).digest();\n\n const sig = ecc.sign(hash, privateKey);\n if (!sig) throw new Error(\"EVM message signing failed\");\n\n return { signature: \"0x\" + Buffer.from(sig).toString(\"hex\") };\n}\n\nfunction signBitcoin(\n privateKey: Uint8Array,\n messageBytes: Buffer,\n): { signature: string } {\n // Bitcoin message signing: double SHA-256\n const hash1 = createHash(\"sha256\").update(messageBytes).digest();\n const hash2 = createHash(\"sha256\").update(hash1).digest();\n\n const sig = ecc.sign(hash2, privateKey);\n if (!sig) throw new Error(\"Bitcoin message signing failed\");\n\n return { signature: \"0x\" + Buffer.from(sig).toString(\"hex\") };\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema } from \"../../wallet/models\";\n\nexport const messageSignSchema = defineToolSchema({\n name: \"message_sign\",\n description:\n \"Sign a message with a local wallet. Supports Solana (ed25519), EVM (EIP-191 personal sign), and Bitcoin (secp256k1 ECDSA).\",\n input: z.object({\n wallet: z.string().describe(\"Wallet address or name to sign with\"),\n chain: chainSchema.describe(\n \"Chain: solana, ethereum, base, arbitrum, or bitcoin\",\n ),\n message: z.string().describe(\"Message text to sign\"),\n }),\n output: z.object({\n signature: z\n .string()\n .describe(\n \"Signature: base58 for Solana, hex (0x-prefixed) for EVM/Bitcoin\",\n ),\n }),\n});\n","/**\n * Prompt for a password with hidden input (no echo).\n */\nexport function promptPassword(prompt: string): Promise<string> {\n return new Promise((resolve, reject) => {\n if (!process.stdin.isTTY) {\n // Non-interactive (piped input) — fall back to plain readline\n const { createInterface } = require(\"node:readline\");\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n rl.question(prompt, (answer: string) => {\n rl.close();\n resolve(answer);\n });\n return;\n }\n\n process.stderr.write(prompt);\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding(\"utf8\");\n\n let password = \"\";\n\n const onData = (ch: string) => {\n const code = ch.charCodeAt(0);\n\n if (ch === \"\\r\" || ch === \"\\n\" || code === 13 || code === 10) {\n // Enter\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener(\"data\", onData);\n process.stderr.write(\"\\n\");\n resolve(password);\n } else if (code === 3) {\n // Ctrl+C\n process.stdin.setRawMode(false);\n process.stdin.pause();\n process.stdin.removeListener(\"data\", onData);\n process.stderr.write(\"\\n\");\n reject(new Error(\"Aborted\"));\n } else if (code === 127 || code === 8) {\n // Backspace\n if (password.length > 0) {\n password = password.slice(0, -1);\n }\n } else {\n password += ch;\n }\n };\n\n process.stdin.on(\"data\", onData);\n });\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletLockSchema = defineToolSchema({\n name: \"wallet_lock\",\n description:\n \"Encrypt the vault with a password. All signing operations will fail until `wallet unlock` is called. Password is prompted interactively.\",\n input: z.object({}),\n output: z.object({\n locked: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { lockVault, isVaultLocked } from \"../vault\";\nimport { promptPassword } from \"../prompt\";\nimport { walletLockSchema } from \"./schema\";\n\nexport const walletLock = createTool(walletLockSchema, async () => {\n if (isVaultLocked()) {\n throw new Error(\"Vault is already locked.\");\n }\n\n const password = await promptPassword(\"Enter password to encrypt vault: \");\n if (!password) {\n throw new Error(\"Password cannot be empty.\");\n }\n\n const confirm = await promptPassword(\"Confirm password: \");\n if (password !== confirm) {\n throw new Error(\"Passwords do not match.\");\n }\n\n lockVault(password);\n return { locked: true as const };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletUnlockSchema = defineToolSchema({\n name: \"wallet_unlock\",\n description:\n \"Decrypt the vault with a password. Restores access to all signing operations. Password is prompted interactively.\",\n input: z.object({}),\n output: z.object({\n unlocked: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { unlockVault, isVaultLocked } from \"../vault\";\nimport { promptPassword } from \"../prompt\";\nimport { walletUnlockSchema } from \"./schema\";\n\nexport const walletUnlock = createTool(walletUnlockSchema, async () => {\n if (!isVaultLocked()) {\n throw new Error(\"Vault is not locked.\");\n }\n\n const password = await promptPassword(\"Enter password to decrypt vault: \");\n unlockVault(password);\n return { unlocked: true as const };\n});\n","import https from \"node:https\";\nimport { createTool } from \"../../shared\";\nimport { bitcoinBalanceRetrieveSchema } from \"./schema\";\n\nconst SATS_PER_BTC = 100_000_000;\n\nfunction satsToBtc(sats: number): string {\n return (sats / SATS_PER_BTC).toFixed(8);\n}\n\nfunction fetchJson<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n https.get(url, { headers: { \"User-Agent\": \"moonpay-cli\" } }, (res) => {\n if (res.statusCode !== 200) {\n reject(new Error(`HTTP ${res.statusCode} from ${url}`));\n res.resume();\n return;\n }\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk));\n res.on(\"end\", () => {\n try {\n resolve(JSON.parse(data));\n } catch {\n reject(new Error(\"Invalid JSON response\"));\n }\n });\n }).on(\"error\", reject);\n });\n}\n\ninterface MempoolAddress {\n chain_stats: { funded_txo_sum: number; spent_txo_sum: number };\n mempool_stats: { funded_txo_sum: number; spent_txo_sum: number };\n}\n\nexport const bitcoinBalanceRetrieve = createTool(\n bitcoinBalanceRetrieveSchema,\n async (params) => {\n let address = params.wallet;\n\n // If it doesn't look like a Bitcoin address, try resolving as wallet name\n if (!address.startsWith(\"bc1\") && !address.startsWith(\"1\") && !address.startsWith(\"3\")) {\n const { loadWallet } = await import(\"../../wallet/server\");\n const wallet = loadWallet(address);\n const btcAddress = wallet.addresses.bitcoin;\n if (!btcAddress) {\n throw new Error(\n `Wallet \"${address}\" has no Bitcoin address. It may be an imported single-chain wallet.`,\n );\n }\n address = btcAddress;\n }\n\n const data = await fetchJson<MempoolAddress>(\n `https://mempool.space/api/address/${address}`,\n );\n\n const confirmedSats =\n data.chain_stats.funded_txo_sum - data.chain_stats.spent_txo_sum;\n const unconfirmedSats =\n data.mempool_stats.funded_txo_sum - data.mempool_stats.spent_txo_sum;\n const totalSats = confirmedSats + unconfirmedSats;\n\n return {\n address,\n confirmed: { btc: satsToBtc(confirmedSats), sats: confirmedSats },\n unconfirmed: { btc: satsToBtc(unconfirmedSats), sats: unconfirmedSats },\n total: { btc: satsToBtc(totalSats), sats: totalSats },\n };\n },\n);\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const bitcoinBalanceRetrieveSchema = defineToolSchema({\n name: \"bitcoin_balance_retrieve\",\n description:\n \"Get the BTC balance of a Bitcoin address. Returns confirmed and unconfirmed balances in BTC and satoshis.\",\n input: z.object({\n wallet: z.string().describe(\"Bitcoin address (bc1...) or wallet name\"),\n }),\n output: z.object({\n address: z.string().describe(\"Bitcoin address\"),\n confirmed: z.object({\n btc: z.string().describe(\"Confirmed balance in BTC\"),\n sats: z.number().describe(\"Confirmed balance in satoshis\"),\n }),\n unconfirmed: z.object({\n btc: z.string().describe(\"Unconfirmed (pending) balance in BTC\"),\n sats: z.number().describe(\"Unconfirmed (pending) balance in satoshis\"),\n }),\n total: z.object({\n btc: z.string().describe(\"Total balance in BTC\"),\n sats: z.number().describe(\"Total balance in satoshis\"),\n }),\n }),\n});\n"],"mappings":"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","names":["writeFileSync","mkdirSync","join","homedir","readFileSync","writeFileSync","existsSync","renameSync","mkdirSync","join","homedir","randomBytes","randomUUID","CONFIG_DIR","join","homedir","ensureConfigDir","mkdirSync","CONFIG_DIR","existsSync","readFileSync","join","randomBytes","writeFileSync","renameSync","randomUUID","bs58","join","homedir","mkdirSync","writeFileSync","english","createInterface","z","z","createInterface","english","deriveKeyForChain","ecc","createHash","z","z","z","z","z","z","Keypair","z","z","Keypair","createHash","ecc","createHash","Keypair","bs58","z","z","signSolana","signEvm","signBitcoin","Keypair","bs58","createHash","createInterface","z","z","z","z","z","z","loadWallet"]}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
walletLock,
|
|
20
20
|
walletRetrieve,
|
|
21
21
|
walletUnlock
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-BSUHFW7I.js";
|
|
23
23
|
import "./chunk-AGDVU2O5.js";
|
|
24
24
|
import "./chunk-Z33PSOPD.js";
|
|
25
25
|
import "./chunk-EEBB5MQP.js";
|
|
@@ -321,7 +321,7 @@ program.command("logout").description("Log out and clear stored credentials").ac
|
|
|
321
321
|
console.log("Logged out.");
|
|
322
322
|
});
|
|
323
323
|
program.command("mcp").description("Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)").action(async () => {
|
|
324
|
-
const { startMcpServer } = await import("./mcp-
|
|
324
|
+
const { startMcpServer } = await import("./mcp-7A6UP5CV.js");
|
|
325
325
|
await startMcpServer();
|
|
326
326
|
});
|
|
327
327
|
function getOrCreateGroup(parent, segments) {
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
walletLock,
|
|
17
17
|
walletRetrieve,
|
|
18
18
|
walletUnlock
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-BSUHFW7I.js";
|
|
20
20
|
import {
|
|
21
21
|
loadWallet
|
|
22
22
|
} from "./chunk-AGDVU2O5.js";
|
|
@@ -242,4 +242,4 @@ async function startMcpServer() {
|
|
|
242
242
|
export {
|
|
243
243
|
startMcpServer
|
|
244
244
|
};
|
|
245
|
-
//# sourceMappingURL=mcp-
|
|
245
|
+
//# sourceMappingURL=mcp-7A6UP5CV.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/client.ts","../src/generated/schemas.json","../src/tools/wallet/create/tool.ts","../src/tools/shared.ts","../src/tools/wallet/vault.ts","../src/tools/wallet/create/schema.ts","../src/tools/wallet/import/tool.ts","../src/tools/wallet/import/schema.ts","../src/tools/wallet/list/schema.ts","../src/tools/wallet/list/tool.ts","../src/tools/wallet/retrieve/schema.ts","../src/tools/wallet/retrieve/tool.ts","../src/tools/wallet/delete/schema.ts","../src/tools/wallet/delete/tool.ts","../src/tools/transaction/sign/tool.ts","../src/tools/transaction/sign/schema.ts","../src/tools/message/sign/tool.ts","../src/tools/message/sign/schema.ts","../src/tools/wallet/lock/tool.ts","../src/tools/wallet/lock/schema.ts","../src/tools/wallet/unlock/tool.ts","../src/tools/wallet/unlock/schema.ts","../src/tools/bitcoin/balance/tool.ts","../src/tools/bitcoin/balance/schema.ts"],"sourcesContent":["import { spawn } from \"child_process\";\nimport * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { createInterface } from \"node:readline\";\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".config\", \"moonpay\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\nconst CREDENTIALS_PATH = path.join(CONFIG_DIR, \"credentials.json\");\nconst LOCK_PATH = path.join(CONFIG_DIR, \".credentials.lock\");\n\n/** Built-in config used when no ~/.config/moonpay/config.json exists. */\nexport const DEFAULT_CONFIG: Config = {\n baseUrl: \"https://agents.moonpay.com\",\n clientId: \"mooniq_zin3s5jz3olzkdfxpmbeaogv\",\n};\n\nexport type Config = {\n baseUrl: string;\n clientId: string;\n clientSecret?: string;\n};\n\nexport type Credentials = {\n accessToken: string;\n refreshToken: string | null;\n expiresAt: number;\n baseUrl: string;\n};\n\nfunction ensureConfigDir() {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nfunction atomicWriteFileSync(\n filePath: string,\n data: string,\n mode: number,\n) {\n const tmp = filePath + `.tmp.${process.pid}`;\n fs.writeFileSync(tmp, data, { encoding: \"utf-8\", mode });\n fs.renameSync(tmp, filePath);\n}\n\nconst LOCK_STALE_MS = 30_000;\n\nfunction acquireLock(): (() => void) | null {\n ensureConfigDir();\n try {\n const fd = fs.openSync(LOCK_PATH, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY, 0o600);\n fs.writeSync(fd, JSON.stringify({ pid: process.pid, ts: Date.now() }));\n fs.closeSync(fd);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n try {\n const lockData = JSON.parse(fs.readFileSync(LOCK_PATH, \"utf-8\"));\n if (Date.now() - lockData.ts < LOCK_STALE_MS) {\n return null;\n }\n } catch {\n // corrupt lock file\n }\n try { fs.unlinkSync(LOCK_PATH); } catch { /* already removed */ }\n try {\n const fd = fs.openSync(LOCK_PATH, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY, 0o600);\n fs.writeSync(fd, JSON.stringify({ pid: process.pid, ts: Date.now() }));\n fs.closeSync(fd);\n } catch {\n return null;\n }\n }\n return () => {\n try { fs.unlinkSync(LOCK_PATH); } catch { /* already removed */ }\n };\n}\n\nexport function getConfig(): Config | null {\n if (!fs.existsSync(CONFIG_PATH)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(CONFIG_PATH, \"utf-8\"));\n if (!data.baseUrl || !data.clientId) return null;\n return data as Config;\n } catch {\n return null;\n }\n}\n\nexport function getConfigOrDefault(): Config {\n const fromFile = getConfig();\n if (fromFile) return fromFile;\n saveConfig(DEFAULT_CONFIG);\n return DEFAULT_CONFIG;\n}\n\nexport function getCredentials(): Credentials | null {\n if (!fs.existsSync(CREDENTIALS_PATH)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(CREDENTIALS_PATH, \"utf-8\"));\n if (!data.accessToken || !data.baseUrl) return null;\n return data as Credentials;\n } catch {\n return null;\n }\n}\n\nexport function saveCredentials(creds: Credentials) {\n ensureConfigDir();\n atomicWriteFileSync(CREDENTIALS_PATH, JSON.stringify(creds, null, 2), 0o600);\n}\n\nexport function saveConfig(config: Config) {\n ensureConfigDir();\n atomicWriteFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 0o600);\n}\n\nexport function clearCredentials() {\n if (fs.existsSync(CREDENTIALS_PATH)) {\n fs.unlinkSync(CREDENTIALS_PATH);\n }\n}\n\nexport function resolveBaseUrl(): string {\n const config = getConfig();\n const creds = getCredentials();\n return config?.baseUrl ?? creds?.baseUrl ?? DEFAULT_CONFIG.baseUrl;\n}\n\nfunction openBrowser(url: string): boolean {\n const platform = process.platform;\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"cmd\"\n : \"xdg-open\";\n const args =\n platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\n try {\n spawn(cmd, args, { stdio: \"ignore\", detached: true }).unref();\n return true;\n } catch {\n return false;\n }\n}\n\nfunction promptLine(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * OAuth login flow.\n *\n * Redirects to a frontend callback page that displays the authorization code.\n * The user copies the code and pastes it into the terminal.\n * Works on desktop, headless servers, VPS, and SSH sessions.\n */\nconst LOGIN_STATE_PATH = path.join(CONFIG_DIR, \".login-state.json\");\n\ntype LoginOptions = {\n noBrowser?: boolean;\n code?: string;\n};\n\nexport async function login(config: Config, options: LoginOptions = {}): Promise<Credentials> {\n const callbackUrl = `${config.baseUrl}/callback`;\n\n // Step 2: complete login with a code from a previous --no-browser run\n if (options.code) {\n const stateData = loadLoginState();\n if (!stateData) {\n throw new Error(\"No pending login found. Run `mp login --no-browser` first.\");\n }\n return exchangeCode(config, options.code, callbackUrl, stateData.codeVerifier);\n }\n\n // Step 1: start the auth flow\n const state = crypto.randomUUID();\n const usePkce = !config.clientSecret;\n\n let codeVerifier: string | undefined;\n if (usePkce) {\n codeVerifier = generateCodeVerifier();\n }\n\n const authorizeParams = new URLSearchParams({\n client_id: config.clientId,\n redirect_uri: callbackUrl,\n response_type: \"code\",\n scope: \"profile email\",\n state,\n });\n if (usePkce && codeVerifier) {\n authorizeParams.set(\"code_challenge\", generateCodeChallenge(codeVerifier));\n authorizeParams.set(\"code_challenge_method\", \"S256\");\n }\n\n const authorizeUrl = `${config.baseUrl}/authorize?${authorizeParams.toString()}`;\n\n // Save PKCE state for --code step\n saveLoginState({ state, codeVerifier: codeVerifier ?? null });\n\n const opened = options.noBrowser ? false : openBrowser(authorizeUrl);\n\n // Always print the URL so it's visible in terminal/logs\n console.log(\"Open this URL in your browser to log in:\\n\");\n console.log(` ${authorizeUrl}\\n`);\n\n if (options.noBrowser) {\n console.log(\"Tip: you can run `open <url>` to open it directly.\");\n console.log(\"After authorizing, copy the code and run:\\n\");\n console.log(\" mp login --code <paste-code-here>\\n\");\n process.exit(0);\n }\n\n const code = await promptLine(\"Paste code: \");\n if (!code) {\n throw new Error(\"No authorization code provided.\");\n }\n\n return exchangeCode(config, code, callbackUrl, codeVerifier ?? null);\n}\n\nfunction saveLoginState(state: { state: string; codeVerifier: string | null }): void {\n ensureConfigDir();\n atomicWriteFileSync(LOGIN_STATE_PATH, JSON.stringify(state), 0o600);\n}\n\nfunction loadLoginState(): { state: string; codeVerifier: string | null } | null {\n if (!fs.existsSync(LOGIN_STATE_PATH)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(LOGIN_STATE_PATH, \"utf-8\"));\n fs.unlinkSync(LOGIN_STATE_PATH); // one-time use\n return data;\n } catch {\n return null;\n }\n}\n\nasync function exchangeCode(\n config: Config,\n code: string,\n callbackUrl: string,\n codeVerifier: string | null,\n): Promise<Credentials> {\n const tokenParams: Record<string, string> = {\n grant_type: \"authorization_code\",\n code,\n client_id: config.clientId,\n redirect_uri: callbackUrl,\n };\n if (config.clientSecret) {\n tokenParams.client_secret = config.clientSecret;\n }\n if (codeVerifier) {\n tokenParams.code_verifier = codeVerifier;\n }\n\n const tokenResponse = await fetch(`${config.baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(tokenParams),\n });\n\n if (!tokenResponse.ok) {\n const err = (await tokenResponse.json().catch(() => ({}))) as {\n error?: string;\n error_description?: string;\n };\n const msg = err.error_description ?? err.error ?? tokenResponse.statusText;\n throw new Error(`Token exchange failed: ${msg}`);\n }\n\n const tokens = await tokenResponse.json();\n const expiresAt = Date.now() + (tokens.expires_in ?? 3600) * 1000;\n\n const creds: Credentials = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? null,\n expiresAt,\n baseUrl: config.baseUrl,\n };\n\n saveCredentials(creds);\n return creds;\n}\n\nexport async function refreshCredentials(\n creds: Credentials,\n config: Config,\n): Promise<Credentials> {\n if (!creds.refreshToken) {\n throw new Error(\"No refresh token available\");\n }\n\n const unlock = acquireLock();\n if (!unlock) {\n await new Promise((r) => setTimeout(r, 2000));\n const fresh = getCredentials();\n if (fresh && fresh.expiresAt > Date.now()) {\n return fresh;\n }\n throw new Error(\"Token refresh failed (concurrent refresh in progress)\");\n }\n\n try {\n const latest = getCredentials();\n if (latest && latest.expiresAt > Date.now() + 60_000) {\n return latest;\n }\n\n const refreshParams: Record<string, string> = {\n grant_type: \"refresh_token\",\n refresh_token: creds.refreshToken,\n client_id: config.clientId,\n };\n if (config.clientSecret) {\n refreshParams.client_secret = config.clientSecret;\n }\n\n const tokenResponse = await fetch(`${config.baseUrl}/api/oauth/token`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(refreshParams),\n });\n\n if (!tokenResponse.ok) {\n throw new Error(\"Token refresh failed\");\n }\n\n const tokens = await tokenResponse.json();\n const expiresAt = Date.now() + (tokens.expires_in ?? 3600) * 1000;\n\n const newCreds: Credentials = {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? creds.refreshToken,\n expiresAt,\n baseUrl: config.baseUrl,\n };\n\n saveCredentials(newCreds);\n return newCreds;\n } finally {\n unlock();\n }\n}\n\nconst TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;\n\nexport async function getValidToken(): Promise<string | null> {\n const creds = getCredentials();\n if (!creds) return null;\n\n const config = getConfig();\n if (!config || config.baseUrl !== creds.baseUrl) return null;\n\n if (Date.now() >= creds.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n if (creds.refreshToken) {\n try {\n const newCreds = await refreshCredentials(creds, config);\n return newCreds.accessToken;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n return creds.accessToken;\n}\n","/**\n * Remote tool client.\n * Attaches auth (Bearer token) if credentials are available, otherwise calls without auth.\n * Handles automatic token refresh on 401.\n */\n\nimport {\n getConfig,\n getCredentials,\n getValidToken,\n refreshCredentials,\n} from \"./auth\";\n\nexport async function callTool(\n baseUrl: string,\n toolName: string,\n params: Record<string, unknown>,\n): Promise<unknown> {\n const token = await getValidToken();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n let res = await fetch(`${baseUrl}/api/tools/${toolName}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(params),\n });\n\n // Auto-refresh on 401 if we have a refresh token\n if (res.status === 401 && token) {\n const creds = getCredentials();\n const config = getConfig();\n if (creds?.refreshToken && config && config.baseUrl === creds.baseUrl) {\n try {\n const newCreds = await refreshCredentials(creds, config);\n res = await fetch(`${baseUrl}/api/tools/${toolName}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${newCreds.accessToken}`,\n },\n body: JSON.stringify(params),\n });\n } catch {\n // Refresh failed, fall through\n }\n }\n }\n\n const data = await res.json();\n\n if (res.status === 401) {\n throw new Error(\"This command requires a MoonPay Agents account. Run `moonpay login` first.\");\n }\n\n if (res.status < 200 || res.status >= 300) {\n const err = data as { error?: string };\n throw new Error(err?.error ?? `Tool call failed (${res.status})`);\n }\n\n return data;\n}\n","[\n {\n \"name\": \"buy\",\n \"description\": \"Buy crypto with fiat via MoonPay. Returns a checkout URL to complete the purchase.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/buy_input\",\n \"definitions\": {\n \"buy_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"enum\": [\n \"sol\",\n \"usdc\",\n \"usdc_arbitrum\",\n \"usdc_base\",\n \"usdc_optimism\",\n \"usdc_sol\",\n \"usdc_polygon\",\n \"eth\",\n \"eth_polygon\",\n \"eth_optimism\",\n \"eth_base\",\n \"eth_arbitrum\"\n ],\n \"description\": \"MoonPay currency code: sol (Solana), usdc_sol (USDC on Solana), eth (Ethereum), usdc (USDC on Ethereum), usdc_base (USDC on Base), etc.\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"description\": \"Amount of the token to buy, in token units — not fiat. For example, 1.5 means 1.5 SOL, not $1.50.\"\n },\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Destination wallet address to receive the tokens\"\n },\n \"email\": {\n \"type\": [\n \"string\",\n \"null\"\n ],\n \"description\": \"Buyer email to pre-fill on the checkout page\"\n }\n },\n \"required\": [\n \"token\",\n \"amount\",\n \"wallet\",\n \"email\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_balance_list\",\n \"description\": \"List all token balances held in a wallet, including amount owned, current value in USD, and token details. Shows the complete token portfolio.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_balance_list_input\",\n \"definitions\": {\n \"token_balance_list_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Wallet address to check token balances for\"\n },\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain to check balances on (e.g. 'solana', 'ethereum', 'base')\"\n }\n },\n \"required\": [\n \"wallet\",\n \"chain\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_retrieve\",\n \"description\": \"Get detailed token information including market data, price changes, volume, trades, and holder statistics by token address\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_retrieve_input\",\n \"definitions\": {\n \"token_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Address of the token to retrieve\"\n },\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain network where the token exists\"\n }\n },\n \"required\": [\n \"token\",\n \"chain\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_search\",\n \"description\": \"Search for tokens by name, symbol, or address. Returns matching tokens with their market data including price, volume, and liquidity.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_search_input\",\n \"definitions\": {\n \"token_search_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"Search term - can be token name (e.g. 'Bitcoin'), symbol (e.g. 'BTC'), or partial match\"\n },\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain to search on (e.g. 'solana', 'ethereum', 'base')\"\n },\n \"limit\": {\n \"type\": [\n \"number\",\n \"null\"\n ],\n \"description\": \"Maximum number of results to return (optional, defaults to 5)\"\n }\n },\n \"required\": [\n \"query\",\n \"chain\",\n \"limit\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_swap_build\",\n \"description\": \"Build an unsigned swap transaction. Returns a base64-encoded transaction ready for signing.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_swap_build_input\",\n \"definitions\": {\n \"token_swap_build_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"input\": {\n \"type\": \"string\",\n \"description\": \"Mint address of the input token\"\n },\n \"output\": {\n \"type\": \"string\",\n \"description\": \"Mint address of the output token\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"description\": \"Amount of the input token to swap\"\n },\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Wallet address that will execute the swap\"\n }\n },\n \"required\": [\n \"input\",\n \"output\",\n \"amount\",\n \"wallet\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_swap_execute\",\n \"description\": \"Execute a signed swap transaction. Pass the signed transaction and requestId from token_swap_build.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_swap_execute_input\",\n \"definitions\": {\n \"token_swap_execute_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"transaction\": {\n \"type\": \"string\",\n \"description\": \"Base64-encoded signed transaction\"\n },\n \"requestId\": {\n \"type\": \"string\",\n \"description\": \"Request ID from token_swap_build\"\n }\n },\n \"required\": [\n \"transaction\",\n \"requestId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_transfer_build\",\n \"description\": \"Build an unsigned transfer transaction. Returns a base64-encoded transaction ready for signing. Handles both native SOL and SPL tokens.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_transfer_build_input\",\n \"definitions\": {\n \"token_transfer_build_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"Wallet address to transfer from\"\n },\n \"token\": {\n \"type\": \"string\",\n \"description\": \"Mint address of the token to transfer\"\n },\n \"to\": {\n \"type\": \"string\",\n \"description\": \"Recipient wallet address\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"description\": \"Amount to transfer in human-readable units (e.g. 1.5)\"\n }\n },\n \"required\": [\n \"wallet\",\n \"token\",\n \"to\",\n \"amount\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"token_trending_list\",\n \"description\": \"Get currently trending tokens on a blockchain. Perfect for discovering what's hot right now.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/token_trending_list_input\",\n \"definitions\": {\n \"token_trending_list_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"chain\": {\n \"type\": \"string\",\n \"enum\": [\n \"solana\",\n \"ethereum\",\n \"base\",\n \"polygon\",\n \"arbitrum\",\n \"optimism\"\n ],\n \"description\": \"Blockchain to get trending tokens from (e.g. 'solana', 'ethereum', 'base')\"\n },\n \"limit\": {\n \"type\": \"number\",\n \"description\": \"Number of results per page\"\n },\n \"page\": {\n \"type\": \"number\",\n \"description\": \"The page number of results\"\n }\n },\n \"required\": [\n \"chain\",\n \"limit\",\n \"page\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"transaction_send\",\n \"description\": \"Broadcast a signed transaction to Solana. Simulates first, then sends and confirms.\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/transaction_send_input\",\n \"definitions\": {\n \"transaction_send_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"transaction\": {\n \"type\": \"string\",\n \"description\": \"Base64-encoded signed transaction\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"Human-readable message describing the transaction\"\n }\n },\n \"required\": [\n \"transaction\",\n \"message\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"user_retrieve\",\n \"description\": \"Get the currently authenticated user\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/user_retrieve_input\",\n \"definitions\": {\n \"user_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_delete\",\n \"description\": \"Delete a bank account\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_delete_input\",\n \"definitions\": {\n \"virtual-account_bank-account_delete_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"bankAccountId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the bank account to delete\"\n }\n },\n \"required\": [\n \"bankAccountId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_eur_register\",\n \"description\": \"Register a EUR bank account for offramp payouts\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_eur_register_input\",\n \"definitions\": {\n \"virtual-account_bank-account_eur_register_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"iban\": {\n \"type\": \"string\",\n \"description\": \"IBAN for SEPA bank account\"\n },\n \"address\": {\n \"type\": \"object\",\n \"properties\": {\n \"street\": {\n \"type\": \"string\",\n \"description\": \"Street address\"\n },\n \"city\": {\n \"type\": \"string\",\n \"description\": \"City\"\n },\n \"state\": {\n \"type\": \"string\",\n \"description\": \"State or province\"\n },\n \"country\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code\"\n },\n \"postalCode\": {\n \"type\": \"string\",\n \"description\": \"Postal or ZIP code\"\n }\n },\n \"required\": [\n \"street\",\n \"city\",\n \"state\",\n \"country\",\n \"postalCode\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Address of the user that owns the bank account\"\n },\n \"email\": {\n \"type\": \"string\",\n \"description\": \"Email address of the user that owns the bank account\"\n },\n \"phoneNumber\": {\n \"type\": \"string\",\n \"description\": \"Phone number of the user\"\n },\n \"providerCountry\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code where the bank is located\"\n },\n \"providerName\": {\n \"type\": \"string\",\n \"description\": \"Name of the bank\"\n },\n \"givenName\": {\n \"type\": \"string\",\n \"description\": \"First/given name of the account holder\"\n },\n \"familyName\": {\n \"type\": \"string\",\n \"description\": \"Last/family name of the account holder\"\n }\n },\n \"required\": [\n \"iban\",\n \"address\",\n \"email\",\n \"phoneNumber\",\n \"providerCountry\",\n \"providerName\",\n \"givenName\",\n \"familyName\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_list\",\n \"description\": \"List registered bank accounts\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_list_input\",\n \"definitions\": {\n \"virtual-account_bank-account_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_retrieve\",\n \"description\": \"Get a bank account by currency\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_retrieve_input\",\n \"definitions\": {\n \"virtual-account_bank-account_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"currency\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency code (USD or EUR)\"\n }\n },\n \"required\": [\n \"currency\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_bank-account_usd_register\",\n \"description\": \"Register a USD bank account for offramp payouts\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_bank-account_usd_register_input\",\n \"definitions\": {\n \"virtual-account_bank-account_usd_register_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\n \"ACH\",\n \"Wire\"\n ],\n \"description\": \"Type of bank account (ACH or Wire)\"\n },\n \"accountNumber\": {\n \"type\": \"string\",\n \"description\": \"Account number\"\n },\n \"routingNumber\": {\n \"type\": \"string\",\n \"description\": \"Routing number\"\n },\n \"address\": {\n \"type\": \"object\",\n \"properties\": {\n \"street\": {\n \"type\": \"string\",\n \"description\": \"Street address\"\n },\n \"city\": {\n \"type\": \"string\",\n \"description\": \"City\"\n },\n \"state\": {\n \"type\": \"string\",\n \"description\": \"State or province\"\n },\n \"country\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code\"\n },\n \"postalCode\": {\n \"type\": \"string\",\n \"description\": \"Postal or ZIP code\"\n }\n },\n \"required\": [\n \"street\",\n \"city\",\n \"state\",\n \"country\",\n \"postalCode\"\n ],\n \"additionalProperties\": false,\n \"description\": \"Address of the user that owns the bank account\"\n },\n \"email\": {\n \"type\": \"string\",\n \"description\": \"Email address of the user that owns the bank account\"\n },\n \"phoneNumber\": {\n \"type\": \"string\",\n \"description\": \"Phone number of the user\"\n },\n \"providerCountry\": {\n \"type\": \"string\",\n \"enum\": [\n \"US\",\n \"GB\",\n \"CA\",\n \"AU\",\n \"DE\",\n \"FR\",\n \"IT\",\n \"ES\",\n \"NL\",\n \"BE\",\n \"AT\",\n \"CH\",\n \"SE\",\n \"NO\",\n \"DK\",\n \"FI\",\n \"IE\",\n \"PT\",\n \"PL\",\n \"CZ\",\n \"GR\",\n \"JP\",\n \"KR\",\n \"CN\",\n \"IN\",\n \"BR\",\n \"MX\",\n \"AR\",\n \"ZA\",\n \"NZ\",\n \"SG\",\n \"HK\",\n \"AE\"\n ],\n \"description\": \"ISO 3166-1 Alpha-2 country code where the bank is located\"\n },\n \"providerName\": {\n \"type\": \"string\",\n \"description\": \"Name of the bank\"\n },\n \"givenName\": {\n \"type\": \"string\",\n \"description\": \"First/given name of the account holder\"\n },\n \"familyName\": {\n \"type\": \"string\",\n \"description\": \"Last/family name of the account holder\"\n }\n },\n \"required\": [\n \"type\",\n \"accountNumber\",\n \"routingNumber\",\n \"address\",\n \"email\",\n \"phoneNumber\",\n \"providerCountry\",\n \"providerName\",\n \"givenName\",\n \"familyName\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_create\",\n \"description\": \"Create a virtual account and start KYC verification\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_create_input\",\n \"definitions\": {\n \"virtual-account_create_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_delete\",\n \"description\": \"Delete your virtual account\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_delete_input\",\n \"definitions\": {\n \"virtual-account_delete_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_identification_create\",\n \"description\": \"Create a KYC verification link to complete identity verification\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_identification_create_input\",\n \"definitions\": {\n \"virtual-account_identification_create_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_identification_list\",\n \"description\": \"List all KYC identifications\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_identification_list_input\",\n \"definitions\": {\n \"virtual-account_identification_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_identification_retrieve\",\n \"description\": \"Get the status of a KYC identification\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_identification_retrieve_input\",\n \"definitions\": {\n \"virtual-account_identification_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_create\",\n \"description\": \"Create an offramp to convert stablecoin to fiat\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_create_input\",\n \"definitions\": {\n \"virtual-account_offramp_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The name of the offramp\"\n },\n \"fiat\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency to convert to\"\n },\n \"stablecoin\": {\n \"type\": \"string\",\n \"enum\": [\n \"USDC\",\n \"USDT\",\n \"EURC\"\n ],\n \"description\": \"The stablecoin token to convert from\"\n }\n },\n \"required\": [\n \"name\",\n \"fiat\",\n \"stablecoin\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_delete\",\n \"description\": \"Cancel an offramp\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_delete_input\",\n \"definitions\": {\n \"virtual-account_offramp_delete_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"offrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the offramp to cancel\"\n }\n },\n \"required\": [\n \"offrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_initiate\",\n \"description\": \"Build an unsigned transaction to send stablecoin to an offramp deposit address\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_initiate_input\",\n \"definitions\": {\n \"virtual-account_offramp_initiate_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"The wallet address to send from\"\n },\n \"offrampId\": {\n \"type\": \"string\",\n \"description\": \"The ID of the offramp to initiate\"\n },\n \"amount\": {\n \"type\": \"number\",\n \"minimum\": 0,\n \"description\": \"The amount of stablecoin to send (in human-readable units, e.g., 100.5)\"\n }\n },\n \"required\": [\n \"wallet\",\n \"offrampId\",\n \"amount\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_list\",\n \"description\": \"List all offramps\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_list_input\",\n \"definitions\": {\n \"virtual-account_offramp_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_offramp_retrieve\",\n \"description\": \"Get offramp details\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_offramp_retrieve_input\",\n \"definitions\": {\n \"virtual-account_offramp_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"offrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the offramp to retrieve\"\n }\n },\n \"required\": [\n \"offrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_create\",\n \"description\": \"Create an onramp to convert fiat to stablecoin\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_create_input\",\n \"definitions\": {\n \"virtual-account_onramp_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The name of the onramp\"\n },\n \"fiat\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency to convert from\"\n },\n \"stablecoin\": {\n \"type\": \"string\",\n \"enum\": [\n \"USDC\",\n \"USDT\",\n \"EURC\"\n ],\n \"description\": \"The stablecoin token to convert to\"\n }\n },\n \"required\": [\n \"name\",\n \"fiat\",\n \"stablecoin\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_delete\",\n \"description\": \"Cancel an onramp\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_delete_input\",\n \"definitions\": {\n \"virtual-account_onramp_delete_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp to cancel\"\n }\n },\n \"required\": [\n \"onrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_list\",\n \"description\": \"List all onramps\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_list_input\",\n \"definitions\": {\n \"virtual-account_onramp_list_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\n \"Created\",\n \"Authorized\",\n \"DepositAccountAdded\",\n \"Approved\",\n \"Rejected\",\n \"Cancelled\"\n ],\n \"description\": \"Status of the onramps to get\"\n }\n },\n \"required\": [\n \"status\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_payment_create\",\n \"description\": \"Create an open banking payment link for an onramp\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_payment_create_input\",\n \"definitions\": {\n \"virtual-account_onramp_payment_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp\"\n },\n \"amount\": {\n \"type\": \"string\",\n \"description\": \"The amount to pay\"\n },\n \"fiat\": {\n \"type\": \"string\",\n \"enum\": [\n \"USD\",\n \"EUR\"\n ],\n \"description\": \"The fiat currency (USD or EUR)\"\n }\n },\n \"required\": [\n \"onrampId\",\n \"amount\",\n \"fiat\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_payment_retrieve\",\n \"description\": \"Get the status of an open banking payment\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_payment_retrieve_input\",\n \"definitions\": {\n \"virtual-account_onramp_payment_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp this payment belongs to\"\n },\n \"paymentId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the payment to retrieve\"\n }\n },\n \"required\": [\n \"onrampId\",\n \"paymentId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_onramp_retrieve\",\n \"description\": \"Get onramp details and banking info\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_onramp_retrieve_input\",\n \"definitions\": {\n \"virtual-account_onramp_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"onrampId\": {\n \"type\": \"string\",\n \"format\": \"uuid\",\n \"description\": \"The ID of the onramp to retrieve\"\n }\n },\n \"required\": [\n \"onrampId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_retrieve\",\n \"description\": \"Get your virtual account status\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_retrieve_input\",\n \"definitions\": {\n \"virtual-account_retrieve_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_signing_create\",\n \"description\": \"Sign a required document for your virtual account\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_signing_create_input\",\n \"definitions\": {\n \"virtual-account_signing_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"contentId\": {\n \"type\": \"string\",\n \"description\": \"The unique ID of the content to sign\"\n }\n },\n \"required\": [\n \"contentId\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_signing_list\",\n \"description\": \"List all signed documents\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_signing_list_input\",\n \"definitions\": {\n \"virtual-account_signing_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_signing_required_list\",\n \"description\": \"List documents that require your signature\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_signing_required_list_input\",\n \"definitions\": {\n \"virtual-account_signing_required_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_transaction_list\",\n \"description\": \"List virtual account transactions\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_transaction_list_input\",\n \"definitions\": {\n \"virtual-account_transaction_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_wallet_list\",\n \"description\": \"List registered wallets\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_wallet_list_input\",\n \"definitions\": {\n \"virtual-account_wallet_list_input\": {\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_wallet_register\",\n \"description\": \"Register a wallet using a signed verification message\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_wallet_register_input\",\n \"definitions\": {\n \"virtual-account_wallet_register_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"The wallet address to register\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"The verification message (from virtual-account_wallet_registration-message_create)\"\n },\n \"signature\": {\n \"type\": \"string\",\n \"description\": \"Base58-encoded signature of the message\"\n }\n },\n \"required\": [\n \"wallet\",\n \"message\",\n \"signature\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n },\n {\n \"name\": \"virtual-account_wallet_registration-message_create\",\n \"description\": \"Create the verification message to register a wallet\",\n \"inputSchema\": {\n \"$ref\": \"#/definitions/virtual-account_wallet_registration-message_create_input\",\n \"definitions\": {\n \"virtual-account_wallet_registration-message_create_input\": {\n \"type\": \"object\",\n \"properties\": {\n \"wallet\": {\n \"type\": \"string\",\n \"description\": \"The wallet address to register\"\n }\n },\n \"required\": [\n \"wallet\"\n ],\n \"additionalProperties\": false\n }\n },\n \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n }\n }\n]","import { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { generateMnemonic } from \"@scure/bip39\";\nimport { wordlist as english } from \"@scure/bip39/wordlists/english\";\nimport { createTool } from \"../../shared\";\nimport { saveWalletMetadata, loadWallet, type WalletMetadata } from \"../server\";\nimport { addHdEntry, loadVault } from \"../vault\";\nimport { deriveAllAddresses } from \"../chains\";\nimport { walletCreateSchema } from \"./schema\";\n\nexport const walletCreate = createTool(walletCreateSchema, async (params) => {\n if (params.from) {\n if (params.account === null) {\n throw new Error(\"--account is required when using --from.\");\n }\n return deriveFromExisting(params.name, params.from, params.account);\n }\n\n return createNew(params.name);\n});\n\nfunction createNew(name: string) {\n const mnemonic = generateMnemonic(english, 128);\n const addresses = deriveAllAddresses(mnemonic);\n\n const vaultRef = addHdEntry(mnemonic);\n\n const metadata: WalletMetadata = {\n name,\n type: \"hd\",\n vaultRef,\n account: 0,\n addresses,\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n const backupDir = join(homedir(), \".config\", \"moonpay\", \"backups\");\n mkdirSync(backupDir, { recursive: true, mode: 0o700 });\n const backupPath = join(backupDir, `${name}.mnemonic`);\n writeFileSync(backupPath, mnemonic + \"\\n\", { mode: 0o600 });\n\n return { name, account: 0, addresses, backupPath };\n}\n\nfunction deriveFromExisting(name: string, from: string, account: number) {\n const source = loadWallet(from);\n\n if (source.type !== \"hd\") {\n throw new Error(\n `Wallet \"${from}\" is an imported single-key wallet. Only HD wallets support account derivation.`,\n );\n }\n\n const vault = loadVault();\n const entry = vault.entries[source.vaultRef];\n if (!entry || entry.type !== \"hd\") {\n throw new Error(`Vault entry for wallet \"${from}\" not found or is not HD.`);\n }\n\n const addresses = deriveAllAddresses(entry.mnemonic, account);\n\n const metadata: WalletMetadata = {\n name,\n type: \"hd\",\n vaultRef: source.vaultRef,\n account,\n addresses,\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n return { name, account, addresses, backupPath: null };\n}\n","import { z } from \"zod\";\n\n// ── Schema types ─────────────────────────────────────────────\n\nexport type ToolSchema<\n I extends z.ZodType = z.ZodType,\n O extends z.ZodType = z.ZodType,\n> = {\n name: string;\n description: string;\n input: I;\n output: O;\n};\n\nexport type ToolInput<TSchema extends ToolSchema> = z.infer<TSchema[\"input\"]>;\nexport type ToolOutput<TSchema extends ToolSchema> = z.infer<TSchema[\"output\"]>;\n\nexport const defineToolSchema = <\n TInput extends z.ZodType,\n TOutput extends z.ZodType,\n>(config: {\n name: string;\n description: string;\n input: TInput;\n output: TOutput;\n}): ToolSchema<TInput, TOutput> => config;\n\n// ── Tool wrapper ─────────────────────────────────────────────\n\nexport type Tool<TSchema extends ToolSchema = ToolSchema> = {\n schema: TSchema;\n handler: (params: z.input<TSchema[\"input\"]>) => Promise<z.output<TSchema[\"output\"]>>;\n};\n\n/**\n * Lightweight createTool for CLI local tools.\n * Validates input/output with Zod, no logging or context.\n */\nexport const createTool = <TSchema extends ToolSchema>(\n schema: TSchema,\n handler: (\n params: z.output<TSchema[\"input\"]>,\n ) => Promise<z.output<TSchema[\"output\"]>>,\n): Tool<TSchema> => ({\n schema,\n handler: async (params: z.input<TSchema[\"input\"]>) => {\n const parsedInput = schema.input.parse(params);\n const result = await handler(parsedInput);\n return schema.output.parse(result);\n },\n});\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n renameSync,\n mkdirSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n randomBytes,\n randomUUID,\n scryptSync,\n createCipheriv,\n createDecipheriv,\n} from \"node:crypto\";\nimport {\n vaultDataSchema,\n lockedVaultDataSchema,\n type VaultData,\n type LockedVaultData,\n type HdVaultEntry,\n type ImportedVaultEntry,\n type WalletMetadata,\n type KeyChain,\n KEY_CHAIN_MAP,\n type Chain,\n} from \"./models\";\nimport { deriveKeyForChain } from \"./chains\";\n\n// ── Paths ───────────────────────────────────────────────────\n\nconst CONFIG_DIR = join(homedir(), \".config\", \"moonpay\");\nconst VAULT_PATH = join(CONFIG_DIR, \"vault.json\");\n\nexport function getVaultPath(): string {\n return VAULT_PATH;\n}\n\nfunction ensureConfigDir(): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n}\n\n// ── Vault CRUD ──────────────────────────────────────────────\n\n/**\n * Load the vault. Throws if locked or missing.\n */\nexport function loadVault(): VaultData {\n if (!existsSync(VAULT_PATH)) {\n // Auto-create empty vault on first access\n const empty: VaultData = { version: 1, entries: {} };\n saveVault(empty);\n return empty;\n }\n\n const raw = JSON.parse(readFileSync(VAULT_PATH, \"utf-8\"));\n\n // Check if locked\n const locked = lockedVaultDataSchema.safeParse(raw);\n if (locked.success) {\n throw new Error(\n \"Vault is locked. Run `mp wallet unlock` to decrypt it first.\",\n );\n }\n\n const result = vaultDataSchema.safeParse(raw);\n if (!result.success) {\n throw new Error(\"Vault file is corrupted or has an unknown format.\");\n }\n\n return result.data;\n}\n\n/**\n * Save the vault atomically.\n */\nexport function saveVault(vault: VaultData): void {\n ensureConfigDir();\n const tmpPath = join(\n CONFIG_DIR,\n `.vault.${randomBytes(4).toString(\"hex\")}.tmp`,\n );\n writeFileSync(tmpPath, JSON.stringify(vault, null, 2), { mode: 0o600 });\n renameSync(tmpPath, VAULT_PATH);\n}\n\n/**\n * Check if the vault is currently locked.\n */\nexport function isVaultLocked(): boolean {\n if (!existsSync(VAULT_PATH)) return false;\n const raw = JSON.parse(readFileSync(VAULT_PATH, \"utf-8\"));\n return lockedVaultDataSchema.safeParse(raw).success;\n}\n\n// ── Vault entry management ──────────────────────────────────\n\n/**\n * Add an HD wallet entry to the vault. Returns the entry ID.\n */\nexport function addHdEntry(mnemonic: string): string {\n const vault = loadVault();\n const id = randomUUID();\n const entry: HdVaultEntry = { id, type: \"hd\", mnemonic };\n vault.entries[id] = entry;\n saveVault(vault);\n return id;\n}\n\n/**\n * Add an imported key entry to the vault. Returns the entry ID.\n */\nexport function addImportedEntry(\n chain: KeyChain,\n privateKey: string,\n): string {\n const vault = loadVault();\n const id = randomUUID();\n const entry: ImportedVaultEntry = { id, type: \"imported\", chain, privateKey };\n vault.entries[id] = entry;\n saveVault(vault);\n return id;\n}\n\n/**\n * Remove a vault entry by ID.\n */\nexport function removeVaultEntry(id: string): void {\n const vault = loadVault();\n delete vault.entries[id];\n saveVault(vault);\n}\n\n// ── Key resolution ──────────────────────────────────────────\n\n/**\n * Resolve the private key for a wallet on a specific chain.\n * For HD wallets, derives from the mnemonic.\n * For imported wallets, returns the stored key directly.\n */\nexport function resolveSigningKey(\n wallet: WalletMetadata,\n chain: Chain,\n): { privateKey: Uint8Array; address: string } {\n const vault = loadVault();\n const entry = vault.entries[wallet.vaultRef];\n if (!entry) {\n throw new Error(\n `Vault entry not found for wallet \"${wallet.name}\". The vault may be out of sync.`,\n );\n }\n\n const keyChain = KEY_CHAIN_MAP[chain];\n\n if (entry.type === \"imported\") {\n if (entry.chain !== keyChain) {\n throw new Error(\n `Wallet \"${wallet.name}\" was imported for ${entry.chain}, cannot sign for ${chain}.`,\n );\n }\n return {\n privateKey: decodePrivateKey(entry.privateKey, keyChain),\n address: wallet.addresses[keyChain]!,\n };\n }\n\n // HD wallet — derive key for chain at wallet's account index\n const derived = deriveKeyForChain(entry.mnemonic, keyChain, wallet.account ?? 0);\n return {\n privateKey: derived.privateKey,\n address: derived.address,\n };\n}\n\nfunction decodePrivateKey(key: string, chain: KeyChain): Uint8Array {\n if (chain === \"solana\") {\n // Solana keys are base58-encoded 64-byte secret keys\n const bs58 = require(\"bs58\") as typeof import(\"bs58\");\n return bs58.default.decode(key);\n }\n // EVM and Bitcoin keys are hex-encoded 32-byte private keys\n return Uint8Array.from(Buffer.from(key, \"hex\"));\n}\n\n// ── Encryption / Decryption ─────────────────────────────────\n\nconst SCRYPT_N = 2 ** 14; // ~16MB memory, secure and fast\nconst SCRYPT_R = 8;\nconst SCRYPT_P = 1;\nconst KEY_LENGTH = 32; // AES-256\n\nfunction deriveEncryptionKey(password: string, salt: Buffer): Buffer {\n return scryptSync(password, salt, KEY_LENGTH, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n });\n}\n\n/**\n * Encrypt the vault with a password. Replaces the vault file with encrypted data.\n */\nexport function lockVault(password: string): void {\n const vault = loadVault(); // throws if already locked\n\n const salt = randomBytes(32);\n const key = deriveEncryptionKey(password, salt);\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n\n const plaintext = JSON.stringify(vault);\n const encrypted = Buffer.concat([\n cipher.update(plaintext, \"utf8\"),\n cipher.final(),\n ]);\n const tag = cipher.getAuthTag();\n\n const locked: LockedVaultData = {\n version: 1,\n locked: true,\n ciphertext: encrypted.toString(\"base64\"),\n iv: iv.toString(\"base64\"),\n salt: salt.toString(\"base64\"),\n tag: tag.toString(\"base64\"),\n };\n\n ensureConfigDir();\n const tmpPath = join(\n CONFIG_DIR,\n `.vault.${randomBytes(4).toString(\"hex\")}.tmp`,\n );\n writeFileSync(tmpPath, JSON.stringify(locked, null, 2), { mode: 0o600 });\n renameSync(tmpPath, VAULT_PATH);\n}\n\n/**\n * Decrypt the vault with a password. Replaces the locked vault file with plaintext.\n */\nexport function unlockVault(password: string): void {\n if (!existsSync(VAULT_PATH)) {\n throw new Error(\"No vault found. Create a wallet first.\");\n }\n\n const raw = JSON.parse(readFileSync(VAULT_PATH, \"utf-8\"));\n const locked = lockedVaultDataSchema.safeParse(raw);\n if (!locked.success) {\n throw new Error(\"Vault is not locked.\");\n }\n\n const { ciphertext, iv, salt, tag } = locked.data;\n\n const saltBuf = Buffer.from(salt, \"base64\");\n const key = deriveEncryptionKey(password, saltBuf);\n const ivBuf = Buffer.from(iv, \"base64\");\n const tagBuf = Buffer.from(tag, \"base64\");\n const ciphertextBuf = Buffer.from(ciphertext, \"base64\");\n\n const decipher = createDecipheriv(\"aes-256-gcm\", key, ivBuf, { authTagLength: 16 });\n decipher.setAuthTag(tagBuf);\n\n let decrypted: Buffer;\n try {\n decrypted = Buffer.concat([\n decipher.update(ciphertextBuf),\n decipher.final(),\n ]);\n } catch {\n throw new Error(\"Wrong password.\");\n }\n\n const vault = vaultDataSchema.parse(JSON.parse(decrypted.toString(\"utf8\")));\n saveVault(vault);\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { keyChainSchema } from \"../models\";\n\nexport const walletCreateSchema = defineToolSchema({\n name: \"wallet_create\",\n description:\n \"Create a new multi-chain HD wallet. Generates a BIP39 mnemonic seed phrase and derives addresses for Solana, Ethereum (shared by Base, Arbitrum, Polygon, Optimism, BNB, Avalanche), Bitcoin, and Tron. \" +\n \"The mnemonic is saved to a local backup file (path returned in output) — it is never printed or returned in the response. \" +\n \"To derive additional accounts from the same mnemonic, pass --from with an existing wallet name and --account with the desired index.\",\n input: z.object({\n name: z.string().describe(\"Wallet name\"),\n from: z\n .string()\n .nullable()\n .describe(\"Name of an existing HD wallet to derive from. Uses the same mnemonic but a different account index. Omit to generate a new mnemonic.\"),\n account: z\n .number()\n .int()\n .min(0)\n .nullable()\n .describe(\"BIP44 account index (0, 1, 2, ...). Required when using --from. Omit for new wallets (defaults to 0).\"),\n }),\n output: z.object({\n name: z.string().describe(\"Wallet name\"),\n account: z.number().describe(\"BIP44 account index used for derivation\"),\n addresses: z\n .record(keyChainSchema, z.string())\n .describe(\"Derived addresses per chain (solana, ethereum, bitcoin, tron)\"),\n backupPath: z\n .string()\n .nullable()\n .describe(\"Path to the mnemonic backup file (0o600 permissions). Null when derived from an existing wallet.\"),\n }),\n});\n","import { validateMnemonic } from \"@scure/bip39\";\nimport { wordlist as english } from \"@scure/bip39/wordlists/english\";\nimport { Keypair } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { createInterface } from \"node:readline\";\nimport { createTool } from \"../../shared\";\nimport { saveWalletMetadata, type WalletMetadata } from \"../server\";\nimport { addHdEntry, addImportedEntry } from \"../vault\";\nimport { deriveAllAddresses } from \"../chains\";\nimport { KEY_CHAIN_MAP, type KeyChain } from \"../models\";\nimport { walletImportSchema } from \"./schema\";\n\nasync function promptSecret(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport const walletImport = createTool(walletImportSchema, async (params) => {\n if (params.mnemonic && params.key) {\n throw new Error(\"Provide either --mnemonic or --key, not both.\");\n }\n\n if (params.mnemonic) {\n return importMnemonic(params.name, params.mnemonic);\n }\n\n // Single-key import\n const chain = params.chain ? KEY_CHAIN_MAP[params.chain] : \"solana\";\n const key =\n params.key !== null\n ? params.key\n : await promptSecret(\"Enter private key: \");\n\n return importKey(params.name, chain, key);\n});\n\nasync function importMnemonic(\n name: string,\n mnemonic: string,\n): Promise<{ name: string; type: \"hd\"; addresses: Record<KeyChain, string> }> {\n const trimmed = mnemonic.trim().toLowerCase();\n if (!validateMnemonic(trimmed, english)) {\n throw new Error(\"Invalid BIP39 mnemonic.\");\n }\n\n const addresses = deriveAllAddresses(trimmed);\n const vaultRef = addHdEntry(trimmed);\n\n const metadata: WalletMetadata = {\n name,\n type: \"hd\",\n vaultRef,\n account: 0,\n addresses,\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n return { name, type: \"hd\", addresses };\n}\n\nasync function importKey(\n name: string,\n chain: KeyChain,\n key: string,\n): Promise<{\n name: string;\n type: \"imported\";\n addresses: Partial<Record<KeyChain, string>>;\n}> {\n let address: string;\n\n if (chain === \"solana\") {\n try {\n const secretKeyBytes = bs58.decode(key);\n const keypair = Keypair.fromSecretKey(secretKeyBytes);\n address = keypair.publicKey.toBase58();\n } catch {\n throw new Error(\n \"Invalid private key. Expected a base58-encoded Solana secret key.\",\n );\n }\n } else if (chain === \"ethereum\") {\n // For EVM, we expect a hex private key (32 bytes = 64 hex chars)\n const cleanKey = key.startsWith(\"0x\") ? key.slice(2) : key;\n if (!/^[0-9a-fA-F]{64}$/.test(cleanKey)) {\n throw new Error(\n \"Invalid private key. Expected a 64-character hex string for EVM.\",\n );\n }\n // Derive address from private key\n const { deriveKeyForChain } = await import(\"../chains\");\n // We can't use deriveKeyForChain here since it needs a mnemonic\n // Instead, derive address directly from the private key\n const { HDKey } = await import(\"@scure/bip32\");\n const ecc = await import(\"tiny-secp256k1\");\n const { createHash } = await import(\"node:crypto\");\n\n const privKeyBytes = Buffer.from(cleanKey, \"hex\");\n const pubKey = ecc.pointFromScalar(privKeyBytes);\n if (!pubKey) throw new Error(\"Invalid private key.\");\n const uncompressed = ecc.pointCompress(pubKey, false);\n const hash = createHash(\"sha3-256\")\n .update(uncompressed.slice(1))\n .digest();\n address = \"0x\" + hash.slice(-20).toString(\"hex\");\n key = cleanKey; // store without 0x prefix\n } else {\n // Bitcoin\n const cleanKey = key.startsWith(\"0x\") ? key.slice(2) : key;\n if (!/^[0-9a-fA-F]{64}$/.test(cleanKey)) {\n throw new Error(\n \"Invalid private key. Expected a 64-character hex string for Bitcoin.\",\n );\n }\n const bitcoin = await import(\"bitcoinjs-lib\");\n const ECPairFactory = (await import(\"ecpair\")).default;\n const ecc = await import(\"tiny-secp256k1\");\n const ECPair = ECPairFactory(ecc);\n\n const keyPair = ECPair.fromPrivateKey(Buffer.from(cleanKey, \"hex\"));\n const { address: btcAddress } = bitcoin.payments.p2wpkh({\n pubkey: Buffer.from(keyPair.publicKey),\n });\n if (!btcAddress) throw new Error(\"Failed to derive Bitcoin address.\");\n address = btcAddress;\n key = cleanKey;\n }\n\n const vaultRef = addImportedEntry(chain, key);\n\n const metadata: WalletMetadata = {\n name,\n type: \"imported\",\n vaultRef,\n account: 0,\n addresses: { [chain]: address },\n createdAt: new Date().toISOString(),\n };\n saveWalletMetadata(metadata);\n\n return { name, type: \"imported\", addresses: { [chain]: address } };\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema, keyChainSchema } from \"../models\";\n\nexport const walletImportSchema = defineToolSchema({\n name: \"wallet_import\",\n description:\n \"Import a wallet from a BIP39 mnemonic (HD, all chains) or a single private key (one chain). \" +\n \"Provide either --mnemonic or --key, not both.\",\n input: z.object({\n name: z.string().describe(\"Wallet name\"),\n mnemonic: z\n .string()\n .nullable()\n .describe(\"BIP39 mnemonic seed phrase (for HD wallet import)\"),\n key: z\n .string()\n .nullable()\n .describe(\n \"Private key: base58 for Solana, hex for EVM/Bitcoin (for single-chain import)\",\n ),\n chain: chainSchema\n .nullable()\n .describe(\n \"Chain for single-key import: solana, ethereum, base, arbitrum, or bitcoin (default solana)\",\n ),\n }),\n output: z.object({\n name: z.string().describe(\"Wallet name\"),\n type: z.enum([\"hd\", \"imported\"]).describe(\"Wallet type\"),\n addresses: z\n .record(keyChainSchema, z.string())\n .describe(\"Wallet addresses per chain\"),\n }),\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { walletInfoSchema } from \"../models\";\n\nexport const walletListSchema = defineToolSchema({\n name: \"wallet_list\",\n description: \"List all local wallets\",\n input: z.object({}),\n output: z.array(walletInfoSchema),\n});\n","import { createTool } from \"../../shared\";\nimport { loadAllWallets } from \"../server\";\nimport { walletListSchema } from \"./schema\";\n\nexport const walletList = createTool(walletListSchema, async () => {\n return loadAllWallets();\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { walletInfoSchema } from \"../models\";\n\nexport const walletRetrieveSchema = defineToolSchema({\n name: \"wallet_retrieve\",\n description: \"Get details of a specific wallet\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name or address\"),\n }),\n output: walletInfoSchema,\n});\n","import { createTool } from \"../../shared\";\nimport { loadWallet } from \"../server\";\nimport { walletRetrieveSchema } from \"./schema\";\n\nexport const walletRetrieve = createTool(\n walletRetrieveSchema,\n async (params) => {\n return loadWallet(params.wallet);\n },\n);\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletDeleteSchema = defineToolSchema({\n name: \"wallet_delete\",\n description:\n \"Permanently delete a local wallet. This removes the private key file and cannot be undone.\",\n input: z.object({\n wallet: z.string().describe(\"Name or address of the wallet to delete\"),\n confirm: z\n .boolean()\n .describe(\"Must be true to confirm deletion\"),\n }),\n output: z.object({\n name: z.string().describe(\"Name of the deleted wallet\"),\n deleted: z.literal(true),\n }),\n});\n","import { createTool } from \"../../shared\";\nimport { loadWallet, deleteWalletFile } from \"../server\";\nimport { removeVaultEntry } from \"../vault\";\nimport { walletDeleteSchema } from \"./schema\";\n\nexport const walletDelete = createTool(walletDeleteSchema, async (params) => {\n if (!params.confirm) {\n throw new Error(\n \"Deletion not confirmed. Pass --confirm to permanently delete this wallet.\",\n );\n }\n\n const wallet = loadWallet(params.wallet);\n\n // Remove vault entry (mnemonic or private key)\n removeVaultEntry(wallet.vaultRef);\n\n // Remove metadata file\n deleteWalletFile(wallet.name);\n\n return { name: wallet.name, deleted: true as const };\n});\n","import { Keypair, VersionedTransaction } from \"@solana/web3.js\";\nimport { createTool } from \"../../shared\";\nimport { loadWallet } from \"../../wallet/server\";\nimport { resolveSigningKey } from \"../../wallet/vault\";\nimport { KEY_CHAIN_MAP, type Chain } from \"../../wallet/models\";\nimport { transactionSignSchema } from \"./schema\";\n\nexport const transactionSign = createTool(\n transactionSignSchema,\n async (params) => {\n const wallet = loadWallet(params.wallet);\n const chain = params.chain as Chain;\n const keyChain = KEY_CHAIN_MAP[chain];\n const { privateKey } = resolveSigningKey(wallet, chain);\n\n const txBytes = Buffer.from(params.transaction.trim(), \"base64\");\n\n switch (keyChain) {\n case \"solana\":\n return signSolana(privateKey, txBytes);\n case \"ethereum\":\n return signEvm(privateKey, txBytes);\n case \"bitcoin\":\n return signBitcoin(privateKey, txBytes);\n case \"tron\":\n return signEvm(privateKey, txBytes);\n }\n },\n);\n\nfunction signSolana(\n privateKey: Uint8Array,\n txBytes: Buffer,\n): { transaction: string } {\n const tx = VersionedTransaction.deserialize(txBytes);\n const keypair = Keypair.fromSecretKey(privateKey);\n tx.sign([keypair]);\n return { transaction: Buffer.from(tx.serialize()).toString(\"base64\") };\n}\n\nasync function signEvm(\n privateKey: Uint8Array,\n txBytes: Buffer,\n): Promise<{ transaction: string }> {\n const { createHash } = await import(\"node:crypto\");\n const ecc = await import(\"tiny-secp256k1\");\n\n // txBytes is an RLP-encoded unsigned transaction\n // Sign: keccak256(txBytes) -> secp256k1 ECDSA\n const hash = createHash(\"sha3-256\").update(txBytes).digest();\n const sig = ecc.sign(hash, privateKey);\n if (!sig) throw new Error(\"EVM signing failed\");\n\n // Return the signature appended to the transaction\n // In practice, EVM tx signing requires RLP re-encoding with v/r/s\n // This is a simplified version — full EVM tx signing would use ethers\n const signed = Buffer.concat([txBytes, Buffer.from(sig)]);\n return { transaction: signed.toString(\"base64\") };\n}\n\nasync function signBitcoin(\n privateKey: Uint8Array,\n txBytes: Buffer,\n): Promise<{ transaction: string }> {\n const bitcoin = await import(\"bitcoinjs-lib\");\n const ECPairFactory = (await import(\"ecpair\")).default;\n const ecc = await import(\"tiny-secp256k1\");\n\n const ECPair = ECPairFactory(ecc);\n const keyPair = ECPair.fromPrivateKey(Buffer.from(privateKey));\n\n // Parse as PSBT and sign all inputs\n const psbt = bitcoin.Psbt.fromBase64(txBytes.toString(\"base64\"));\n psbt.signAllInputs(keyPair);\n\n return { transaction: psbt.toBase64() };\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema } from \"../../wallet/models\";\n\nexport const transactionSignSchema = defineToolSchema({\n name: \"transaction_sign\",\n description:\n \"Sign a transaction with a local wallet. Supports Solana (VersionedTransaction), EVM (RLP-encoded), and Bitcoin (PSBT) transactions.\",\n input: z.object({\n wallet: z.string().describe(\"Wallet name or address\"),\n chain: chainSchema.describe(\n \"Chain: solana, ethereum, base, arbitrum, or bitcoin\",\n ),\n transaction: z\n .string()\n .describe(\"Base64-encoded unsigned transaction\"),\n }),\n output: z.object({\n transaction: z\n .string()\n .describe(\"Base64-encoded signed transaction\"),\n }),\n});\n","import { createHash } from \"node:crypto\";\nimport { Keypair } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport nacl from \"tweetnacl\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { createTool } from \"../../shared\";\nimport { loadWallet } from \"../../wallet/server\";\nimport { resolveSigningKey } from \"../../wallet/vault\";\nimport { KEY_CHAIN_MAP, type Chain } from \"../../wallet/models\";\nimport { messageSignSchema } from \"./schema\";\n\nexport const messageSign = createTool(messageSignSchema, async (params) => {\n const wallet = loadWallet(params.wallet);\n const chain = params.chain as Chain;\n const keyChain = KEY_CHAIN_MAP[chain];\n const { privateKey } = resolveSigningKey(wallet, chain);\n\n const messageBytes = Buffer.from(params.message, \"utf8\");\n\n switch (keyChain) {\n case \"solana\":\n return signSolana(privateKey, messageBytes);\n case \"ethereum\":\n return signEvm(privateKey, messageBytes);\n case \"bitcoin\":\n return signBitcoin(privateKey, messageBytes);\n case \"tron\":\n return signEvm(privateKey, messageBytes);\n }\n});\n\nfunction signSolana(\n privateKey: Uint8Array,\n messageBytes: Buffer,\n): { signature: string } {\n const keypair = Keypair.fromSecretKey(privateKey);\n const signatureBytes = nacl.sign.detached(messageBytes, keypair.secretKey);\n return { signature: bs58.encode(signatureBytes) };\n}\n\nfunction signEvm(\n privateKey: Uint8Array,\n messageBytes: Buffer,\n): { signature: string } {\n // EIP-191 personal sign: prefix the message\n const prefix = Buffer.from(\n `\\x19Ethereum Signed Message:\\n${messageBytes.length}`,\n \"utf8\",\n );\n const prefixed = Buffer.concat([prefix, messageBytes]);\n const hash = createHash(\"sha3-256\").update(prefixed).digest();\n\n const sig = ecc.sign(hash, privateKey);\n if (!sig) throw new Error(\"EVM message signing failed\");\n\n return { signature: \"0x\" + Buffer.from(sig).toString(\"hex\") };\n}\n\nfunction signBitcoin(\n privateKey: Uint8Array,\n messageBytes: Buffer,\n): { signature: string } {\n // Bitcoin message signing: double SHA-256\n const hash1 = createHash(\"sha256\").update(messageBytes).digest();\n const hash2 = createHash(\"sha256\").update(hash1).digest();\n\n const sig = ecc.sign(hash2, privateKey);\n if (!sig) throw new Error(\"Bitcoin message signing failed\");\n\n return { signature: \"0x\" + Buffer.from(sig).toString(\"hex\") };\n}\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\nimport { chainSchema } from \"../../wallet/models\";\n\nexport const messageSignSchema = defineToolSchema({\n name: \"message_sign\",\n description:\n \"Sign a message with a local wallet. Supports Solana (ed25519), EVM (EIP-191 personal sign), and Bitcoin (secp256k1 ECDSA).\",\n input: z.object({\n wallet: z.string().describe(\"Wallet address or name to sign with\"),\n chain: chainSchema.describe(\n \"Chain: solana, ethereum, base, arbitrum, or bitcoin\",\n ),\n message: z.string().describe(\"Message text to sign\"),\n }),\n output: z.object({\n signature: z\n .string()\n .describe(\n \"Signature: base58 for Solana, hex (0x-prefixed) for EVM/Bitcoin\",\n ),\n }),\n});\n","import { createInterface } from \"node:readline\";\nimport { createTool } from \"../../shared\";\nimport { lockVault, isVaultLocked } from \"../vault\";\nimport { walletLockSchema } from \"./schema\";\n\nasync function promptPassword(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nexport const walletLock = createTool(walletLockSchema, async () => {\n if (isVaultLocked()) {\n throw new Error(\"Vault is already locked.\");\n }\n\n const password = await promptPassword(\"Enter password to encrypt vault: \");\n if (!password) {\n throw new Error(\"Password cannot be empty.\");\n }\n\n const confirm = await promptPassword(\"Confirm password: \");\n if (password !== confirm) {\n throw new Error(\"Passwords do not match.\");\n }\n\n lockVault(password);\n return { locked: true as const };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletLockSchema = defineToolSchema({\n name: \"wallet_lock\",\n description:\n \"Encrypt the vault with a password. All signing operations will fail until `wallet unlock` is called. Password is prompted interactively.\",\n input: z.object({}),\n output: z.object({\n locked: z.literal(true),\n }),\n});\n","import { createInterface } from \"node:readline\";\nimport { createTool } from \"../../shared\";\nimport { unlockVault, isVaultLocked } from \"../vault\";\nimport { walletUnlockSchema } from \"./schema\";\n\nasync function promptPassword(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer);\n });\n });\n}\n\nexport const walletUnlock = createTool(walletUnlockSchema, async () => {\n if (!isVaultLocked()) {\n throw new Error(\"Vault is not locked.\");\n }\n\n const password = await promptPassword(\"Enter password to decrypt vault: \");\n unlockVault(password);\n return { unlocked: true as const };\n});\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const walletUnlockSchema = defineToolSchema({\n name: \"wallet_unlock\",\n description:\n \"Decrypt the vault with a password. Restores access to all signing operations. Password is prompted interactively.\",\n input: z.object({}),\n output: z.object({\n unlocked: z.literal(true),\n }),\n});\n","import https from \"node:https\";\nimport { createTool } from \"../../shared\";\nimport { bitcoinBalanceRetrieveSchema } from \"./schema\";\n\nconst SATS_PER_BTC = 100_000_000;\n\nfunction satsToBtc(sats: number): string {\n return (sats / SATS_PER_BTC).toFixed(8);\n}\n\nfunction fetchJson<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n https.get(url, { headers: { \"User-Agent\": \"moonpay-cli\" } }, (res) => {\n if (res.statusCode !== 200) {\n reject(new Error(`HTTP ${res.statusCode} from ${url}`));\n res.resume();\n return;\n }\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk));\n res.on(\"end\", () => {\n try {\n resolve(JSON.parse(data));\n } catch {\n reject(new Error(\"Invalid JSON response\"));\n }\n });\n }).on(\"error\", reject);\n });\n}\n\ninterface MempoolAddress {\n chain_stats: { funded_txo_sum: number; spent_txo_sum: number };\n mempool_stats: { funded_txo_sum: number; spent_txo_sum: number };\n}\n\nexport const bitcoinBalanceRetrieve = createTool(\n bitcoinBalanceRetrieveSchema,\n async (params) => {\n let address = params.wallet;\n\n // If it doesn't look like a Bitcoin address, try resolving as wallet name\n if (!address.startsWith(\"bc1\") && !address.startsWith(\"1\") && !address.startsWith(\"3\")) {\n const { loadWallet } = await import(\"../../wallet/server\");\n const wallet = loadWallet(address);\n const btcAddress = wallet.addresses.bitcoin;\n if (!btcAddress) {\n throw new Error(\n `Wallet \"${address}\" has no Bitcoin address. It may be an imported single-chain wallet.`,\n );\n }\n address = btcAddress;\n }\n\n const data = await fetchJson<MempoolAddress>(\n `https://mempool.space/api/address/${address}`,\n );\n\n const confirmedSats =\n data.chain_stats.funded_txo_sum - data.chain_stats.spent_txo_sum;\n const unconfirmedSats =\n data.mempool_stats.funded_txo_sum - data.mempool_stats.spent_txo_sum;\n const totalSats = confirmedSats + unconfirmedSats;\n\n return {\n address,\n confirmed: { btc: satsToBtc(confirmedSats), sats: confirmedSats },\n unconfirmed: { btc: satsToBtc(unconfirmedSats), sats: unconfirmedSats },\n total: { btc: satsToBtc(totalSats), sats: totalSats },\n };\n },\n);\n","import { z } from \"zod\";\nimport { defineToolSchema } from \"../../shared\";\n\nexport const bitcoinBalanceRetrieveSchema = defineToolSchema({\n name: \"bitcoin_balance_retrieve\",\n description:\n \"Get the BTC balance of a Bitcoin address. Returns confirmed and unconfirmed balances in BTC and satoshis.\",\n input: z.object({\n wallet: z.string().describe(\"Bitcoin address (bc1...) or wallet name\"),\n }),\n output: z.object({\n address: z.string().describe(\"Bitcoin address\"),\n confirmed: z.object({\n btc: z.string().describe(\"Confirmed balance in BTC\"),\n sats: z.number().describe(\"Confirmed balance in satoshis\"),\n }),\n unconfirmed: z.object({\n btc: z.string().describe(\"Unconfirmed (pending) balance in BTC\"),\n sats: z.number().describe(\"Unconfirmed (pending) balance in satoshis\"),\n }),\n total: z.object({\n btc: z.string().describe(\"Total balance in BTC\"),\n sats: z.number().describe(\"Total balance in satoshis\"),\n }),\n }),\n});\n"],"mappings":"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","names":["writeFileSync","mkdirSync","join","homedir","readFileSync","writeFileSync","existsSync","renameSync","mkdirSync","join","homedir","randomBytes","randomUUID","CONFIG_DIR","join","homedir","ensureConfigDir","mkdirSync","CONFIG_DIR","existsSync","readFileSync","join","randomBytes","writeFileSync","renameSync","randomUUID","bs58","join","homedir","mkdirSync","writeFileSync","english","createInterface","z","z","createInterface","english","deriveKeyForChain","ecc","createHash","z","z","z","z","z","z","Keypair","z","z","Keypair","createHash","ecc","createHash","Keypair","bs58","z","z","signSolana","signEvm","signBitcoin","Keypair","bs58","createHash","createInterface","z","z","createInterface","createInterface","z","z","promptPassword","createInterface","z","z","loadWallet"]}
|
|
File without changes
|