@moonpay/cli 1.96.3 → 1.96.5

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.
@@ -0,0 +1,2 @@
1
+ process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
+ import{a as m,d as c,g as p,h as d}from"./chunk-L2QRHYWF.js";import{b as u}from"./chunk-7U53PGWA.js";import{zodToJsonSchema as y}from"zod-to-json-schema";var i=new Map(p.map(o=>[o.schema.name,o]));function g(o){let e=o.inputSchema;if(e.$ref&&e.definitions){let n=e.$ref.replace("#/definitions/","");return e.definitions[n]??e}return e}function T(){let o=p.map(n=>({name:n.schema.name,description:n.schema.description,inputSchema:c(y(n.schema.input))})),e=new Map;for(let n of m){if(i.has(n.name))continue;let r=g(n),t=c({type:"object",properties:r.properties??{},...r.required?{required:r.required}:{},...r.additionalProperties!==void 0?{additionalProperties:r.additionalProperties}:{}});e.set(n.name,t.properties??{}),o.push({name:n.name,description:n.description,inputSchema:t})}return{toolDefs:o,toolDefMap:new Map(o.map(n=>[n.name,n])),remotePropsMap:e}}var a=T();function O(){return a.toolDefs.filter(o=>i.has(o.name)||!d.has(o.name))}function x(o){return a.toolDefMap.has(o)}function w(o,e){let n=i.get(o);if(!n)return e;let r=n.schema.input.shape??{};for(let[t,f]of Object.entries(r))e[t]===void 0&&f._def.typeName==="ZodNullable"&&(e[t]=null);return e}function D(o,e){let n=a.remotePropsMap.get(o)??{};for(let[r,t]of Object.entries(n))e[r]===void 0&&(Array.isArray(t.type)?t.type.includes("null"):t.anyOf?.some(h=>h.type==="null"))&&(e[r]=null),(t.type==="number"||t.type==="integer"||Array.isArray(t.type)&&t.type.some(s=>s==="number"||s==="integer")||t.anyOf?.some(s=>s.type==="number"||s.type==="integer"))&&typeof e[r]=="string"&&(e[r]=Number(e[r]));return e}var l=class extends Error{constructor(e){super(`Unknown tool: ${e}`),this.name="UnknownToolError"}};async function N(o,e={}){if(!a.toolDefMap.has(o))throw new l(o);let n=i.get(o);if(n){let t=w(o,{...e});return n.handler(t)}let r=D(o,{...e});return u._call(o,r)}export{O as a,x as b,l as c,N 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-GM6O5MIA.js";import"./chunk-PG4E65EW.js";import"./chunk-LMDE72OE.js";export{a as moonpay,b as resetClient};
2
+ import{b as a,c as b}from"./chunk-7U53PGWA.js";import"./chunk-JMUBF7HA.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 T,b,c as L,e as M,f as J,g as j}from"./chunk-TCAKAVDX.js";import{b as C}from"./chunk-GM6O5MIA.js";import{a as I,n as D}from"./chunk-3KDOEO2V.js";import{e as E,g as oe}from"./chunk-PG4E65EW.js";import"./chunk-LMDE72OE.js";import{Command as ye}from"commander";var re=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function _(e){return t=>re?`${e}${t}\x1B[0m`:t}var p={bold:_("\x1B[1m"),dim:_("\x1B[2m"),green:_("\x1B[32m"),yellow:_("\x1B[33m"),cyan:_("\x1B[36m"),red:_("\x1B[31m")};function S(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 v(e,t=0){let n=" ".repeat(t);return S(e)?`${n}${k(e)}`:Array.isArray(e)?e.length===0?`${n}${p.dim("(empty)")}`:e.every(S)?e.map(r=>`${n}- ${k(r)}`).join(`
4
- `):e.map(r=>{if(typeof r!="object"||r===null)return`${n}- ${k(r)}`;let s=Object.entries(r),i=[],[a,f]=s[0];S(f)?i.push(`${n}- ${p.bold(a)}: ${k(f)}`):(i.push(`${n}- ${p.bold(a)}:`),i.push(v(f,t+2)));for(let[d,g]of s.slice(1))S(g)?i.push(`${n} ${p.bold(d)}: ${k(g)}`):(i.push(`${n} ${p.bold(d)}:`),i.push(v(g,t+2)));return i.join(`
3
+ import{a as T,b,c as I,e as z,f as J,g as _,h as P}from"./chunk-L2QRHYWF.js";import{b as j}from"./chunk-7U53PGWA.js";import{a as D,m as M}from"./chunk-HSM3UOD2.js";import{f as E,h as oe}from"./chunk-JMUBF7HA.js";import"./chunk-LMDE72OE.js";import{Command as ye}from"commander";var re=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function O(e){return t=>re?`${e}${t}\x1B[0m`:t}var p={bold:O("\x1B[1m"),dim:O("\x1B[2m"),green:O("\x1B[32m"),yellow:O("\x1B[33m"),cyan:O("\x1B[36m"),red:O("\x1B[31m")};function C(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 R(e,t=0){let n=" ".repeat(t);return C(e)?`${n}${k(e)}`:Array.isArray(e)?e.length===0?`${n}${p.dim("(empty)")}`:e.every(C)?e.map(r=>`${n}- ${k(r)}`).join(`
4
+ `):e.map(r=>{if(typeof r!="object"||r===null)return`${n}- ${k(r)}`;let s=Object.entries(r),i=[],[a,l]=s[0];C(l)?i.push(`${n}- ${p.bold(a)}: ${k(l)}`):(i.push(`${n}- ${p.bold(a)}:`),i.push(R(l,t+2)));for(let[d,g]of s.slice(1))C(g)?i.push(`${n} ${p.bold(d)}: ${k(g)}`):(i.push(`${n} ${p.bold(d)}:`),i.push(R(g,t+2)));return i.join(`
5
5
  `)}).join(`
6
6
 
7
- `):typeof e=="object"&&e!==null?Object.entries(e).map(([s,i])=>S(i)?`${n}${p.bold(s)}: ${k(i)}`:`${n}${p.bold(s)}:
8
- ${v(i,t+1)}`).join(`
9
- `):""}function se(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(r=>r!=="items").length===0?t.items:e}function R(e,t){return t==="json"?JSON.stringify(e,null,2):v(se(e))}import{readFileSync as ie,writeFileSync as ae,mkdirSync as ce}from"fs";import{join as Z}from"path";import{homedir as le}from"os";var q=Z(le(),".config","moonpay"),Y=Z(q,"update-check.json"),fe=1440*60*1e3,ue=3e3;function me(){try{let e=ie(Y,"utf-8");return JSON.parse(e)}catch{return null}}function de(e){try{ce(q,{recursive:!0}),ae(Y,JSON.stringify(e))}catch{}}function z(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]??0)>(r[s]??0))return!0;if((n[s]??0)<(r[s]??0))return!1}return!1}function U(e,t){return["",p.yellow(`Update available: ${e} \u2192 ${t}`),p.dim("Run `npm i -g @moonpay/cli` to update."),""].join(`
10
- `)}function B(e){let t=null,n=me();if(n&&Date.now()-n.checkedAt<fe)return z(n.latest,e)&&(t=U(e,n.latest)),()=>t;let r=new AbortController,s=setTimeout(()=>r.abort(),ue);return fetch("https://registry.npmjs.org/@moonpay%2fcli/latest",{signal:r.signal}).then(i=>i.json()).then(i=>{let a=i.version;a&&(de({latest:a,checkedAt:Date.now()}),z(a,e)&&(t=U(e,a)))}).catch(()=>{}).finally(()=>clearTimeout(s)),()=>t}oe();async function H(e){let t=e.wallet,n=e.chain;if(typeof t!="string"||typeof n!="string")return;let r=D(t);if(!r)return;let s;try{s=(await C.chain.retrieve({chain:n})).keyFamily}catch{return}let i=I(s),a=r.addresses[i];a&&(e.wallet=a)}function W(e,t){let n=e[t];return typeof n=="string"&&n.length>0?n:void 0}function P(e){let t=e.code??e.status??e.statusCode;return typeof t=="string"||typeof t=="number"?t:void 0}function pe(e){try{return JSON.stringify(e)}catch{return}}function G(e){return e.length>0&&e!=="[object Object]"}function X(e){let t=W(e,"message");if(t&&G(t))return t;let n=e.error??e.cause??e.response;if(n&&typeof n=="object"){let r=K(n);if(G(r.message))return r.message}return W(e,"errorMessage")}function K(e){if(e instanceof Error){let t=e,n=P(t),r=X(t)??e.message;return n===void 0?{message:r}:{message:r,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 i=K(n),a=i.code??P(t);return a===void 0?{message:i.message}:{...i,code:a}}let r=X(t)??(typeof n=="string"&&n.length>0?n:void 0)??pe(e)??String(e),s=P(t);return s===void 0?{message:r}:{message:r,code:s}}return{message:String(e)}}function F(e,t){let n=K(e);return t==="json"?R({error:n},"json"):n.code===void 0?n.message:`${n.message} (code: ${n.code})`}var ge=B(E),h=new ye;h.name("moonpay").description(`MoonPay CLI \u2014 how agents move money
7
+ `):typeof e=="object"&&e!==null?Object.entries(e).map(([s,i])=>C(i)?`${n}${p.bold(s)}: ${k(i)}`:`${n}${p.bold(s)}:
8
+ ${R(i,t+1)}`).join(`
9
+ `):""}function se(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(r=>r!=="items").length===0?t.items:e}function v(e,t){return t==="json"?JSON.stringify(e,null,2):R(se(e))}import{readFileSync as ie,writeFileSync as ae,mkdirSync as ce}from"fs";import{join as q}from"path";import{homedir as fe}from"os";var Y=q(fe(),".config","moonpay"),B=q(Y,"update-check.json"),le=1440*60*1e3,ue=3e3;function me(){try{let e=ie(B,"utf-8");return JSON.parse(e)}catch{return null}}function de(e){try{ce(Y,{recursive:!0}),ae(B,JSON.stringify(e))}catch{}}function U(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]??0)>(r[s]??0))return!0;if((n[s]??0)<(r[s]??0))return!1}return!1}function Z(e,t){return["",p.yellow(`Update available: ${e} \u2192 ${t}`),p.dim("Run `npm i -g @moonpay/cli` to update."),""].join(`
10
+ `)}function H(e){let t=null,n=me();if(n&&Date.now()-n.checkedAt<le)return U(n.latest,e)&&(t=Z(e,n.latest)),()=>t;let r=new AbortController,s=setTimeout(()=>r.abort(),ue);return fetch("https://registry.npmjs.org/@moonpay%2fcli/latest",{signal:r.signal}).then(i=>i.json()).then(i=>{let a=i.version;a&&(de({latest:a,checkedAt:Date.now()}),U(a,e)&&(t=Z(e,a)))}).catch(()=>{}).finally(()=>clearTimeout(s)),()=>t}oe();async function W(e){let t=e.wallet,n=e.chain;if(typeof t!="string"||typeof n!="string")return;let r=M(t);if(!r)return;let s;try{s=(await j.chain.retrieve({chain:n})).keyFamily}catch{return}let i=D(s),a=r.addresses[i];a&&(e.wallet=a)}function G(e,t){let n=e[t];return typeof n=="string"&&n.length>0?n:void 0}function K(e){let t=e.code??e.status??e.statusCode;return typeof t=="string"||typeof t=="number"?t:void 0}function pe(e){try{return JSON.stringify(e)}catch{return}}function X(e){return e.length>0&&e!=="[object Object]"}function V(e){let t=G(e,"message");if(t&&X(t))return t;let n=e.error??e.cause??e.response;if(n&&typeof n=="object"){let r=F(n);if(X(r.message))return r.message}return G(e,"errorMessage")}function F(e){if(e instanceof Error){let t=e,n=K(t),r=V(t)??e.message;return n===void 0?{message:r}:{message:r,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 i=F(n),a=i.code??K(t);return a===void 0?{message:i.message}:{...i,code:a}}let r=V(t)??(typeof n=="string"&&n.length>0?n:void 0)??pe(e)??String(e),s=K(t);return s===void 0?{message:r}:{message:r,code:s}}return{message:String(e)}}function x(e,t){let n=F(e);return t==="json"?v({error:n},"json"):n.code===void 0?n.message:`${n.message} (code: ${n.code})`}var ge=H(E),h=new ye;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
- `+M).version(E).option("--json","Output as JSON instead of YAML");function x(){return h.opts().json?"json":"yaml"}function V(e){console.log(R(e,x()))}function Q(){let e=ge();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-525WV6IQ.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-ZP56K7KU.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 ee(e,t){let n=e;for(let r of t){let s=n.commands.find(i=>i.name()===r);s||(s=n.command(r)),n=s}return n}function ne(e,t=""){let n=[];for(let[r,s]of Object.entries(e)){let i=t?`${t}-${r}`:r,a=s;for(;a._def.typeName==="ZodEffects";)a=a._def.schema;let f=a;f._def.typeName==="ZodNullable"&&(f=f._def.innerType),f._def.typeName==="ZodObject"&&f.shape?n.push(...ne(f.shape,i)):n.push({flatKey:i,field:s,path:i.split("-")})}return n}function he(e,t){let n={};for(let{flatKey:r,path:s}of t){let i=r.replace(/-([a-z])/g,(f,d)=>d.toUpperCase()),a=i in e?e[i]:e[r];if(s.length===1)n[s[0]]=a;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]]=a}}return n}function be(e,t){for(let n of t){let r=n.schema.name.split("_"),s=r.pop(),a=ee(e,r).command(s).description(n.schema.description),f=n.schema.input.shape??{},d=ne(f),g=d.some(({flatKey:o})=>o===b),w=[],O=[],$=[],N=[];for(let{flatKey:o,field:c}of d){let l=c.description??o,u=c;for(;u._def.typeName==="ZodEffects";)u=u._def.schema;let y=u._def.typeName,m=u;m._def.typeName==="ZodNullable"&&(m=m._def.innerType),m._def.typeName==="ZodNumber"&&O.push(o),m._def.typeName==="ZodRecord"&&$.push(o),m._def.typeName==="ZodBoolean"&&N.push(o),y==="ZodBoolean"?a.option(`--${o} [${o}]`,l,!1):y==="ZodNullable"?(a.option(`--${o} <${o}>`,l),w.push(o)):a.requiredOption(`--${o} <${o}>`,l)}g||a.option(`--${b} <${b}>`,L),a.action(async o=>{n.schema.name.startsWith("consent_")||await J.handler({});for(let l of w){let u=l.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());o[u]===void 0&&(o[u]=null)}for(let l of O){let u=l.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());o[u]!=null&&typeof o[u]=="string"&&(o[u]=Number(o[u]))}for(let l of N){let u=l.replace(/-([a-z])/g,(m,A)=>A.toUpperCase()),y=o[u];if(typeof y=="string"){let m=y.toLowerCase();m==="true"||m==="1"?o[u]=!0:(m==="false"||m==="0")&&(o[u]=!1)}}for(let l of $){let u=l.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());if(typeof o[u]=="string")try{o[u]=JSON.parse(o[u])}catch{console.error(`Invalid JSON for --${l}`),process.exit(1)}}let c=he(o,d);!g&&typeof o[b]=="string"&&(c[b]=o[b]);try{let l=await n.handler(c);V(l)}catch(l){console.error(F(l,x())),process.exit(1)}})}}function we(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function _e(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function ke(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function Oe(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 te=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","polymarket_balance_withdraw_prepare","polymarket_balance_withdraw_submit","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 Ne(e,t){for(let n of t){if(te.has(n.name))continue;let r=n.name.split("_"),s=r.pop(),i=ee(e,r);if(i.commands.find(o=>o.name()===s))continue;let a=i.command(s).description(n.description),f=we(n.inputSchema),d=f.properties??{},g=new Set(f.required??[]),w=[],O=[],$=[],N=[];for(let[o,c]of Object.entries(d)){let l=c.description??o,u=_e(c),y=ke(c),m=Oe(c),A=$e(c);m&&O.push(o),A&&N.push(o),y?($.push(o),g.has(o)&&!u?a.requiredOption(`--${o} <json>`,`${l} (as JSON)`):(a.option(`--${o} <json>`,`${l} (as JSON)`),w.push(o))):u||!g.has(o)?(a.option(`--${o} <${o}>`,l),w.push(o)):a.requiredOption(`--${o} <${o}>`,l)}a.action(async o=>{await J.handler({});for(let c of w)o[c]===void 0&&(o[c]=null);for(let c of O)o[c]!=null&&typeof o[c]=="string"&&(o[c]=Number(o[c]));for(let c of N)if(typeof o[c]=="string"){let l=o[c].toLowerCase();l==="true"||l==="1"?o[c]=!0:(l==="false"||l==="0")&&(o[c]=!1)}for(let c of $)if(typeof o[c]=="string")try{o[c]=JSON.parse(o[c])}catch{console.error(`Invalid JSON for --${c}`),process.exit(1)}try{await H(o);let c=await C._call(n.name,o);V(c),Q()}catch(c){console.error(F(c,x())),process.exit(1)}})}}be(h,j);Ne(h,T);h.command("tools").description("List available tools").action(()=>{let e=[...j.map(n=>({name:n.schema.name,description:n.schema.description})),...T.filter(n=>!j.some(r=>r.schema.name===n.name)&&!te.has(n.name)).map(n=>({name:n.name,description:n.description}))].sort((n,r)=>n.name.localeCompare(r.name)),t=[];for(let n of e){let r=n.name.replace(/_/g," ");t.push(` ${p.green(r.padEnd(28))} ${p.dim(n.description)}`)}t.push(""),t.push(p.dim(`${e.length} tools`)),console.log(t.join(`
18
- `)),Q()});h.parse();
17
+ `+z).version(E).option("--json","Output as JSON instead of YAML");function L(){return h.opts().json?"json":"yaml"}function Q(e){console.log(v(e,L()))}function ee(){let e=ge();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-7OGVNCA6.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-WPJU7VFD.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 ne(e,t){let n=e;for(let r of t){let s=n.commands.find(i=>i.name()===r);s||(s=n.command(r)),n=s}return n}function te(e,t=""){let n=[];for(let[r,s]of Object.entries(e)){let i=t?`${t}-${r}`:r,a=s;for(;a._def.typeName==="ZodEffects";)a=a._def.schema;let l=a;l._def.typeName==="ZodNullable"&&(l=l._def.innerType),l._def.typeName==="ZodObject"&&l.shape?n.push(...te(l.shape,i)):n.push({flatKey:i,field:s,path:i.split("-")})}return n}function he(e,t){let n={};for(let{flatKey:r,path:s}of t){let i=r.replace(/-([a-z])/g,(l,d)=>d.toUpperCase()),a=i in e?e[i]:e[r];if(s.length===1)n[s[0]]=a;else{let l=n;for(let d=0;d<s.length-1;d++)(!l[s[d]]||typeof l[s[d]]!="object")&&(l[s[d]]={}),l=l[s[d]];l[s[s.length-1]]=a}}return n}function be(e,t){for(let n of t){let r=n.schema.name.split("_"),s=r.pop(),a=ne(e,r).command(s).description(n.schema.description),l=n.schema.input.shape??{},d=te(l),g=d.some(({flatKey:o})=>o===b),w=[],$=[],N=[],S=[];for(let{flatKey:o,field:c}of d){let f=c.description??o,u=c;for(;u._def.typeName==="ZodEffects";)u=u._def.schema;let y=u._def.typeName,m=u;m._def.typeName==="ZodNullable"&&(m=m._def.innerType),m._def.typeName==="ZodNumber"&&$.push(o),m._def.typeName==="ZodRecord"&&N.push(o),m._def.typeName==="ZodBoolean"&&S.push(o),y==="ZodBoolean"?a.option(`--${o} [${o}]`,f,!1):y==="ZodNullable"?(a.option(`--${o} <${o}>`,f),w.push(o)):a.requiredOption(`--${o} <${o}>`,f)}g||a.option(`--${b} <${b}>`,I),a.action(async o=>{n.schema.name.startsWith("consent_")||await J.handler({});for(let f of w){let u=f.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());o[u]===void 0&&(o[u]=null)}for(let f of $){let u=f.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());o[u]!=null&&typeof o[u]=="string"&&(o[u]=Number(o[u]))}for(let f of S){let u=f.replace(/-([a-z])/g,(m,A)=>A.toUpperCase()),y=o[u];if(typeof y=="string"){let m=y.toLowerCase();m==="true"||m==="1"?o[u]=!0:(m==="false"||m==="0")&&(o[u]=!1)}}for(let f of N){let u=f.replace(/-([a-z])/g,(y,m)=>m.toUpperCase());if(typeof o[u]=="string")try{o[u]=JSON.parse(o[u])}catch{console.error(`Invalid JSON for --${f}`),process.exit(1)}}let c=he(o,d);!g&&typeof o[b]=="string"&&(c[b]=o[b]);try{let f=await n.handler(c);Q(f)}catch(f){console.error(x(f,L())),process.exit(1)}})}}function we(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function Oe(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function ke(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function $e(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 Ne(e){return Array.isArray(e.type)?e.type.includes("boolean"):e.anyOf?e.anyOf.some(t=>t.type==="boolean"):e.type==="boolean"}function Se(e,t){for(let n of t){if(P.has(n.name))continue;let r=n.name.split("_"),s=r.pop(),i=ne(e,r);if(i.commands.find(o=>o.name()===s))continue;let a=i.command(s).description(n.description),l=we(n.inputSchema),d=l.properties??{},g=new Set(l.required??[]),w=[],$=[],N=[],S=[];for(let[o,c]of Object.entries(d)){let f=c.description??o,u=Oe(c),y=ke(c),m=$e(c),A=Ne(c);m&&$.push(o),A&&S.push(o),y?(N.push(o),g.has(o)&&!u?a.requiredOption(`--${o} <json>`,`${f} (as JSON)`):(a.option(`--${o} <json>`,`${f} (as JSON)`),w.push(o))):u||!g.has(o)?(a.option(`--${o} <${o}>`,f),w.push(o)):a.requiredOption(`--${o} <${o}>`,f)}a.action(async o=>{await J.handler({});for(let c of w)o[c]===void 0&&(o[c]=null);for(let c of $)o[c]!=null&&typeof o[c]=="string"&&(o[c]=Number(o[c]));for(let c of S)if(typeof o[c]=="string"){let f=o[c].toLowerCase();f==="true"||f==="1"?o[c]=!0:(f==="false"||f==="0")&&(o[c]=!1)}for(let c of N)if(typeof o[c]=="string")try{o[c]=JSON.parse(o[c])}catch{console.error(`Invalid JSON for --${c}`),process.exit(1)}try{await W(o);let c=await j._call(n.name,o);Q(c),ee()}catch(c){console.error(x(c,L())),process.exit(1)}})}}be(h,_);Se(h,T);h.command("tools").description("List available tools").action(()=>{let e=[..._.map(n=>({name:n.schema.name,description:n.schema.description})),...T.filter(n=>!_.some(r=>r.schema.name===n.name)&&!P.has(n.name)).map(n=>({name:n.name,description:n.description}))].sort((n,r)=>n.name.localeCompare(r.name)),t=[];for(let n of e){let r=n.name.replace(/_/g," ");t.push(` ${p.green(r.padEnd(28))} ${p.dim(n.description)}`)}t.push(""),t.push(p.dim(`${e.length} tools`)),console.log(t.join(`
18
+ `)),ee()});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-P2WHA52J.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-GGELOIUF.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-P2WHA52J.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-P2WHA52J.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-GGELOIUF.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-GGELOIUF.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-XKK2LOLM.js";import"./chunk-TCAKAVDX.js";import"./chunk-GM6O5MIA.js";import"./chunk-3KDOEO2V.js";import{e as s,g as u}from"./chunk-PG4E65EW.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-SGIJP4DQ.js";import"./chunk-L2QRHYWF.js";import"./chunk-7U53PGWA.js";import"./chunk-HSM3UOD2.js";import{f as s,h as u}from"./chunk-JMUBF7HA.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-XKK2LOLM.js";import"./chunk-TCAKAVDX.js";import"./chunk-GM6O5MIA.js";import"./chunk-3KDOEO2V.js";import{e as d,g as E,h as S,p as O}from"./chunk-PG4E65EW.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-SGIJP4DQ.js";import"./chunk-L2QRHYWF.js";import"./chunk-7U53PGWA.js";import"./chunk-HSM3UOD2.js";import{f as d,h as E,i as S,q as O}from"./chunk-JMUBF7HA.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)+`
@@ -0,0 +1,2 @@
1
+ process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
+ import{A as u,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-HSM3UOD2.js";import"./chunk-JMUBF7HA.js";import"./chunk-LMDE72OE.js";export{m as addHardwareWallet,u as addWallet,c as createWallet,i as deleteWallet,k as exportSecret,g as findWallet,h as findWalletOrThrow,a as getVaultPath,d as importMnemonic,e as importPrivateKey,f as listWallets,s as loadWallets,b as migrateWallets,p as owsSignMessage,o as owsSignTransaction,q as owsSignTypedData,n as refreshHardwareAddresses,t as removeWallet,j as renameWallet,l as repairWalletAccounts,r as resolveSigningKey};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonpay/cli",
3
- "version": "1.96.3",
3
+ "version": "1.96.5",
4
4
  "description": "MoonPay CLI — how agents move money",
5
5
  "homepage": "https://agents.moonpay.com",
6
6
  "publishConfig": {
@@ -31,7 +31,7 @@
31
31
  "@ledgerhq/device-transport-kit-node-hid": "1.0.0",
32
32
  "@modelcontextprotocol/sdk": "1.26.0",
33
33
  "@noble/hashes": "1.8.0",
34
- "@open-wallet-standard/core": "^0.5.0",
34
+ "@open-wallet-standard/core": "1.4.2",
35
35
  "@scure/bip32": "1.4.0",
36
36
  "@scure/bip39": "1.6.0",
37
37
  "@solana/web3.js": "1.98.4",
@@ -39,7 +39,9 @@ mp logout
39
39
 
40
40
  ## Local wallet management
41
41
 
42
- The CLI manages local wallets stored encrypted in `~/.config/moonpay/wallets.json`. Private keys are encrypted with AES-256-GCM using a random key stored in your OS keychain. No password required — keys never leave the machine.
42
+ The CLI manages local wallets in `~/.config/moonpay/wallets/` — one encrypted file per wallet. Secrets are encrypted with AES-256-GCM under a key scrypt-derived from a random passphrase held in your OS keychain (`moonpay-cli` / `vault-passphrase`). No password to type.
43
+
44
+ **Record the mnemonic somewhere off this machine.** The vault passphrase protects the wallet file; it is not a backup. Lose the keychain entry and the mnemonic is the only way back into the wallet. Treat the local vault as operational funds for signing rather than long-term storage.
43
45
 
44
46
  ```bash
45
47
  # Create a new HD wallet (Solana, Ethereum, Bitcoin, Tron)
@@ -90,16 +92,20 @@ This enables fully autonomous agent setup — no human in the loop.
90
92
 
91
93
  ## Config locations
92
94
 
93
- - **Wallets:** `~/.config/moonpay/wallets.json` (encrypted, AES-256-GCM)
94
- - **Encryption key:** OS keychain (`moonpay-cli` / `encryption-key`)
95
+ - **Wallets:** `~/.config/moonpay/wallets/` (one file per wallet, encrypted, AES-256-GCM)
96
+ - **Vault passphrase:** OS keychain (`moonpay-cli` / `vault-passphrase`)
95
97
  - **Credentials:** `~/.config/moonpay/credentials.json` (encrypted, AES-256-GCM)
98
+ - **Credentials key:** OS keychain (`moonpay-cli` / `encryption-key`)
96
99
  - **Config:** `~/.config/moonpay/config.json` (base URL, client ID)
97
100
 
98
101
  ## Security
99
102
 
100
- - Wallet secrets are always encrypted on disk
101
- - Encryption key is stored in macOS Keychain / Linux libsecret
102
- - No password to remember the OS handles authentication
103
+ - Wallet secrets are encrypted on disk under a random 32-byte vault passphrase
104
+ - The passphrase lives in macOS Keychain / Linux libsecret, under a different keychain account than the credentials key, so replacing one never exposes the other
105
+ - Set `MOONPAY_VAULT_PASSPHRASE` to supply the passphrase yourself. This keeps the key out of the vault's storage, so a disk image, snapshot, or backup of the machine does not carry it, and a destroyed machine can be re-provisioned from the same key. Use it when the CLI runs in a remote or agent-controlled VM
106
+ - None of this defends against code running in that VM. A process that can sign can also read the passphrase — from the keychain, from the fallback file, or from its own environment — and exfiltrate it with the wallet file. Keys held anywhere an agent has shell should be treated as spendable by that agent: fund them for the task at hand, not as storage
107
+ - With no keychain available the passphrase falls back to `~/.config/moonpay/.vault-passphrase` (owner-only). That file sits beside the wallets it protects, so a copy of `~/.config/moonpay` carries both — meaningfully weaker, and a default rather than a recommendation
108
+ - Encryption protects a wallet file that leaves the machine. It is not a defense against code running as you: a process with your privileges reads the keychain entry without a prompt
103
109
  - `wallet export` requires an interactive terminal (TTY) — agents and scripts cannot extract secrets
104
110
  - 24-word BIP39 mnemonics (256-bit entropy)
105
111
 
@@ -1,4 +0,0 @@
1
- process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{a as G,b as T,c as L,d as Z,h as D,p as Q}from"./chunk-PG4E65EW.js";import{a as V,f as I}from"./chunk-LMDE72OE.js";import{existsSync as H,readFileSync as J,writeFileSync as ge,renameSync as Y}from"fs";import{join as S}from"path";import{homedir as we}from"os";import{randomBytes as ve}from"crypto";import*as i from"@open-wallet-standard/core";import q from"bs58";T();import{z as s}from"zod";var M={"eip155:1":"ethereum","solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp":"solana","bip122:000000000019d6689c085ae165831e93":"bitcoin","tron:mainnet":"tron","ton:mainnet":"ton","fil:mainnet":"filecoin"};function R(e){return e==="evm"?"ethereum":e}var E=s.object({solana:s.string().optional(),ethereum:s.string().optional(),bitcoin:s.string().optional(),tron:s.string().optional(),ton:s.string().optional(),filecoin:s.string().optional()}),X=["base","arbitrum","robinhood","polygon","optimism","bnb","bnb-testnet","avalanche","tempo","tempo-moderato","ethereum-sepolia","base-sepolia","arbitrum-sepolia","polygon-amoy"];function Te(e){let t={};if(e.solana&&(t.solana=e.solana,t["solana-devnet"]=e.solana),e.ethereum){t.ethereum=e.ethereum;for(let r of X)t[r]=e.ethereum}return e.bitcoin&&(t.bitcoin=e.bitcoin),e.tron&&(t.tron=e.tron),e.ton&&(t.ton=e.ton),e.filecoin&&(t.filecoin=e.filecoin),t}var ee=s.object({name:s.string(),type:s.literal("hd"),mnemonic:s.string().optional(),addresses:E,createdAt:s.string()}),te=s.object({name:s.string(),type:s.literal("imported"),chain:s.string().optional(),privateKey:s.string().optional(),addresses:E,createdAt:s.string()}),U=s.enum(["ledger"]),$=s.object({name:s.string(),type:s.literal("hardware"),device:U,addresses:E,createdAt:s.string()}),De=s.discriminatedUnion("type",[ee,te,$]),Me=s.object({name:s.string(),type:s.enum(["hd","imported","hardware"]),device:U.optional(),addresses:s.record(s.string(),s.string()),createdAt:s.string()});import{createHash as _}from"crypto";import{HDKey as x}from"@scure/bip32";import{mnemonicToSeedSync as y}from"@scure/bip39";import{keccak_256 as B}from"@noble/hashes/sha3";import{derivePath as j}from"ed25519-hd-key";import*as O from"bitcoinjs-lib";import re from"ecpair";import*as K from"@bitcoinerlab/secp256k1";import{Keypair as ne}from"@solana/web3.js";import oe from"bs58";import{WalletContractV5R1 as ie}from"@ton/ton";import{keyPairFromSeed as se}from"@ton/crypto";import*as z from"@open-wallet-standard/core";var ae=re(K);function N(e,t,r=0){switch(t){case"solana":return le(e,r);case"ethereum":return ce(e,r);case"bitcoin":return pe(e,r);case"tron":return ue(e,r);case"ton":return ye(e,r);case"filecoin":return he(e,r);default:throw new Error(`Unsupported key family for derivation: ${t}`)}}function le(e,t){let r=y(e),n=`m/44'/501'/${t}'/0'`,{key:o}=j(n,Buffer.from(r).toString("hex")),a=ne.fromSeed(Uint8Array.from(o));return{privateKey:a.secretKey,address:a.publicKey.toBase58()}}function ce(e,t){let r=y(e),n=x.fromMasterSeed(r),o=`m/44'/60'/${t}'/0/0`,a=n.derive(o);if(!a.privateKey)throw new Error("Failed to derive EVM private key");let l=de(a.publicKey);return{privateKey:a.privateKey,address:l}}function de(e){let t=K.pointCompress(e,!1),n=B(t.slice(1)).slice(-20),o="0x"+Buffer.from(n).toString("hex");return fe(o)}function fe(e){let t=e.toLowerCase().replace("0x",""),r=Buffer.from(B(Buffer.from(t,"utf8"))).toString("hex"),n="0x";for(let o=0;o<t.length;o++)n+=parseInt(r[o],16)>=8?t[o].toUpperCase():t[o];return n}function pe(e,t){let r=y(e),n=x.fromMasterSeed(r),o=`m/84'/0'/${t}'/0/0`,a=n.derive(o);if(!a.privateKey)throw new Error("Failed to derive Bitcoin private key");let l=ae.fromPrivateKey(Buffer.from(a.privateKey)),{address:f}=O.payments.p2wpkh({pubkey:Buffer.from(l.publicKey)});if(!f)throw new Error("Failed to derive Bitcoin address");return{privateKey:a.privateKey,address:f}}function ue(e,t){let r=y(e),n=x.fromMasterSeed(r),o=`m/44'/195'/${t}'/0/0`,a=n.derive(o);if(!a.privateKey)throw new Error("Failed to derive Tron private key");let l=me(a.publicKey);return{privateKey:a.privateKey,address:l}}function me(e){let t=K.pointCompress(e,!1),n=B(t.slice(1)).slice(-20),o=Buffer.concat([Buffer.from([65]),Buffer.from(n)]),a=_("sha256").update(o).digest(),l=_("sha256").update(a).digest(),f=Buffer.concat([o,l.slice(0,4)]);return oe.encode(f)}function ye(e,t){let r=y(e),n=`m/44'/607'/${t}'/0'`,{key:o}=j(n,Buffer.from(r).toString("hex")),a=se(Buffer.from(o)),l=ie.create({publicKey:Buffer.from(a.publicKey)});return{privateKey:a.secretKey,address:l.address.toString({bounceable:!1})}}function he(e,t){let r=y(e),n=x.fromMasterSeed(r),o=`m/44'/461'/${t}'/0/0`,a=n.derive(o);if(!a.privateKey)throw new Error("Failed to derive Filecoin private key");let l=z.deriveAddress(e,"filecoin",t);return{privateKey:a.privateKey,address:l}}Q();var b=S(we(),".config","moonpay"),C=S(b,"hardware-wallets.json");function c(){return b}function We(e){let t={};for(let r of e){let n=M[r.chainId];n&&(t[n]=r.address)}return t}function h(e){let t=We(e.accounts);if(!t.filecoin)try{let r=i.exportWallet(e.id,null,c());r&&!r.startsWith("{")&&(t.filecoin=i.deriveAddress(r,"filecoin"))}catch{}return{name:e.name,type:"hd",addresses:t,createdAt:e.createdAt}}function m(){if(!H(C))return[];try{return(JSON.parse(J(C,"utf-8")).wallets??[]).map(t=>$.parse(t))}catch{return[]}}function xe(e,t){D();let r=S(b,`.tmp.${ve(4).toString("hex")}`);ge(r,JSON.stringify(t,null,2),{mode:384}),Y(r,e)}function g(e){xe(C,{wallets:e})}var w=S(b,"wallets.json");function F(){if(H(w)){process.stderr.write(`Migrating legacy wallets...
3
- `);let{migrated:e,skipped:t}=Ke();process.stderr.write(`Migrated ${e} wallet(s), skipped ${t}.
4
- `)}}function Ke(){if(!H(w))throw new Error("No legacy wallets.json found \u2014 nothing to migrate.");let{getEncryptionKey:e}=(Z(),I(L)),{decrypt:t,encryptedFileSchema:r}=(T(),I(G)),n=e();if(!n)throw new Error("Encryption key not found. Set MOONPAY_ENCRYPTION_KEY or ensure OS keychain is accessible.");let o=JSON.parse(J(w,"utf-8")),a=r.parse(o),l=t(a,n),f=JSON.parse(l).wallets??[],p=c(),W=m(),P=0,k=0;for(let d of f){try{i.getWallet(d.name,p),k++;continue}catch{}if(W.some(u=>u.name===d.name)){k++;continue}if(d.type==="hardware")W.push({name:d.name,type:"hardware",device:d.device,addresses:d.addresses,createdAt:d.createdAt});else if(d.type==="hd"&&d.mnemonic)i.importWalletMnemonic(d.name,d.mnemonic,null,null,p);else if(d.type==="imported"&&d.privateKey){let u=d.privateKey;if(!/^[0-9a-fA-F]+$/.test(u)){let A=q.decode(u);u=Buffer.from(A.length===64?A.slice(0,32):A).toString("hex")}i.importWalletPrivateKey(d.name,u,null,p,null,u,u)}P++}return W.length>0&&g(W),Y(w,w+".migrated"),{migrated:P,skipped:k}}function Se(e){F(),v(e);let t=i.createWallet(e,null,24,c());return h(t)}function be(e,t){v(e);let r=i.importWalletMnemonic(e,t,null,null,c());return h(r)}function ke(e,t,r){return v(e),h(i.importWalletPrivateKey(e,t,null,c(),r))}function Ae(){F();let e=[];try{e=i.listWallets(c())}catch{}return[...e.map(r=>h(r)),...m()]}function Ee(e){F();let t=c();try{let r=i.getWallet(e,t);return h(r)}catch{}try{for(let r of i.listWallets(t))for(let n of r.accounts)if(n.address===e)return h(r)}catch{}for(let r of m()){if(r.name===e)return r;for(let n of Object.values(r.addresses))if(n===e)return r}return null}function ot(e){let t=Ee(e);if(!t)throw new Error(`Wallet "${e}" not found`);return t}function $e(e){try{i.deleteWallet(e,c());return}catch{}let t=m(),r=t.findIndex(n=>n.name===e);if(r===-1)throw new Error(`Wallet "${e}" not found`);t.splice(r,1),g(t)}function it(e,t){if(e===t)return;v(t);try{i.getWallet(e,c()),i.renameWallet(e,t,c());return}catch(o){if(o instanceof Error&&!o.message.includes("not found"))throw o}let r=m(),n=r.find(o=>o.name===e);if(!n)throw new Error(`Wallet "${e}" not found`);n.name=t,g(r)}function st(e){return i.exportWallet(e,null,c())}function Be(e){v(e.name);let t=m();t.push(e),g(t)}function at(e,t){let r=m(),n=r.find(o=>o.name===e);if(!n)throw new Error(`Hardware wallet "${e}" not found`);n.addresses=t,g(r)}function lt(e,t,r){return i.signTransaction(e,t,r,null,null,c())}function ct(e,t,r,n){return i.signMessage(e,t,r,null,n??null,null,c())}function dt(e,t,r){return i.signTypedData(e,t,r,null,null,c())}async function ft(e,t){if(e.type==="hardware")throw new Error(`Wallet "${e.name}" is a hardware wallet. Signing must happen on the device.`);let{moonpay:r}=await import("./client-P2WHA52J.js"),n=await r.chain.retrieve({chain:t}),o=R(n.keyFamily),a=i.exportWallet(e.name,null,c());if(a.includes(" "))return N(a,o);let l;if(a.startsWith("{")){let p=JSON.parse(a);l=o==="solana"||o==="ton"?p.ed25519:p.secp256k1}else l=a;let f=Uint8Array.from(Buffer.from(l,"hex"));if(o==="solana"&&f.length===32){let p=V("tweetnacl");f=Uint8Array.from(p.sign.keyPair.fromSeed(f).secretKey)}return{privateKey:f,address:e.addresses[o]??""}}var Ce=Ae,pt=$e;function He(e){if(e.type==="hardware"){Be(e);return}if(e.type==="hd"&&e.mnemonic){be(e.name,e.mnemonic);return}if(e.type==="imported"&&e.privateKey){let t=e.privateKey;if(t.startsWith("0x"))t=t.slice(2);else if(!/^[0-9a-fA-F]+$/.test(t)){let r=q.decode(t);t=Buffer.from(r.length===64?r.slice(0,32):r).toString("hex")}ke(e.name,t,"solana");return}Se(e.name)}function ut(e){for(let t of e)He(t)}function mt(e){let t=Ce();e(t),g(t.filter(r=>r.type==="hardware"))}function v(e){try{throw i.getWallet(e,c()),new Error(`Wallet "${e}" already exists`)}catch(t){if(t instanceof Error&&t.message.includes("already exists"))throw t}if(m().some(t=>t.name===e))throw new Error(`Wallet "${e}" already exists`)}export{R as a,E as b,Te as c,U as d,Me as e,N as f,c as g,F as h,Ke as i,Se as j,be as k,ke as l,Ae as m,Ee as n,ot as o,$e as p,it as q,st as r,Be as s,at as t,lt as u,ct as v,dt as w,ft as x,Ce as y,pt as z,He as A,ut as B,mt as C};
@@ -1,3 +0,0 @@
1
- process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{b as S,d as b}from"./chunk-LMDE72OE.js";var $={};b($,{decrypt:()=>k,encrypt:()=>T,encryptedFileSchema:()=>O});import{randomBytes as A,scryptSync as v,createCipheriv as X,createDecipheriv as G}from"crypto";import{z as i}from"zod";function T(n,t){let r=A(32),o=v(t,r,D,{N:R,r:L,p:F,maxmem:K}),s=A(12),c=X("aes-256-gcm",o,s),_=Buffer.concat([c.update(n,"utf8"),c.final()]);return{encryption:{cipher:"aes-256-gcm",kdf:"scrypt",kdfparams:{n:R,r:L,p:F},salt:r.toString("base64"),iv:s.toString("base64"),tag:c.getAuthTag().toString("base64")},data:_.toString("base64")}}function k(n,t){let{salt:r,iv:o,tag:s,kdfparams:c}=n.encryption,_=v(t,Buffer.from(r,"base64"),D,{N:c.n,r:c.r,p:c.p,maxmem:K}),x=G("aes-256-gcm",_,Buffer.from(o,"base64"),{authTagLength:16});return x.setAuthTag(Buffer.from(s,"base64")),Buffer.concat([x.update(Buffer.from(n.data,"base64")),x.final()]).toString("utf8")}var R,L,F,D,K,O,P=S(()=>{"use strict";R=2**18,L=8,F=1,D=32,K=512*1024*1024,O=i.object({encryption:i.object({cipher:i.literal("aes-256-gcm"),kdf:i.literal("scrypt"),kdfparams:i.object({n:i.number(),r:i.number(),p:i.number()}),salt:i.string(),iv:i.string(),tag:i.string()}),data:i.string()})});import{readFileSync as W}from"fs";import{join as z}from"path";import{homedir as q}from"os";function en(){if(f!==void 0)return f;try{f=JSON.parse(W(z(q(),".config","moonpay","consent.json"),"utf-8")).agentId??null}catch{f=null}return f??null}function rn(){return process.env.OPENCLAW_SHELL?"openclaw":process.env.CLAUDECODE?"claude-code":process.env.CODEX_CI?"codex":process.env.GEMINI_CLI?"gemini-cli":"human"}function U(){let n={"Content-Type":"application/json",[Z]:Q,[tn]:rn()},t=en();return t&&(n[nn]=t),n}var Q,Z,nn,f,tn,j=S(()=>{"use strict";Q="1.96.3",Z="X-CLI-Version",nn="X-Agent-Id";tn="X-Agent"});import*as e from"fs";import*as Y from"os";import*as g from"path";function d(){e.existsSync(l)||e.mkdirSync(l,{recursive:!0,mode:448})}function H(n,t,r){let o=n+`.tmp.${process.pid}`;e.writeFileSync(o,t,{encoding:"utf-8",mode:r}),e.renameSync(o,n)}function sn(){d();try{let n=e.openSync(u,e.constants.O_CREAT|e.constants.O_EXCL|e.constants.O_WRONLY,384);e.writeSync(n,JSON.stringify({pid:process.pid,ts:Date.now()})),e.closeSync(n)}catch(n){if(n.code!=="EEXIST")throw n;try{let t=JSON.parse(e.readFileSync(u,"utf-8"));if(Date.now()-t.ts<on)return null}catch{}try{e.unlinkSync(u)}catch{}try{let t=e.openSync(u,e.constants.O_CREAT|e.constants.O_EXCL|e.constants.O_WRONLY,384);e.writeSync(t,JSON.stringify({pid:process.pid,ts:Date.now()})),e.closeSync(t)}catch{return null}}return()=>{try{e.unlinkSync(u)}catch{}}}function B(){if(!e.existsSync(w))return null;try{let n=JSON.parse(e.readFileSync(w,"utf-8"));return n.baseUrl?n:null}catch{return null}}function Kn(){let n=B();return n||(an(N),N)}function h(){if(!e.existsSync(p))return null;let n=C();if(!n)return null;try{let t=JSON.parse(e.readFileSync(p,"utf-8")),r=O.parse(t),o=k(r,n),s=JSON.parse(o);return!s.accessToken||!s.baseUrl?null:s}catch{return null}}function cn(n){let t=I(),r=T(JSON.stringify(n),t);d(),H(p,JSON.stringify(r,null,2),384)}function an(n){d(),H(w,JSON.stringify(n,null,2),384)}function Pn(){e.existsSync(p)&&e.unlinkSync(p)}function Un(){let n=B(),t=h();return n?.baseUrl??t?.baseUrl??N.baseUrl}async function fn(n,t,r){let o=await fetch(`${n}/api/tools/${encodeURIComponent(t)}`,{method:"POST",signal:AbortSignal.timeout(15e3),headers:U(),body:JSON.stringify(r)}),s=await o.json();if(!o.ok){let c=s;throw new Error(c?.error??`${t} failed (${o.status})`)}return s}async function un(n){if(!n.refreshToken)throw new Error("No refresh token available");let t=sn();if(!t){await new Promise(o=>setTimeout(o,2e3));let r=h();if(r&&r.expiresAt>Date.now())return r;throw new Error("Token refresh failed (concurrent refresh in progress)")}try{let r=h();if(r&&r.expiresAt>Date.now()+6e4)return r;let o=await fn(n.baseUrl,"refresh",{refreshToken:n.refreshToken}),s={accessToken:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt*1e3,baseUrl:n.baseUrl};return cn(s),s}finally{t()}}async function jn(){let n=h();if(!n)return null;if(Date.now()>=n.expiresAt-ln){if(n.refreshToken)try{return(await un(n)).accessToken}catch{return null}return null}return n.accessToken}var l,w,p,u,N,on,ln,V=S(()=>{"use strict";P();J();j();l=g.join(Y.homedir(),".config","moonpay"),w=g.join(l,"config.json"),p=g.join(l,"credentials.json"),u=g.join(l,".credentials.lock"),N={baseUrl:"https://agents.moonpay.com"};on=3e4;ln=300*1e3});var wn={};b(wn,{ensureEncryptionKey:()=>I,getEncryptionKey:()=>C});import{execFileSync as y}from"child_process";import{randomBytes as pn}from"crypto";import{existsSync as gn,readFileSync as dn,writeFileSync as yn}from"fs";import{homedir as mn,platform as M}from"os";import{join as Sn}from"path";function hn(n){try{y("security",["delete-generic-password","-s",a,"-a",m],{stdio:"ignore"})}catch{}y("security",["add-generic-password","-s",a,"-a",m,"-w",n],{stdio:"ignore"})}function Cn(){try{return y("security",["find-generic-password","-s",a,"-a",m,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function En(n){y("secret-tool",["store",`--label=${a}`,"service",a,"account",m],{input:n,stdio:["pipe","ignore","ignore"]})}function _n(){try{return y("secret-tool",["lookup","service",a,"account",m],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}function xn(n){d(),yn(E,n,{encoding:"utf-8",mode:384})}function On(){try{return gn(E)&&dn(E,"utf-8").trim()||null}catch{return null}}function Tn(n){try{let t=M();return t==="darwin"?(hn(n),!0):t==="linux"?(En(n),!0):!1}catch{return!1}}function kn(){let n=M();return n==="darwin"?Cn():n==="linux"?_n():null}function C(){let n=process.env.MOONPAY_ENCRYPTION_KEY;return n||(kn()??On())}function I(){let n=C();if(n)return n;let t=pn(32).toString("hex");return Tn(t)||(xn(t),process.stderr.write("Note: Keychain unavailable. Encryption key stored in "+E+`
3
- `)),t}var a,m,E,J=S(()=>{"use strict";V();a="moonpay-cli",m="encryption-key",E=Sn(mn(),".config","moonpay",".encryption-key")});export{$ as a,P as b,wn as c,J as d,Q as e,U as f,j as g,d as h,Kn as i,h as j,cn as k,Pn as l,Un as m,un as n,jn as o,V as p};