@moonpay/cli 1.93.2 → 1.94.1

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.
@@ -1,2 +1,2 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{a as f,d as c}from"./chunk-OV5GCWKP.js";import{b as u}from"./chunk-NVX42CFU.js";import{zodToJsonSchema as d}from"zod-to-json-schema";var p=new Map(c.map(o=>[o.schema.name,o]));function y(o){let e=o.inputSchema;if(e.$ref&&e.definitions){let n=e.$ref.replace("#/definitions/","");return e.definitions[n]??e}return e}function g(){let o=c.map(n=>({name:n.schema.name,description:n.schema.description,inputSchema:d(n.schema.input)})),e=new Map;for(let n of f){if(p.has(n.name))continue;let t=y(n);e.set(n.name,t.properties??{}),o.push({name:n.name,description:n.description,inputSchema:{type:"object",properties:t.properties??{},...t.required?{required:t.required}:{},...t.additionalProperties!==void 0?{additionalProperties:t.additionalProperties}:{}}})}return{toolDefs:o,toolDefMap:new Map(o.map(n=>[n.name,n])),remotePropsMap:e}}var i=g();function M(){return i.toolDefs}function P(o){return i.toolDefMap.has(o)}function h(o,e){let n=p.get(o);if(!n)return e;let t=n.schema.input.shape??{};for(let[r,l]of Object.entries(t))e[r]===void 0&&l._def.typeName==="ZodNullable"&&(e[r]=null);return e}function w(o,e){let n=i.remotePropsMap.get(o)??{};for(let[t,r]of Object.entries(n))e[t]===void 0&&(Array.isArray(r.type)?r.type.includes("null"):r.anyOf?.some(m=>m.type==="null"))&&(e[t]=null),(r.type==="number"||r.type==="integer"||Array.isArray(r.type)&&r.type.some(s=>s==="number"||s==="integer")||r.anyOf?.some(s=>s.type==="number"||s.type==="integer"))&&typeof e[t]=="string"&&(e[t]=Number(e[t]));return e}var a=class extends Error{constructor(e){super(`Unknown tool: ${e}`),this.name="UnknownToolError"}};async function R(o,e={}){if(!i.toolDefMap.has(o))throw new a(o);let n=p.get(o);if(n){let r=h(o,{...e});return n.handler(r)}let t=w(o,{...e});return u._call(o,t)}export{M as a,P as b,a as c,R as d};
2
+ import{a as f,d as c}from"./chunk-YISNOURG.js";import{b as u}from"./chunk-FTVZIAK6.js";import{zodToJsonSchema as d}from"zod-to-json-schema";var p=new Map(c.map(o=>[o.schema.name,o]));function y(o){let e=o.inputSchema;if(e.$ref&&e.definitions){let n=e.$ref.replace("#/definitions/","");return e.definitions[n]??e}return e}function g(){let o=c.map(n=>({name:n.schema.name,description:n.schema.description,inputSchema:d(n.schema.input)})),e=new Map;for(let n of f){if(p.has(n.name))continue;let t=y(n);e.set(n.name,t.properties??{}),o.push({name:n.name,description:n.description,inputSchema:{type:"object",properties:t.properties??{},...t.required?{required:t.required}:{},...t.additionalProperties!==void 0?{additionalProperties:t.additionalProperties}:{}}})}return{toolDefs:o,toolDefMap:new Map(o.map(n=>[n.name,n])),remotePropsMap:e}}var i=g();function M(){return i.toolDefs}function P(o){return i.toolDefMap.has(o)}function h(o,e){let n=p.get(o);if(!n)return e;let t=n.schema.input.shape??{};for(let[r,l]of Object.entries(t))e[r]===void 0&&l._def.typeName==="ZodNullable"&&(e[r]=null);return e}function w(o,e){let n=i.remotePropsMap.get(o)??{};for(let[t,r]of Object.entries(n))e[t]===void 0&&(Array.isArray(r.type)?r.type.includes("null"):r.anyOf?.some(m=>m.type==="null"))&&(e[t]=null),(r.type==="number"||r.type==="integer"||Array.isArray(r.type)&&r.type.some(s=>s==="number"||s==="integer")||r.anyOf?.some(s=>s.type==="number"||s.type==="integer"))&&typeof e[t]=="string"&&(e[t]=Number(e[t]));return e}var a=class extends Error{constructor(e){super(`Unknown tool: ${e}`),this.name="UnknownToolError"}};async function R(o,e={}){if(!i.toolDefMap.has(o))throw new a(o);let n=p.get(o);if(n){let r=h(o,{...e});return n.handler(r)}let t=w(o,{...e});return u._call(o,t)}export{M as a,P as b,a as c,R as d};
@@ -1,2 +1,2 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{b as a,c as b}from"./chunk-NVX42CFU.js";import"./chunk-PUJF4VUX.js";import"./chunk-LMDE72OE.js";export{a as moonpay,b as resetClient};
2
+ import{b as a,c as b}from"./chunk-FTVZIAK6.js";import"./chunk-YGSFMURK.js";import"./chunk-LMDE72OE.js";export{a as moonpay,b as resetClient};
package/dist/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
3
- import{a as J,b as x,c as A,d as S}from"./chunk-OV5GCWKP.js";import{b as N}from"./chunk-NVX42CFU.js";import{m as K}from"./chunk-PIM4IRDV.js";import{e as R,g as ee}from"./chunk-PUJF4VUX.js";import"./chunk-LMDE72OE.js";import{Command as me}from"commander";var ne=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function w(e){return t=>ne?`${e}${t}\x1B[0m`:t}var p={bold:w("\x1B[1m"),dim:w("\x1B[2m"),green:w("\x1B[32m"),yellow:w("\x1B[33m"),cyan:w("\x1B[36m"),red:w("\x1B[31m")};function $(e){if(e==null)return!0;let t=typeof e;return t==="string"||t==="number"||t==="boolean"}function k(e){return e==null?"-":String(e)}function C(e,t=0){let n=" ".repeat(t);return $(e)?`${n}${k(e)}`:Array.isArray(e)?e.length===0?`${n}${p.dim("(empty)")}`:e.every($)?e.map(o=>`${n}- ${k(o)}`).join(`
3
+ import{a as J,b as L,c as A,d as S}from"./chunk-YISNOURG.js";import{b as N}from"./chunk-FTVZIAK6.js";import{a as T,n as x}from"./chunk-5BWEUVPG.js";import{e as R,g as ne}from"./chunk-YGSFMURK.js";import"./chunk-LMDE72OE.js";import{Command as de}from"commander";var te=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function w(e){return t=>te?`${e}${t}\x1B[0m`:t}var p={bold:w("\x1B[1m"),dim:w("\x1B[2m"),green:w("\x1B[32m"),yellow:w("\x1B[33m"),cyan:w("\x1B[36m"),red:w("\x1B[31m")};function $(e){if(e==null)return!0;let t=typeof e;return t==="string"||t==="number"||t==="boolean"}function k(e){return e==null?"-":String(e)}function C(e,t=0){let n=" ".repeat(t);return $(e)?`${n}${k(e)}`:Array.isArray(e)?e.length===0?`${n}${p.dim("(empty)")}`:e.every($)?e.map(o=>`${n}- ${k(o)}`).join(`
4
4
  `):e.map(o=>{if(typeof o!="object"||o===null)return`${n}- ${k(o)}`;let s=Object.entries(o),a=[],[c,f]=s[0];$(f)?a.push(`${n}- ${p.bold(c)}: ${k(f)}`):(a.push(`${n}- ${p.bold(c)}:`),a.push(C(f,t+2)));for(let[d,g]of s.slice(1))$(g)?a.push(`${n} ${p.bold(d)}: ${k(g)}`):(a.push(`${n} ${p.bold(d)}:`),a.push(C(g,t+2)));return a.join(`
5
5
  `)}).join(`
6
6
 
7
7
  `):typeof e=="object"&&e!==null?Object.entries(e).map(([s,a])=>$(a)?`${n}${p.bold(s)}: ${k(a)}`:`${n}${p.bold(s)}:
8
8
  ${C(a,t+1)}`).join(`
9
- `):""}function te(e){if(typeof e!="object"||e===null)return e;let t=e;return"data"in t?t.data:"items"in t&&Array.isArray(t.items)&&Object.keys(t).filter(o=>o!=="items").length===0?t.items:e}function j(e,t){return t==="json"?JSON.stringify(e,null,2):C(te(e))}import{readFileSync as oe,writeFileSync as re,mkdirSync as se}from"fs";import{join as I}from"path";import{homedir as ie}from"os";var M=I(ie(),".config","moonpay"),z=I(M,"update-check.json"),ae=1440*60*1e3,ce=3e3;function le(){try{let e=oe(z,"utf-8");return JSON.parse(e)}catch{return null}}function ue(e){try{se(M,{recursive:!0}),re(z,JSON.stringify(e))}catch{}}function L(e,t){let n=e.split(".").map(Number),o=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]??0)>(o[s]??0))return!0;if((n[s]??0)<(o[s]??0))return!1}return!1}function D(e,t){return["",p.yellow(`Update available: ${e} \u2192 ${t}`),p.dim("Run `npm i -g @moonpay/cli` to update."),""].join(`
10
- `)}function U(e){let t=null,n=le();if(n&&Date.now()-n.checkedAt<ae)return L(n.latest,e)&&(t=D(e,n.latest)),()=>t;let o=new AbortController,s=setTimeout(()=>o.abort(),ce);return fetch("https://registry.npmjs.org/@moonpay%2fcli/latest",{signal:o.signal}).then(a=>a.json()).then(a=>{let c=a.version;c&&(ue({latest:c,checkedAt:Date.now()}),L(c,e)&&(t=D(e,c)))}).catch(()=>{}).finally(()=>clearTimeout(s)),()=>t}ee();async function Z(e){let t=e.wallet,n=e.chain;if(typeof t!="string"||typeof n!="string")return;let o=K(t);if(!o)return;let s;try{s=(await N.chain.retrieve({chain:n})).keyFamily}catch{return}let a=s==="evm"?"ethereum":s,c=o.addresses[a];c&&(e.wallet=c)}function q(e,t){let n=e[t];return typeof n=="string"&&n.length>0?n:void 0}function E(e){let t=e.code??e.status??e.statusCode;return typeof t=="string"||typeof t=="number"?t:void 0}function fe(e){try{return JSON.stringify(e)}catch{return}}function B(e){return e.length>0&&e!=="[object Object]"}function Y(e){let t=q(e,"message");if(t&&B(t))return t;let n=e.error??e.cause??e.response;if(n&&typeof n=="object"){let o=F(n);if(B(o.message))return o.message}return q(e,"errorMessage")}function F(e){if(e instanceof Error){let t=e,n=E(t),o=Y(t)??e.message;return n===void 0?{message:o}:{message:o,code:n}}if(typeof e=="string")return{message:e};if(e&&typeof e=="object"){let t=e,n=t.error;if(n&&typeof n=="object"){let a=F(n),c=a.code??E(t);return c===void 0?{message:a.message}:{...a,code:c}}let o=Y(t)??(typeof n=="string"&&n.length>0?n:void 0)??fe(e)??String(e),s=E(t);return s===void 0?{message:o}:{message:o,code:s}}return{message:String(e)}}function P(e,t){let n=F(e);return t==="json"?j({error:n},"json"):n.code===void 0?n.message:`${n.message} (code: ${n.code})`}var de=U(R),h=new me;h.name("moonpay").description(`MoonPay CLI \u2014 how agents move money
9
+ `):""}function oe(e){if(typeof e!="object"||e===null)return e;let t=e;return"data"in t?t.data:"items"in t&&Array.isArray(t.items)&&Object.keys(t).filter(o=>o!=="items").length===0?t.items:e}function j(e,t){return t==="json"?JSON.stringify(e,null,2):C(oe(e))}import{readFileSync as re,writeFileSync as se,mkdirSync as ie}from"fs";import{join as M}from"path";import{homedir as ae}from"os";var z=M(ae(),".config","moonpay"),U=M(z,"update-check.json"),ce=1440*60*1e3,le=3e3;function ue(){try{let e=re(U,"utf-8");return JSON.parse(e)}catch{return null}}function fe(e){try{ie(z,{recursive:!0}),se(U,JSON.stringify(e))}catch{}}function D(e,t){let n=e.split(".").map(Number),o=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]??0)>(o[s]??0))return!0;if((n[s]??0)<(o[s]??0))return!1}return!1}function I(e,t){return["",p.yellow(`Update available: ${e} \u2192 ${t}`),p.dim("Run `npm i -g @moonpay/cli` to update."),""].join(`
10
+ `)}function Z(e){let t=null,n=ue();if(n&&Date.now()-n.checkedAt<ce)return D(n.latest,e)&&(t=I(e,n.latest)),()=>t;let o=new AbortController,s=setTimeout(()=>o.abort(),le);return fetch("https://registry.npmjs.org/@moonpay%2fcli/latest",{signal:o.signal}).then(a=>a.json()).then(a=>{let c=a.version;c&&(fe({latest:c,checkedAt:Date.now()}),D(c,e)&&(t=I(e,c)))}).catch(()=>{}).finally(()=>clearTimeout(s)),()=>t}ne();async function q(e){let t=e.wallet,n=e.chain;if(typeof t!="string"||typeof n!="string")return;let o=x(t);if(!o)return;let s;try{s=(await N.chain.retrieve({chain:n})).keyFamily}catch{return}let a=T(s),c=o.addresses[a];c&&(e.wallet=c)}function B(e,t){let n=e[t];return typeof n=="string"&&n.length>0?n:void 0}function E(e){let t=e.code??e.status??e.statusCode;return typeof t=="string"||typeof t=="number"?t:void 0}function me(e){try{return JSON.stringify(e)}catch{return}}function Y(e){return e.length>0&&e!=="[object Object]"}function H(e){let t=B(e,"message");if(t&&Y(t))return t;let n=e.error??e.cause??e.response;if(n&&typeof n=="object"){let o=F(n);if(Y(o.message))return o.message}return B(e,"errorMessage")}function F(e){if(e instanceof Error){let t=e,n=E(t),o=H(t)??e.message;return n===void 0?{message:o}:{message:o,code:n}}if(typeof e=="string")return{message:e};if(e&&typeof e=="object"){let t=e,n=t.error;if(n&&typeof n=="object"){let a=F(n),c=a.code??E(t);return c===void 0?{message:a.message}:{...a,code:c}}let o=H(t)??(typeof n=="string"&&n.length>0?n:void 0)??me(e)??String(e),s=E(t);return s===void 0?{message:o}:{message:o,code:s}}return{message:String(e)}}function K(e,t){let n=F(e);return t==="json"?j({error:n},"json"):n.code===void 0?n.message:`${n.message} (code: ${n.code})`}var pe=Z(R),h=new de;h.name("moonpay").description(`MoonPay CLI \u2014 how agents move money
11
11
 
12
12
  Your agents need money. MoonPay gives them wallets, funds, and tools
13
13
  to buy, swap, bridge, and transact \u2014 all from the command line.
14
14
 
15
15
  Run \`mp skill install\` to install AI skills for Claude Code.
16
16
 
17
- `+x).version(R).option("--json","Output as JSON instead of YAML");function T(){return h.opts().json?"json":"yaml"}function H(e){console.log(j(e,T()))}function W(){let e=de();e&&process.stderr.write(e)}h.command("mcp").description("Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)").action(async()=>{let{startMcpServer:e}=await import("./mcp-75SVK4P4.js");await e()});h.command("serve").description("Local loopback mirror of agents.moonpay.com/api/tools \u2014 warm process for MoonAgents / UIs. GET /health \xB7 POST /api/tools/:tool").option("--port <port>","Port to bind (default 8787)",e=>Number(e),8787).option("--host <host>","Loopback host only (default 127.0.0.1)","127.0.0.1").option("--force","Bind even if something already answers on this port (skip idempotent check)",!1).action(async e=>{let{startServe:t}=await import("./serve-R2UKKD7A.js");try{await t({host:e.host,port:e.port,idempotent:!e.force})}catch(n){console.error(n instanceof Error?n.message:String(n)),process.exit(1)}});function G(e,t){let n=e;for(let o of t){let s=n.commands.find(a=>a.name()===o);s||(s=n.command(o)),n=s}return n}function V(e,t=""){let n=[];for(let[o,s]of Object.entries(e)){let a=t?`${t}-${o}`:o,c=s;for(;c._def.typeName==="ZodEffects";)c=c._def.schema;let f=c;f._def.typeName==="ZodNullable"&&(f=f._def.innerType),f._def.typeName==="ZodObject"&&f.shape?n.push(...V(f.shape,a)):n.push({flatKey:a,field:s,path:a.split("-")})}return n}function pe(e,t){let n={};for(let{flatKey:o,path:s}of t){let a=o.replace(/-([a-z])/g,(f,d)=>d.toUpperCase()),c=a in e?e[a]:e[o];if(s.length===1)n[s[0]]=c;else{let f=n;for(let d=0;d<s.length-1;d++)(!f[s[d]]||typeof f[s[d]]!="object")&&(f[s[d]]={}),f=f[s[d]];f[s[s.length-1]]=c}}return n}function ye(e,t){for(let n of t){let o=n.schema.name.split("_"),s=o.pop(),c=G(e,o).command(s).description(n.schema.description),f=n.schema.input.shape??{},d=V(f),g=[],b=[],_=[],O=[];for(let{flatKey:u,field:i}of d){let r=i.description??u,l=i;for(;l._def.typeName==="ZodEffects";)l=l._def.schema;let y=l._def.typeName,m=l;m._def.typeName==="ZodNullable"&&(m=m._def.innerType),m._def.typeName==="ZodNumber"&&b.push(u),m._def.typeName==="ZodRecord"&&_.push(u),m._def.typeName==="ZodBoolean"&&O.push(u),y==="ZodBoolean"?c.option(`--${u} [${u}]`,r,!1):y==="ZodNullable"?(c.option(`--${u} <${u}>`,r),g.push(u)):c.requiredOption(`--${u} <${u}>`,r)}c.action(async u=>{n.schema.name.startsWith("consent_")||await A.handler({});for(let r of g){let l=r.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());u[l]===void 0&&(u[l]=null)}for(let r of b){let l=r.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());u[l]!=null&&typeof u[l]=="string"&&(u[l]=Number(u[l]))}for(let r of O){let l=r.replace(/-([a-z])/g,(m,v)=>v.toUpperCase()),y=u[l];if(typeof y=="string"){let m=y.toLowerCase();m==="true"||m==="1"?u[l]=!0:(m==="false"||m==="0")&&(u[l]=!1)}}for(let r of _){let l=r.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());if(typeof u[l]=="string")try{u[l]=JSON.parse(u[l])}catch{console.error(`Invalid JSON for --${r}`),process.exit(1)}}let i=pe(u,d);try{let r=await n.handler(i);H(r)}catch(r){console.error(P(r,T())),process.exit(1)}})}}function ge(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function he(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function be(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function we(e){return Array.isArray(e.type)?e.type.some(t=>t==="number"||t==="integer"):e.anyOf?e.anyOf.some(t=>t.type==="number"||t.type==="integer"):e.type==="number"||e.type==="integer"}function ke(e){return Array.isArray(e.type)?e.type.includes("boolean"):e.anyOf?e.anyOf.some(t=>t.type==="boolean"):e.type==="boolean"}var Q=new Set(["swaps_transaction_build","swaps_quote_retrieve","transaction_register","virtual-account_offramp_initiate","prediction-market_position_buy","prediction-market_position_sell","prediction-market_position_redeem","commerce_cart_update","commerce_checkout_start","commerce_checkout_pay","card_delegation_approve_transaction_build","card_delegation_revoke_transaction_build","card_delegation_token_retrieve","card_wallet_link","card_wallet_unlink"]);function _e(e,t){for(let n of t){if(Q.has(n.name))continue;let o=n.name.split("_"),s=o.pop(),a=G(e,o);if(a.commands.find(i=>i.name()===s))continue;let c=a.command(s).description(n.description),f=ge(n.inputSchema),d=f.properties??{},g=new Set(f.required??[]),b=[],_=[],O=[],u=[];for(let[i,r]of Object.entries(d)){let l=r.description??i,y=he(r),m=be(r),v=we(r),X=ke(r);v&&_.push(i),X&&u.push(i),m?(O.push(i),g.has(i)&&!y?c.requiredOption(`--${i} <json>`,`${l} (as JSON)`):(c.option(`--${i} <json>`,`${l} (as JSON)`),b.push(i))):y||!g.has(i)?(c.option(`--${i} <${i}>`,l),b.push(i)):c.requiredOption(`--${i} <${i}>`,l)}c.action(async i=>{await A.handler({});for(let r of b)i[r]===void 0&&(i[r]=null);for(let r of _)i[r]!=null&&typeof i[r]=="string"&&(i[r]=Number(i[r]));for(let r of u)if(typeof i[r]=="string"){let l=i[r].toLowerCase();l==="true"||l==="1"?i[r]=!0:(l==="false"||l==="0")&&(i[r]=!1)}for(let r of O)if(typeof i[r]=="string")try{i[r]=JSON.parse(i[r])}catch{console.error(`Invalid JSON for --${r}`),process.exit(1)}try{await Z(i);let r=await N._call(n.name,i);H(r),W()}catch(r){console.error(P(r,T())),process.exit(1)}})}}ye(h,S);_e(h,J);h.command("tools").description("List available tools").action(()=>{let e=[...S.map(n=>({name:n.schema.name,description:n.schema.description})),...J.filter(n=>!S.some(o=>o.schema.name===n.name)&&!Q.has(n.name)).map(n=>({name:n.name,description:n.description}))].sort((n,o)=>n.name.localeCompare(o.name)),t=[];for(let n of e){let o=n.name.replace(/_/g," ");t.push(` ${p.green(o.padEnd(28))} ${p.dim(n.description)}`)}t.push(""),t.push(p.dim(`${e.length} tools`)),console.log(t.join(`
18
- `)),W()});h.parse();
17
+ `+L).version(R).option("--json","Output as JSON instead of YAML");function P(){return h.opts().json?"json":"yaml"}function W(e){console.log(j(e,P()))}function G(){let e=pe();e&&process.stderr.write(e)}h.command("mcp").description("Start MCP server over stdio (for Claude Desktop, Claude Code, etc.)").action(async()=>{let{startMcpServer:e}=await import("./mcp-VSTKEXYQ.js");await e()});h.command("serve").description("Local loopback mirror of agents.moonpay.com/api/tools \u2014 warm process for MoonAgents / UIs. GET /health \xB7 POST /api/tools/:tool").option("--port <port>","Port to bind (default 8787)",e=>Number(e),8787).option("--host <host>","Loopback host only (default 127.0.0.1)","127.0.0.1").option("--force","Bind even if something already answers on this port (skip idempotent check)",!1).action(async e=>{let{startServe:t}=await import("./serve-QZYJ6WAR.js");try{await t({host:e.host,port:e.port,idempotent:!e.force})}catch(n){console.error(n instanceof Error?n.message:String(n)),process.exit(1)}});function V(e,t){let n=e;for(let o of t){let s=n.commands.find(a=>a.name()===o);s||(s=n.command(o)),n=s}return n}function Q(e,t=""){let n=[];for(let[o,s]of Object.entries(e)){let a=t?`${t}-${o}`:o,c=s;for(;c._def.typeName==="ZodEffects";)c=c._def.schema;let f=c;f._def.typeName==="ZodNullable"&&(f=f._def.innerType),f._def.typeName==="ZodObject"&&f.shape?n.push(...Q(f.shape,a)):n.push({flatKey:a,field:s,path:a.split("-")})}return n}function ye(e,t){let n={};for(let{flatKey:o,path:s}of t){let a=o.replace(/-([a-z])/g,(f,d)=>d.toUpperCase()),c=a in e?e[a]:e[o];if(s.length===1)n[s[0]]=c;else{let f=n;for(let d=0;d<s.length-1;d++)(!f[s[d]]||typeof f[s[d]]!="object")&&(f[s[d]]={}),f=f[s[d]];f[s[s.length-1]]=c}}return n}function ge(e,t){for(let n of t){let o=n.schema.name.split("_"),s=o.pop(),c=V(e,o).command(s).description(n.schema.description),f=n.schema.input.shape??{},d=Q(f),g=[],b=[],_=[],O=[];for(let{flatKey:u,field:i}of d){let r=i.description??u,l=i;for(;l._def.typeName==="ZodEffects";)l=l._def.schema;let y=l._def.typeName,m=l;m._def.typeName==="ZodNullable"&&(m=m._def.innerType),m._def.typeName==="ZodNumber"&&b.push(u),m._def.typeName==="ZodRecord"&&_.push(u),m._def.typeName==="ZodBoolean"&&O.push(u),y==="ZodBoolean"?c.option(`--${u} [${u}]`,r,!1):y==="ZodNullable"?(c.option(`--${u} <${u}>`,r),g.push(u)):c.requiredOption(`--${u} <${u}>`,r)}c.action(async u=>{n.schema.name.startsWith("consent_")||await A.handler({});for(let r of g){let l=r.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());u[l]===void 0&&(u[l]=null)}for(let r of b){let l=r.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());u[l]!=null&&typeof u[l]=="string"&&(u[l]=Number(u[l]))}for(let r of O){let l=r.replace(/-([a-z])/g,(m,v)=>v.toUpperCase()),y=u[l];if(typeof y=="string"){let m=y.toLowerCase();m==="true"||m==="1"?u[l]=!0:(m==="false"||m==="0")&&(u[l]=!1)}}for(let r of _){let l=r.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());if(typeof u[l]=="string")try{u[l]=JSON.parse(u[l])}catch{console.error(`Invalid JSON for --${r}`),process.exit(1)}}let i=ye(u,d);try{let r=await n.handler(i);W(r)}catch(r){console.error(K(r,P())),process.exit(1)}})}}function he(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function be(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function we(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function ke(e){return Array.isArray(e.type)?e.type.some(t=>t==="number"||t==="integer"):e.anyOf?e.anyOf.some(t=>t.type==="number"||t.type==="integer"):e.type==="number"||e.type==="integer"}function _e(e){return Array.isArray(e.type)?e.type.includes("boolean"):e.anyOf?e.anyOf.some(t=>t.type==="boolean"):e.type==="boolean"}var X=new Set(["swaps_transaction_build","swaps_quote_retrieve","transaction_register","virtual-account_offramp_initiate","prediction-market_position_buy","prediction-market_position_sell","prediction-market_position_redeem","commerce_cart_update","commerce_checkout_start","commerce_checkout_pay","card_delegation_approve_transaction_build","card_delegation_revoke_transaction_build","card_delegation_token_retrieve","card_wallet_link","card_wallet_unlink"]);function Oe(e,t){for(let n of t){if(X.has(n.name))continue;let o=n.name.split("_"),s=o.pop(),a=V(e,o);if(a.commands.find(i=>i.name()===s))continue;let c=a.command(s).description(n.description),f=he(n.inputSchema),d=f.properties??{},g=new Set(f.required??[]),b=[],_=[],O=[],u=[];for(let[i,r]of Object.entries(d)){let l=r.description??i,y=be(r),m=we(r),v=ke(r),ee=_e(r);v&&_.push(i),ee&&u.push(i),m?(O.push(i),g.has(i)&&!y?c.requiredOption(`--${i} <json>`,`${l} (as JSON)`):(c.option(`--${i} <json>`,`${l} (as JSON)`),b.push(i))):y||!g.has(i)?(c.option(`--${i} <${i}>`,l),b.push(i)):c.requiredOption(`--${i} <${i}>`,l)}c.action(async i=>{await A.handler({});for(let r of b)i[r]===void 0&&(i[r]=null);for(let r of _)i[r]!=null&&typeof i[r]=="string"&&(i[r]=Number(i[r]));for(let r of u)if(typeof i[r]=="string"){let l=i[r].toLowerCase();l==="true"||l==="1"?i[r]=!0:(l==="false"||l==="0")&&(i[r]=!1)}for(let r of O)if(typeof i[r]=="string")try{i[r]=JSON.parse(i[r])}catch{console.error(`Invalid JSON for --${r}`),process.exit(1)}try{await q(i);let r=await N._call(n.name,i);W(r),G()}catch(r){console.error(K(r,P())),process.exit(1)}})}}ge(h,S);Oe(h,J);h.command("tools").description("List available tools").action(()=>{let e=[...S.map(n=>({name:n.schema.name,description:n.schema.description})),...J.filter(n=>!S.some(o=>o.schema.name===n.name)&&!X.has(n.name)).map(n=>({name:n.name,description:n.description}))].sort((n,o)=>n.name.localeCompare(o.name)),t=[];for(let n of e){let o=n.name.replace(/_/g," ");t.push(` ${p.green(o.padEnd(28))} ${p.dim(n.description)}`)}t.push(""),t.push(p.dim(`${e.length} tools`)),console.log(t.join(`
18
+ `)),G()});h.parse();
@@ -7,6 +7,6 @@ Run: npm i -g @moonpay/cli --include=optional`;function y(){try{let e=S("@ledger
7
7
  `),p}async function U(){if(!p)return null;try{let e=y(),i=f().getDeviceSessionState({sessionId:p}),s=await e.firstValueFrom(i.pipe(e.take(1),e.timeout(3e3)));return s.sessionStateType>=1?s.currentApp?.name??null:null}catch{return null}}var M={evm:"Ethereum",solana:"Solana"};function _(e){let n=String(e);return n.includes("6807")||n.includes("6a15")||n.includes("UnknownDeviceExchangeError")}async function C(e){process.stderr.write(`Installing ${e} app on your Ledger...
8
8
  `);let{OpenAppWithDependenciesDeviceAction:n}=y(),i=new n({input:{appName:e}}),t=f().executeDeviceAction({sessionId:E(),deviceAction:i});await m(t,`Install ${e}`,18e4),process.stderr.write(`Installed ${e} app
9
9
  `)}async function R(e){let n=M[e];if(!n||await U()===n)return;process.stderr.write(`Opening ${n} app on your Ledger...
10
- `);let{OpenAppDeviceAction:s}=y(),t=new s({input:{appName:n}}),u=f().executeDeviceAction({sessionId:E(),deviceAction:t});try{await m(u,`Open ${n}`)}catch(c){if(_(c)){await D(),await C(n),await D();return}if(!String(c).includes("isconnect"))throw c}await D()}async function D(){try{await f().disconnect({sessionId:p})}catch{}p=null,await new Promise(e=>setTimeout(e,500)),await P()}function $(e,n=0){switch(e){case"evm":return`44'/60'/${n}'/0/0`;case"solana":return`44'/501'/${n}'/0'`;default:throw new Error(`${e} derivation via Ledger is not supported.`)}}function k(e){return e.startsWith("0x")?e.slice(2):e}function T(e){return e.startsWith("0x")?e:`0x${e}`}async function x(e){let{moonpay:n}=await import("./client-5QPGA6M7.js"),s=(await n.chain.retrieve({chain:e})).keyFamily;if(s==="bitcoin")throw new Error("Bitcoin address derivation via Ledger is not yet supported.");if(s==="tron")throw new Error("Tron address derivation via Ledger is not supported. The Ethereum signer cannot interact with the Tron Ledger app.");await R(s);let t=$(s),a=E(),u=f();switch(s){case"evm":{let{SignerEthBuilder:c}=I(),l=new c({dmk:u,sessionId:a}).build().getAddress(t,{skipOpenApp:!1});return(await m(l,"Get Ethereum address")).address}case"solana":{let{SignerSolanaBuilder:c}=L(),l=new c({dmk:u,sessionId:a}).build().getAddress(t,{skipOpenApp:!1});return await m(l,"Get Solana address")}default:throw new Error(`Ledger address derivation not supported for ${s}`)}}async function F(){let e={};try{e.ethereum=await x("ethereum")}catch(n){process.stderr.write(`Failed to get Ethereum address: ${n}
10
+ `);let{OpenAppDeviceAction:s}=y(),t=new s({input:{appName:n}}),u=f().executeDeviceAction({sessionId:E(),deviceAction:t});try{await m(u,`Open ${n}`)}catch(c){if(_(c)){await D(),await C(n),await D();return}if(!String(c).includes("isconnect"))throw c}await D()}async function D(){try{await f().disconnect({sessionId:p})}catch{}p=null,await new Promise(e=>setTimeout(e,500)),await P()}function $(e,n=0){switch(e){case"evm":return`44'/60'/${n}'/0/0`;case"solana":return`44'/501'/${n}'/0'`;default:throw new Error(`${e} derivation via Ledger is not supported.`)}}function k(e){return e.startsWith("0x")?e.slice(2):e}function T(e){return e.startsWith("0x")?e:`0x${e}`}async function x(e){let{moonpay:n}=await import("./client-FUI7M7H5.js"),s=(await n.chain.retrieve({chain:e})).keyFamily;if(s==="bitcoin")throw new Error("Bitcoin address derivation via Ledger is not yet supported.");if(s==="tron")throw new Error("Tron address derivation via Ledger is not supported. The Ethereum signer cannot interact with the Tron Ledger app.");await R(s);let t=$(s),a=E(),u=f();switch(s){case"evm":{let{SignerEthBuilder:c}=I(),l=new c({dmk:u,sessionId:a}).build().getAddress(t,{skipOpenApp:!1});return(await m(l,"Get Ethereum address")).address}case"solana":{let{SignerSolanaBuilder:c}=L(),l=new c({dmk:u,sessionId:a}).build().getAddress(t,{skipOpenApp:!1});return await m(l,"Get Solana address")}default:throw new Error(`Ledger address derivation not supported for ${s}`)}}async function F(){let e={};try{e.ethereum=await x("ethereum")}catch(n){process.stderr.write(`Failed to get Ethereum address: ${n}
11
11
  `)}try{e.solana=await x("solana")}catch(n){process.stderr.write(`Failed to get Solana address: ${n}
12
- `)}if(!e.ethereum&&!e.solana)throw new Error("Could not derive any addresses from Ledger device");return e}async function H(e,n){let{moonpay:i}=await import("./client-5QPGA6M7.js"),t=(await i.chain.retrieve({chain:e})).keyFamily;if(t==="bitcoin")throw new Error("Bitcoin transaction signing via Ledger is not yet supported. Use a software wallet for Bitcoin transactions.");if(t==="tron")throw new Error("Tron transaction signing via Ledger is not supported. Use a software wallet for Tron transactions.");await R(t);let a=$(t),u=E(),c=f();switch(t){case"evm":{let{SignerEthBuilder:d}=I(),l=new d({dmk:c,sessionId:u}).build(),w=T(n.startsWith("0x")?n:Buffer.from(n,"base64").toString("hex")),o=Uint8Array.from(Buffer.from(k(w),"hex")),r=l.signTransaction(a,o,{skipOpenApp:!1}),g=await m(r,"Sign transaction"),{parseTransaction:v,serializeTransaction:A}=await import("viem"),B=v(w);return{transaction:A(B,{r:T(k(g.r)),s:T(k(g.s)),v:BigInt(g.v)})}}case"solana":{let{SignerSolanaBuilder:d}=L(),l=new d({dmk:c,sessionId:u}).build(),{VersionedTransaction:w}=await import("@solana/web3.js"),o=Uint8Array.from(Buffer.from(n,"base64")),r=w.deserialize(o),g=r.message.serialize(),v=l.signTransaction(a,g,{skipOpenApp:!1}),A=await m(v,"Sign Solana transaction");return r.signatures[0]=A,{transaction:Buffer.from(r.serialize()).toString("base64")}}default:throw new Error(`Ledger transaction signing not supported for ${t}`)}}async function V(e,n){let{moonpay:i}=await import("./client-5QPGA6M7.js"),t=(await i.chain.retrieve({chain:e})).keyFamily;if(t==="bitcoin")throw new Error("Bitcoin message signing via Ledger is not yet supported. Use a software wallet for Bitcoin message signing.");if(t==="tron")throw new Error("Tron message signing via Ledger is not supported. Use a software wallet for Tron message signing.");await R(t);let a=$(t),u=E(),c=f();switch(t){case"evm":{let{SignerEthBuilder:d}=I(),w=new d({dmk:c,sessionId:u}).build().signMessage(a,n,{skipOpenApp:!1}),o=await m(w,"Sign message"),r=k(o.r),g=k(o.s),v=o.v.toString(16).padStart(2,"0");return{signature:`0x${r}${g}${v}`}}case"solana":{let{SignerSolanaBuilder:d}=L(),l=new d({dmk:c,sessionId:u}).build(),w=Buffer.from(n,"utf8").toString("hex"),o=l.signMessage(a,w,{skipOpenApp:!1}),r=await m(o,"Sign Solana message");return{signature:(await import("bs58")).default.encode(r)}}default:throw new Error(`Ledger message signing not supported for ${t}`)}}async function q(){if(p){try{await f().disconnect({sessionId:p})}catch{}p=null}if(h){try{h.close()}catch{}h=null}}export{P as connectLedger,q as disconnectLedger,x as ledgerGetAddress,F as ledgerGetAllAddresses,V as ledgerSignMessage,H as ledgerSignTransaction};
12
+ `)}if(!e.ethereum&&!e.solana)throw new Error("Could not derive any addresses from Ledger device");return e}async function H(e,n){let{moonpay:i}=await import("./client-FUI7M7H5.js"),t=(await i.chain.retrieve({chain:e})).keyFamily;if(t==="bitcoin")throw new Error("Bitcoin transaction signing via Ledger is not yet supported. Use a software wallet for Bitcoin transactions.");if(t==="tron")throw new Error("Tron transaction signing via Ledger is not supported. Use a software wallet for Tron transactions.");await R(t);let a=$(t),u=E(),c=f();switch(t){case"evm":{let{SignerEthBuilder:d}=I(),l=new d({dmk:c,sessionId:u}).build(),w=T(n.startsWith("0x")?n:Buffer.from(n,"base64").toString("hex")),o=Uint8Array.from(Buffer.from(k(w),"hex")),r=l.signTransaction(a,o,{skipOpenApp:!1}),g=await m(r,"Sign transaction"),{parseTransaction:v,serializeTransaction:A}=await import("viem"),B=v(w);return{transaction:A(B,{r:T(k(g.r)),s:T(k(g.s)),v:BigInt(g.v)})}}case"solana":{let{SignerSolanaBuilder:d}=L(),l=new d({dmk:c,sessionId:u}).build(),{VersionedTransaction:w}=await import("@solana/web3.js"),o=Uint8Array.from(Buffer.from(n,"base64")),r=w.deserialize(o),g=r.message.serialize(),v=l.signTransaction(a,g,{skipOpenApp:!1}),A=await m(v,"Sign Solana transaction");return r.signatures[0]=A,{transaction:Buffer.from(r.serialize()).toString("base64")}}default:throw new Error(`Ledger transaction signing not supported for ${t}`)}}async function V(e,n){let{moonpay:i}=await import("./client-FUI7M7H5.js"),t=(await i.chain.retrieve({chain:e})).keyFamily;if(t==="bitcoin")throw new Error("Bitcoin message signing via Ledger is not yet supported. Use a software wallet for Bitcoin message signing.");if(t==="tron")throw new Error("Tron message signing via Ledger is not supported. Use a software wallet for Tron message signing.");await R(t);let a=$(t),u=E(),c=f();switch(t){case"evm":{let{SignerEthBuilder:d}=I(),w=new d({dmk:c,sessionId:u}).build().signMessage(a,n,{skipOpenApp:!1}),o=await m(w,"Sign message"),r=k(o.r),g=k(o.s),v=o.v.toString(16).padStart(2,"0");return{signature:`0x${r}${g}${v}`}}case"solana":{let{SignerSolanaBuilder:d}=L(),l=new d({dmk:c,sessionId:u}).build(),w=Buffer.from(n,"utf8").toString("hex"),o=l.signMessage(a,w,{skipOpenApp:!1}),r=await m(o,"Sign Solana message");return{signature:(await import("bs58")).default.encode(r)}}default:throw new Error(`Ledger message signing not supported for ${t}`)}}async function q(){if(p){try{await f().disconnect({sessionId:p})}catch{}p=null}if(h){try{h.close()}catch{}h=null}}export{P as connectLedger,q as disconnectLedger,x as ledgerGetAddress,F as ledgerGetAllAddresses,V as ledgerSignMessage,H as ledgerSignTransaction};
@@ -1,2 +1,2 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{a,c,d as i}from"./chunk-KTZAW4JJ.js";import"./chunk-OV5GCWKP.js";import"./chunk-NVX42CFU.js";import"./chunk-PIM4IRDV.js";import{e as s,g as u}from"./chunk-PUJF4VUX.js";import"./chunk-LMDE72OE.js";u();import{Server as f}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as S}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as g,ListToolsRequestSchema as y}from"@modelcontextprotocol/sdk/types.js";async function v(){let o=new f({name:"moonpay",version:s},{capabilities:{tools:{listChanged:!0}}}),r=a(),m=new Map(r.map(t=>[t.name,t]));o.setRequestHandler(y,async()=>({tools:r.map(t=>({name:t.name,description:t.description,inputSchema:t.inputSchema}))})),o.setRequestHandler(g,async t=>{let{name:n,arguments:l={}}=t.params;if(!m.has(n))return{content:[{type:"text",text:`Unknown tool: ${n}`}],isError:!0};try{let e=await i(n,l);return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}catch(e){return{content:[{type:"text",text:e instanceof c||e instanceof Error?e.message:String(e)}],isError:!0}}});let p=new S;await o.connect(p)}export{v as startMcpServer};
2
+ import{a,c,d as i}from"./chunk-ZGYCUONO.js";import"./chunk-YISNOURG.js";import"./chunk-FTVZIAK6.js";import"./chunk-5BWEUVPG.js";import{e as s,g as u}from"./chunk-YGSFMURK.js";import"./chunk-LMDE72OE.js";u();import{Server as f}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as S}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as g,ListToolsRequestSchema as y}from"@modelcontextprotocol/sdk/types.js";async function v(){let o=new f({name:"moonpay",version:s},{capabilities:{tools:{listChanged:!0}}}),r=a(),m=new Map(r.map(t=>[t.name,t]));o.setRequestHandler(y,async()=>({tools:r.map(t=>({name:t.name,description:t.description,inputSchema:t.inputSchema}))})),o.setRequestHandler(g,async t=>{let{name:n,arguments:l={}}=t.params;if(!m.has(n))return{content:[{type:"text",text:`Unknown tool: ${n}`}],isError:!0};try{let e=await i(n,l);return{content:[{type:"text",text:JSON.stringify(e,null,2)}]}}catch(e){return{content:[{type:"text",text:e instanceof c||e instanceof Error?e.message:String(e)}],isError:!0}}});let p=new S;await o.connect(p)}export{v as startMcpServer};
@@ -1,5 +1,5 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{b as v,c as g,d as y}from"./chunk-KTZAW4JJ.js";import"./chunk-OV5GCWKP.js";import"./chunk-NVX42CFU.js";import"./chunk-PIM4IRDV.js";import{e as d,g as E,h as S,p as O}from"./chunk-PUJF4VUX.js";import"./chunk-LMDE72OE.js";E();import{createServer as b}from"http";import{writeFileSync as k,unlinkSync as R,readFileSync as M,existsSync as $}from"fs";import{join as N}from"path";import{homedir as A}from"os";O();var h="127.0.0.1",x=8787,m=N(A(),".config","moonpay","serve.json"),f="/api/tools";function w(e){let t=e.trim().replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function I(e,t){let r=w(e),s=w(t);if(!r||!s)return!0;for(let i=0;i<3;i++){if(r[i]<s[i])return!0;if(r[i]>s[i])return!1}return!1}function J(e){if(!(!Number.isFinite(e)||e<=0))try{process.kill(e,"SIGTERM")}catch{}}function _(e){S(),k(m,JSON.stringify(e,null,2)+`
2
+ import{b as v,c as g,d as y}from"./chunk-ZGYCUONO.js";import"./chunk-YISNOURG.js";import"./chunk-FTVZIAK6.js";import"./chunk-5BWEUVPG.js";import{e as d,g as E,h as S,p as O}from"./chunk-YGSFMURK.js";import"./chunk-LMDE72OE.js";E();import{createServer as b}from"http";import{writeFileSync as k,unlinkSync as R,readFileSync as M,existsSync as $}from"fs";import{join as N}from"path";import{homedir as A}from"os";O();var h="127.0.0.1",x=8787,m=N(A(),".config","moonpay","serve.json"),f="/api/tools";function w(e){let t=e.trim().replace(/^v/,"").match(/^(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function I(e,t){let r=w(e),s=w(t);if(!r||!s)return!0;for(let i=0;i<3;i++){if(r[i]<s[i])return!0;if(r[i]>s[i])return!1}return!1}function J(e){if(!(!Number.isFinite(e)||e<=0))try{process.kill(e,"SIGTERM")}catch{}}function _(e){S(),k(m,JSON.stringify(e,null,2)+`
3
3
  `,{encoding:"utf-8",mode:384})}function j(){try{$(m)&&R(m)}catch{}}function z(){try{return JSON.parse(M(m,"utf-8"))}catch{return null}}async function L(e){let t=[];for await(let s of e)t.push(typeof s=="string"?Buffer.from(s):s);if(t.length===0)return{};let r=Buffer.concat(t).toString("utf-8").trim();return r?JSON.parse(r):{}}function l(e,t,r){let s=JSON.stringify(r);e.writeHead(t,{"Content-Type":"application/json; charset=utf-8","Content-Length":Buffer.byteLength(s)}),e.end(s)}async function B(e,t,r=500){let s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let u=await fetch(`http://${e}:${t}/health`,{signal:s.signal});if(!u.ok)return null;let a=await u.json();return a.ok?{pid:typeof a.pid=="number"?a.pid:-1,host:e,port:t,startedAt:typeof a.startedAt=="string"?a.startedAt:"",version:typeof a.version=="string"?a.version:"",toolsPath:typeof a.toolsPath=="string"?a.toolsPath:void 0}:null}catch{return null}finally{clearTimeout(i)}}async function P(e,t,r){let s=e.headers.host??`${h}`,i=new URL(e.url||"/",`http://${s}`),u=(e.method||"GET").toUpperCase();if(u==="GET"&&i.pathname==="/health"){l(t,200,{ok:!0,version:d,pid:process.pid,startedAt:r,toolsPath:f});return}let a=i.pathname.match(/^\/api\/tools\/([a-z0-9_]+)$/i);if(u==="POST"&&a){let c=a[1];if(!v(c)){l(t,404,{error:`Unknown tool: ${c}`,tool:c});return}let n={};try{let o=await L(e);if(o&&typeof o=="object"&&!Array.isArray(o))n=o;else if(o!=null){l(t,400,{error:"Body must be a JSON object"});return}}catch{l(t,400,{error:"Invalid JSON body"});return}try{let o=await y(c,n);l(t,200,o);return}catch(o){if(o instanceof g){l(t,404,{error:o.message,tool:c});return}let p=o instanceof Error?o.message:String(o);l(t,500,{error:p,tool:c});return}}l(t,404,{error:"Not found",hint:"GET /health or POST /api/tools/:tool"})}async function K(e={}){let t=e.host??h,r=e.port??x,s=e.idempotent!==!1;if(t!=="127.0.0.1"&&t!=="localhost"&&t!=="::1")throw new Error(`mp serve refuses non-loopback host '${t}' \u2014 bind 127.0.0.1 only`);if(s){let n=await B(t,r);if(n){let o=n.toolsPath===f,p=!I(n.version,d);if(o&&p)return process.stdout.write(JSON.stringify({ok:!0,alreadyRunning:!0,host:t,port:r,pid:n.pid,version:n.version,toolsPath:n.toolsPath},null,2)+`
4
4
  `),{host:t,port:r};process.stderr.write(`[mp serve] replacing incompatible daemon pid=${n.pid} v${n.version||"?"} toolsPath=${n.toolsPath??"\u2205"} \u2192 v${d}
5
5
  `),J(n.pid),await new Promise(T=>setTimeout(T,200))}}let i=new Date().toISOString(),u=b((n,o)=>{P(n,o,i).catch(p=>{l(o,500,{error:p instanceof Error?p.message:String(p)})})});await new Promise((n,o)=>{u.once("error",o),u.listen(r,t,()=>n())});let a={pid:process.pid,host:t,port:r,startedAt:i,version:d};_(a);let c=()=>{j(),u.close(()=>process.exit(0))};return process.once("SIGINT",c),process.once("SIGTERM",c),process.stdout.write(JSON.stringify({ok:!0,alreadyRunning:!1,host:t,port:r,pid:process.pid,version:d,endpoints:{health:`http://${t}:${r}/health`,tools:`http://${t}:${r}${f}/:tool`},toolsPath:f},null,2)+`
@@ -1,2 +1,2 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{A as v,B as w,f as a,g as b,h as c,i as d,j as e,k as f,l as g,m as h,n as i,o as j,p as k,q as l,r as m,s as n,t as o,u as p,v as q,w as r,x as s,y as t,z as u}from"./chunk-PIM4IRDV.js";import"./chunk-PUJF4VUX.js";import"./chunk-LMDE72OE.js";export{m as addHardwareWallet,u as addWallet,d as createWallet,j as deleteWallet,l as exportSecret,h as findWallet,i as findWalletOrThrow,a as getVaultPath,e as importMnemonic,f as importPrivateKey,g as listWallets,s as loadWallets,c as migrateWallets,w as mutateWallets,p as owsSignMessage,o as owsSignTransaction,q as owsSignTypedData,n as refreshHardwareAddresses,t as removeWallet,k as renameWallet,b as requireMigrationCheck,r as resolveSigningKey,v as saveWallets};
2
+ import{A as u,B as v,C as w,g as a,h as b,i as c,j as d,k as e,l as f,m as g,n as h,o as i,p as j,q as k,r as l,s as m,t as n,u as o,v as p,w as q,x as r,y as s,z as t}from"./chunk-5BWEUVPG.js";import"./chunk-YGSFMURK.js";import"./chunk-LMDE72OE.js";export{m as addHardwareWallet,u as addWallet,d as createWallet,j as deleteWallet,l as exportSecret,h as findWallet,i as findWalletOrThrow,a as getVaultPath,e as importMnemonic,f as importPrivateKey,g as listWallets,s as loadWallets,c as migrateWallets,w as mutateWallets,p as owsSignMessage,o as owsSignTransaction,q as owsSignTypedData,n as refreshHardwareAddresses,t as removeWallet,k as renameWallet,b as requireMigrationCheck,r as resolveSigningKey,v as saveWallets};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonpay/cli",
3
- "version": "1.93.2",
3
+ "version": "1.94.1",
4
4
  "description": "MoonPay CLI — how agents move money",
5
5
  "homepage": "https://agents.moonpay.com",
6
6
  "publishConfig": {
@@ -96,7 +96,7 @@ Get token addresses from: `mp token search --query "USDC" --chain solana`
96
96
  `mp buy` returns a checkout URL. Open it directly:
97
97
 
98
98
  ```bash
99
- URL=$(mp --json buy --token sol --amount 1 --wallet <addr> --email <email> | jq -r '.url')
99
+ URL=$(mp --json buy --token SOL --chain solana --amount 1 --wallet <addr> --email <email> | jq -r '.url')
100
100
  open "$URL"
101
101
  ```
102
102
 
@@ -8,34 +8,54 @@ tags: [trading]
8
8
 
9
9
  ## Goal
10
10
 
11
- Generate a MoonPay checkout URL for buying crypto with a credit card or bank transfer. The user completes the purchase in their browser.
11
+ Generate a MoonPay checkout URL for buying crypto with a credit card or bank transfer. The CLI opens the URL in the browser; the user completes the purchase there.
12
12
 
13
13
  ## Command
14
14
 
15
15
  ```bash
16
16
  mp buy \
17
- --token <currency-code> \
17
+ --token <symbol> \
18
+ --chain <chain> \
18
19
  --amount <usd-amount> \
19
- --wallet <destination-address> \
20
+ --wallet <wallet-name-or-address> \
20
21
  --email <buyer-email>
21
22
  ```
22
23
 
24
+ `--token` and `--chain` are case-insensitive. `--wallet` accepts a local wallet name (`main`) or a raw address. `--email` is optional when logged in (uses the account email).
25
+
26
+ Legacy MoonPay currency codes still work: `mp buy --token usdc_sol --amount 50 --wallet <address>`.
27
+
28
+ ## Examples
29
+
30
+ ```bash
31
+ # $50 of USDC on Solana into the local "main" wallet
32
+ mp buy --token USDC --chain solana --amount 50 --wallet main
33
+
34
+ # $20 of SOL (native) — same idea
35
+ mp buy --token SOL --chain solana --amount 20 --wallet main
36
+
37
+ # USDG on Robinhood Chain
38
+ mp buy --token USDG --chain robinhood --amount 50 --wallet main
39
+
40
+ # Legacy currency code (no --chain needed with a raw address)
41
+ mp buy --token usdc_sol --amount 50 --wallet 7CSe8MXkTRRZ7ovwjvNqzZxomeXqHwTDV3SR4hgQpump
42
+ ```
43
+
23
44
  ## Supported tokens
24
45
 
25
- `btc`, `sol`, `eth`, `trx`, `pol_polygon`, `usdc`, `usdc_sol`, `usdc_base`, `usdc_arbitrum`, `usdc_optimism`, `usdc_polygon`, `usdt_trx`, `eth_polygon`, `eth_optimism`, `eth_base`, `eth_arbitrum`
46
+ Not a fixed allowlist any crypto MoonPay lists works (checked live). Common ones:
26
47
 
27
- ## Example flow
48
+ - **solana**: SOL, USDC, USDT, …
49
+ - **ethereum / base / arbitrum / …**: ETH, USDC, …
50
+ - **robinhood**: ETH, USDG
28
51
 
29
- 1. User: "I want to buy $50 of SOL with my credit card."
30
- 2. Run: `mp buy --token sol --amount 50 --wallet <address> --email user@example.com`
31
- 3. Open the returned checkout URL in the user's browser so they can complete the purchase.
52
+ For arbitrary / DeFi tokens not listed on MoonPay CeFi buy, use `mp gateway search` then `mp gateway buy`.
32
53
 
33
54
  ## Notes
34
55
 
35
56
  - This is fiat-to-crypto (credit card / bank), not a token swap.
36
57
  - For token-to-token swaps, use the **moonpay-swap-tokens** skill instead.
37
- - The `--amount` flag is in USD (e.g. `--amount 50` = $50 worth of the token).
38
- - The `--token` flag uses MoonPay currency codes, not mint addresses.
58
+ - `--amount` is in USD (e.g. `--amount 50` = $50 worth of the token).
39
59
  - The checkout URL handles KYC and payment processing.
40
60
 
41
61
  ## Related skills
@@ -80,7 +80,7 @@ If the wallet already has POL and pUSD, they're set.
80
80
  Buy POL directly with fiat — easiest way to get gas on Polygon:
81
81
 
82
82
  ```bash
83
- mp buy --token pol_polygon --amount 5 --wallet <polymarket-address> --email <email>
83
+ mp buy --token POL --chain polygon --amount 5 --wallet <polymarket-address> --email <email>
84
84
  ```
85
85
 
86
86
  Alternatively, bridge ETH → POL if the user already has ETH:
@@ -50,7 +50,7 @@ Confirm the user is authed and `funded-sol` exists. If not, fall back to whateve
50
50
  **On yes:**
51
51
 
52
52
  ```bash
53
- mp buy --token usdc --amount 50 --wallet GmmrYv28CQhKjJsPcpHZuspfJSKcDwGdECeYdiDLfW12 --email <user-email>
53
+ mp buy --token USDC --chain solana --amount 50 --wallet GmmrYv28CQhKjJsPcpHZuspfJSKcDwGdECeYdiDLfW12 --email <user-email>
54
54
  ```
55
55
 
56
56
  This returns a checkout URL. Open it (the desktop app intercepts the click; in CLI use `open "<url>"`).