@moonpay/cli 0.12.4 → 0.12.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.
@@ -1,3 +1,3 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{a as C,b as x,c as v,e as R,i as D}from"./chunk-INE4OXJA.js";import{existsSync as De,readFileSync as Ue,writeFileSync as We,renameSync as Le}from"fs";import{join as F}from"path";import{homedir as Pe}from"os";import{randomBytes as Be}from"crypto";import{execFileSync as K,execSync as ae}from"child_process";import{randomBytes as fe}from"crypto";import{existsSync as le,readFileSync as ue,writeFileSync as de}from"fs";import{homedir as pe,platform as B}from"os";import{join as ye}from"path";import*as o from"fs";import*as W from"os";import*as g from"path";import{readFileSync as X}from"fs";import{join as G}from"path";import{homedir as q}from"os";var z="0.12.4",Q="X-CLI-Version",Z="X-Agent-Id",u;function ee(){if(u!==void 0)return u;try{u=JSON.parse(X(G(q(),".config","moonpay","consent.json"),"utf-8")).agentId??null}catch{u=null}return u??null}function U(){let e={"Content-Type":"application/json",[Q]:z},r=ee();return r&&(e[Z]=r),e}var p=g.join(W.homedir(),".config","moonpay"),b=g.join(p,"config.json"),y=g.join(p,"credentials.json"),d=g.join(p,".credentials.lock"),A={baseUrl:"https://agents.moonpay.com"};function a(){o.existsSync(p)||o.mkdirSync(p,{recursive:!0,mode:448})}function L(e,r,n){let t=e+`.tmp.${process.pid}`;o.writeFileSync(t,r,{encoding:"utf-8",mode:n}),o.renameSync(t,e)}var re=3e4;function ne(){a();try{let e=o.openSync(d,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY,384);o.writeSync(e,JSON.stringify({pid:process.pid,ts:Date.now()})),o.closeSync(e)}catch(e){if(e.code!=="EEXIST")throw e;try{let r=JSON.parse(o.readFileSync(d,"utf-8"));if(Date.now()-r.ts<re)return null}catch{}try{o.unlinkSync(d)}catch{}try{let r=o.openSync(d,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY,384);o.writeSync(r,JSON.stringify({pid:process.pid,ts:Date.now()})),o.closeSync(r)}catch{return null}}return()=>{try{o.unlinkSync(d)}catch{}}}function P(){if(!o.existsSync(b))return null;try{let e=JSON.parse(o.readFileSync(b,"utf-8"));return e.baseUrl?e:null}catch{return null}}function Qe(){let e=P();return e||(oe(A),A)}function w(){if(!o.existsSync(y))return null;let e=m();if(!e)return null;try{let r=JSON.parse(o.readFileSync(y,"utf-8")),n=C.parse(r),t=v(n,e),s=JSON.parse(t);return!s.accessToken||!s.baseUrl?null:s}catch{return null}}function te(e){let r=E(),n=x(JSON.stringify(e),r);a(),L(y,JSON.stringify(n,null,2),384)}function oe(e){a(),L(b,JSON.stringify(e,null,2),384)}function Ze(){o.existsSync(y)&&o.unlinkSync(y)}function er(){let e=P(),r=w();return e?.baseUrl??r?.baseUrl??A.baseUrl}async function se(e,r,n){let t=await fetch(`${e}/api/tools/${encodeURIComponent(r)}`,{method:"POST",signal:AbortSignal.timeout(15e3),headers:U(),body:JSON.stringify(n)}),s=await t.json();if(!t.ok){let i=s;throw new Error(i?.error??`${r} failed (${t.status})`)}return s}async function ie(e){if(!e.refreshToken)throw new Error("No refresh token available");let r=ne();if(!r){await new Promise(t=>setTimeout(t,2e3));let n=w();if(n&&n.expiresAt>Date.now())return n;throw new Error("Token refresh failed (concurrent refresh in progress)")}try{let n=w();if(n&&n.expiresAt>Date.now()+6e4)return n;let t=await se(e.baseUrl,"refresh",{refreshToken:e.refreshToken}),s={accessToken:t.accessToken,refreshToken:t.refreshToken,expiresAt:t.expiresAt*1e3,baseUrl:e.baseUrl};return te(s),s}finally{r()}}var ce=300*1e3;async function rr(){let e=w();if(!e)return null;if(Date.now()>=e.expiresAt-ce){if(e.refreshToken)try{return(await ie(e)).accessToken}catch{return null}return null}return e.accessToken}var f="moonpay-cli",h="encryption-key",k=ye(pe(),".config","moonpay",".encryption-key");function me(e){try{K("security",["delete-generic-password","-s",f,"-a",h],{stdio:"ignore"})}catch{}K("security",["add-generic-password","-s",f,"-a",h,"-w",e],{stdio:"ignore"})}function ge(){try{return K("security",["find-generic-password","-s",f,"-a",h,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function he(e){ae(`printf '%s' | secret-tool store --label="${f}" service "${f}" account "${h}"`,{input:e,stdio:["pipe","ignore","ignore"]})}function Se(){try{return K("secret-tool",["lookup","service",f,"account",h],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function Ce(e){a(),de(k,e,{encoding:"utf-8",mode:384})}function xe(){try{return le(k)&&ue(k,"utf-8").trim()||null}catch{return null}}function ve(e){try{let r=B();return r==="darwin"?(me(e),!0):r==="linux"?(he(e),!0):!1}catch{return!1}}function we(){let e=B();return e==="darwin"?ge():e==="linux"?Se():null}function m(){let e=process.env.MOONPAY_ENCRYPTION_KEY;return e||(we()??xe())}function E(){let e=m();if(e)return e;let r=fe(32).toString("hex");return ve(r)||(Ce(r),process.stderr.write("Note: Keychain unavailable. Encryption key stored in "+k+`
2
+ import{a as C,b as x,c as v,e as R,i as D}from"./chunk-INE4OXJA.js";import{existsSync as De,readFileSync as Ue,writeFileSync as We,renameSync as Le}from"fs";import{join as F}from"path";import{homedir as Pe}from"os";import{randomBytes as Be}from"crypto";import{execFileSync as K,execSync as ae}from"child_process";import{randomBytes as fe}from"crypto";import{existsSync as le,readFileSync as ue,writeFileSync as de}from"fs";import{homedir as pe,platform as B}from"os";import{join as ye}from"path";import*as o from"fs";import*as W from"os";import*as g from"path";import{readFileSync as X}from"fs";import{join as G}from"path";import{homedir as q}from"os";var z="0.12.5",Q="X-CLI-Version",Z="X-Agent-Id",u;function ee(){if(u!==void 0)return u;try{u=JSON.parse(X(G(q(),".config","moonpay","consent.json"),"utf-8")).agentId??null}catch{u=null}return u??null}function U(){let e={"Content-Type":"application/json",[Q]:z},r=ee();return r&&(e[Z]=r),e}var p=g.join(W.homedir(),".config","moonpay"),b=g.join(p,"config.json"),y=g.join(p,"credentials.json"),d=g.join(p,".credentials.lock"),A={baseUrl:"https://agents.moonpay.com"};function a(){o.existsSync(p)||o.mkdirSync(p,{recursive:!0,mode:448})}function L(e,r,n){let t=e+`.tmp.${process.pid}`;o.writeFileSync(t,r,{encoding:"utf-8",mode:n}),o.renameSync(t,e)}var re=3e4;function ne(){a();try{let e=o.openSync(d,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY,384);o.writeSync(e,JSON.stringify({pid:process.pid,ts:Date.now()})),o.closeSync(e)}catch(e){if(e.code!=="EEXIST")throw e;try{let r=JSON.parse(o.readFileSync(d,"utf-8"));if(Date.now()-r.ts<re)return null}catch{}try{o.unlinkSync(d)}catch{}try{let r=o.openSync(d,o.constants.O_CREAT|o.constants.O_EXCL|o.constants.O_WRONLY,384);o.writeSync(r,JSON.stringify({pid:process.pid,ts:Date.now()})),o.closeSync(r)}catch{return null}}return()=>{try{o.unlinkSync(d)}catch{}}}function P(){if(!o.existsSync(b))return null;try{let e=JSON.parse(o.readFileSync(b,"utf-8"));return e.baseUrl?e:null}catch{return null}}function Qe(){let e=P();return e||(oe(A),A)}function w(){if(!o.existsSync(y))return null;let e=m();if(!e)return null;try{let r=JSON.parse(o.readFileSync(y,"utf-8")),n=C.parse(r),t=v(n,e),s=JSON.parse(t);return!s.accessToken||!s.baseUrl?null:s}catch{return null}}function te(e){let r=E(),n=x(JSON.stringify(e),r);a(),L(y,JSON.stringify(n,null,2),384)}function oe(e){a(),L(b,JSON.stringify(e,null,2),384)}function Ze(){o.existsSync(y)&&o.unlinkSync(y)}function er(){let e=P(),r=w();return e?.baseUrl??r?.baseUrl??A.baseUrl}async function se(e,r,n){let t=await fetch(`${e}/api/tools/${encodeURIComponent(r)}`,{method:"POST",signal:AbortSignal.timeout(15e3),headers:U(),body:JSON.stringify(n)}),s=await t.json();if(!t.ok){let i=s;throw new Error(i?.error??`${r} failed (${t.status})`)}return s}async function ie(e){if(!e.refreshToken)throw new Error("No refresh token available");let r=ne();if(!r){await new Promise(t=>setTimeout(t,2e3));let n=w();if(n&&n.expiresAt>Date.now())return n;throw new Error("Token refresh failed (concurrent refresh in progress)")}try{let n=w();if(n&&n.expiresAt>Date.now()+6e4)return n;let t=await se(e.baseUrl,"refresh",{refreshToken:e.refreshToken}),s={accessToken:t.accessToken,refreshToken:t.refreshToken,expiresAt:t.expiresAt*1e3,baseUrl:e.baseUrl};return te(s),s}finally{r()}}var ce=300*1e3;async function rr(){let e=w();if(!e)return null;if(Date.now()>=e.expiresAt-ce){if(e.refreshToken)try{return(await ie(e)).accessToken}catch{return null}return null}return e.accessToken}var f="moonpay-cli",h="encryption-key",k=ye(pe(),".config","moonpay",".encryption-key");function me(e){try{K("security",["delete-generic-password","-s",f,"-a",h],{stdio:"ignore"})}catch{}K("security",["add-generic-password","-s",f,"-a",h,"-w",e],{stdio:"ignore"})}function ge(){try{return K("security",["find-generic-password","-s",f,"-a",h,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function he(e){ae(`printf '%s' | secret-tool store --label="${f}" service "${f}" account "${h}"`,{input:e,stdio:["pipe","ignore","ignore"]})}function Se(){try{return K("secret-tool",["lookup","service",f,"account",h],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function Ce(e){a(),de(k,e,{encoding:"utf-8",mode:384})}function xe(){try{return le(k)&&ue(k,"utf-8").trim()||null}catch{return null}}function ve(e){try{let r=B();return r==="darwin"?(me(e),!0):r==="linux"?(he(e),!0):!1}catch{return!1}}function we(){let e=B();return e==="darwin"?ge():e==="linux"?Se():null}function m(){let e=process.env.MOONPAY_ENCRYPTION_KEY;return e||(we()??xe())}function E(){let e=m();if(e)return e;let r=fe(32).toString("hex");return ve(r)||(Ce(r),process.stderr.write("Note: Keychain unavailable. Encryption key stored in "+k+`
3
3
  `)),r}import{createHash as $}from"crypto";import{HDKey as N}from"@scure/bip32";import{mnemonicToSeedSync as _}from"@scure/bip39";import{keccak_256 as J}from"@noble/hashes/sha3";import{derivePath as Ee}from"ed25519-hd-key";import*as j from"bitcoinjs-lib";import Ke from"ecpair";import*as O from"tiny-secp256k1";import{Keypair as ke}from"@solana/web3.js";import _e from"bs58";var Oe=Ke(O);function T(e,r=0){switch(e){case"solana":return`m/44'/501'/${r}'/0'`;case"ethereum":return`m/44'/60'/${r}'/0/0`;case"bitcoin":return`m/84'/0'/${r}'/0/0`;case"tron":return`m/44'/195'/${r}'/0/0`}}function l(e,r,n=0){switch(r){case"solana":return Te(e,n);case"ethereum":return be(e,n);case"bitcoin":return Ie(e,n);case"tron":return Fe(e,n)}}function Sr(e,r=0){return{solana:l(e,"solana",r).address,ethereum:l(e,"ethereum",r).address,bitcoin:l(e,"bitcoin",r).address,tron:l(e,"tron",r).address}}function Te(e,r){let n=_(e),t=T("solana",r),{key:s}=Ee(t,Buffer.from(n).toString("hex")),i=ke.fromSeed(Uint8Array.from(s));return{privateKey:i.secretKey,address:i.publicKey.toBase58()}}function be(e,r){let n=_(e),t=N.fromMasterSeed(n),s=T("ethereum",r),i=t.derive(s);if(!i.privateKey)throw new Error("Failed to derive EVM private key");let c=Ae(i.publicKey);return{privateKey:i.privateKey,address:c}}function Ae(e){let r=O.pointCompress(e,!1),t=H(r.slice(1)).slice(-20),s="0x"+Buffer.from(t).toString("hex");return Ne(s)}function H(e){return J(e)}function Ne(e){let r=e.toLowerCase().replace("0x",""),n=Buffer.from(J(Buffer.from(r,"utf8"))).toString("hex"),t="0x";for(let s=0;s<r.length;s++)t+=parseInt(n[s],16)>=8?r[s].toUpperCase():r[s];return t}function Ie(e,r){let n=_(e),t=N.fromMasterSeed(n),s=T("bitcoin",r),i=t.derive(s);if(!i.privateKey)throw new Error("Failed to derive Bitcoin private key");let c=Oe.fromPrivateKey(Buffer.from(i.privateKey)),{address:S}=j.payments.p2wpkh({pubkey:Buffer.from(c.publicKey)});if(!S)throw new Error("Failed to derive Bitcoin address");return{privateKey:i.privateKey,address:S}}function Fe(e,r){let n=_(e),t=N.fromMasterSeed(n),s=T("tron",r),i=t.derive(s);if(!i.privateKey)throw new Error("Failed to derive Tron private key");let c=Re(i.publicKey);return{privateKey:i.privateKey,address:c}}function Re(e){let r=O.pointCompress(e,!1),t=H(r.slice(1)).slice(-20),s=Buffer.concat([Buffer.from([65]),Buffer.from(t)]),i=$("sha256").update(s).digest(),c=$("sha256").update(i).digest(),S=Buffer.concat([s,c.slice(0,4)]);return _e.encode(S)}import $e from"bs58";var M=F(Pe(),".config","moonpay"),I=F(M,"wallets.json");function V(){if(!De(I))return[];let e=m();if(!e)throw new Error("Encryption key not found. Set MOONPAY_ENCRYPTION_KEY or ensure OS keychain is accessible.");let r=JSON.parse(Ue(I,"utf-8")),n=C.parse(r),t=v(n,e);return(JSON.parse(t).wallets??[]).map(i=>D.parse(i))}function Je(e){let r=E(),n=JSON.stringify({wallets:e}),t=x(n,r);a();let s=F(M,`.wallets.${Be(4).toString("hex")}.tmp`);We(s,JSON.stringify(t,null,2),{mode:384}),Le(s,I)}function Y(e){let r=V();e(r),Je(r)}function je(e){let r=V();for(let n of r){if(n.name===e)return n;for(let t of Object.values(n.addresses))if(t===e)return n}return null}function Ar(e){let r=je(e);if(!r)throw new Error(`Wallet "${e}" not found`);return r}function Nr(e){Y(r=>{if(r.some(n=>n.name===e.name))throw new Error(`Wallet "${e.name}" already exists`);r.push(e)})}function Ir(e){Y(r=>{let n=r.findIndex(t=>t.name===e);if(n===-1)throw new Error(`Wallet "${e}" not found`);r.splice(n,1)})}function Fr(e,r){if(e.type==="hardware")throw new Error(`Wallet "${e.name}" is a hardware wallet. Signing must happen on the device \u2014 use ledgerSignTransaction/ledgerSignMessage instead.`);let n=R[r];if(e.type==="imported"){if(e.chain!==n)throw new Error(`Wallet "${e.name}" was imported for ${e.chain}, cannot sign for ${r}.`);return{privateKey:He(e.privateKey,n),address:e.addresses[n]}}let t=l(e.mnemonic,n);return{privateKey:t.privateKey,address:t.address}}function He(e,r){if(r==="solana")return $e.decode(e);let n=e.startsWith("0x")?e.slice(2):e;return Uint8Array.from(Buffer.from(n,"hex"))}export{z as a,U as b,a as c,Qe as d,w as e,te as f,Ze as g,er as h,se as i,ie as j,rr as k,Sr as l,V as m,Je as n,Y as o,je as p,Ar as q,Nr as r,Ir as s,Fr as t};
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
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 R,b as S,c as T,d as j,e as k}from"./chunk-WUNFPTA5.js";import{a as C,h as A,p as J}from"./chunk-6XYBS7GN.js";import{e as v}from"./chunk-INE4OXJA.js";import"./chunk-LMDE72OE.js";import{Command as ne}from"commander";var Y=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function $(e){return t=>Y?`${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 O(e){if(e==null)return!0;let t=typeof e;return t==="string"||t==="number"||t==="boolean"}function _(e){return e==null?"-":String(e)}function N(e,t=0){let n=" ".repeat(t);return O(e)?`${n}${_(e)}`:Array.isArray(e)?e.length===0?`${n}${p.dim("(empty)")}`:e.every(O)?e.map(r=>`${n}- ${_(r)}`).join(`
3
+ import{a as R,b as S,c as T,d as j,e as k}from"./chunk-5RZNEJ6M.js";import{a as C,h as A,p as J}from"./chunk-YCWUFUSB.js";import{e as v}from"./chunk-INE4OXJA.js";import"./chunk-LMDE72OE.js";import{Command as ne}from"commander";var Y=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function $(e){return t=>Y?`${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 O(e){if(e==null)return!0;let t=typeof e;return t==="string"||t==="number"||t==="boolean"}function _(e){return e==null?"-":String(e)}function N(e,t=0){let n=" ".repeat(t);return O(e)?`${n}${_(e)}`:Array.isArray(e)?e.length===0?`${n}${p.dim("(empty)")}`:e.every(O)?e.map(r=>`${n}- ${_(r)}`).join(`
4
4
  `):e.map(r=>{if(typeof r!="object"||r===null)return`${n}- ${_(r)}`;let o=Object.entries(r),a=[],[c,f]=o[0];O(f)?a.push(`${n}- ${p.bold(c)}: ${_(f)}`):(a.push(`${n}- ${p.bold(c)}:`),a.push(N(f,t+2)));for(let[m,y]of o.slice(1))O(y)?a.push(`${n} ${p.bold(m)}: ${_(y)}`):(a.push(`${n} ${p.bold(m)}:`),a.push(N(y,t+2)));return a.join(`
5
5
  `)}).join(`
6
6
 
@@ -14,5 +14,5 @@ ${N(a,t+1)}`).join(`
14
14
 
15
15
  Run \`mp skill install\` to install AI skills for Claude Code.
16
16
 
17
- `+T).version(C).option("--json","Output as JSON instead of YAML");function re(){return h.opts().json?"json":"yaml"}function D(e){console.log(F(e,re()))}function U(){let e=te();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-KCGWKI4Q.js");await e()});function M(e,t){let n=e;for(let r of t){let o=n.commands.find(a=>a.name()===r);o||(o=n.command(r)),n=o}return n}function Z(e,t=""){let n=[];for(let[r,o]of Object.entries(e)){let a=t?`${t}-${r}`:r,c=o;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(...Z(f.shape,a)):n.push({flatKey:a,field:o,path:a.split("-")})}return n}function oe(e,t){let n={};for(let{flatKey:r,path:o}of t){let a=r.replace(/-([a-z])/g,(f,m)=>m.toUpperCase()),c=a in e?e[a]:e[r];if(o.length===1)n[o[0]]=c;else{let f=n;for(let m=0;m<o.length-1;m++)(!f[o[m]]||typeof f[o[m]]!="object")&&(f[o[m]]={}),f=f[o[m]];f[o[o.length-1]]=c}}return n}function se(e,t){for(let n of t){let r=n.schema.name.split("_"),o=r.pop(),c=M(e,r).command(o).description(n.schema.description),f=n.schema.input.shape??{},m=Z(f),y=[],b=[],w=[];for(let{flatKey:u,field:i}of m){let s=i.description??u,l=i;for(;l._def.typeName==="ZodEffects";)l=l._def.schema;let g=l._def.typeName,d=l;d._def.typeName==="ZodNullable"&&(d=d._def.innerType),d._def.typeName==="ZodNumber"&&b.push(u),d._def.typeName==="ZodRecord"&&w.push(u),g==="ZodBoolean"?c.option(`--${u}`,s,!1):g==="ZodNullable"?(c.option(`--${u} <${u}>`,s),y.push(u)):c.requiredOption(`--${u} <${u}>`,s)}c.action(async u=>{n.schema.name.startsWith("consent_")||await j.handler({});for(let s of y){let l=s.replace(/-([a-z])/g,(g,d)=>d.toUpperCase());u[l]===void 0&&(u[l]=null)}for(let s of b){let l=s.replace(/-([a-z])/g,(g,d)=>d.toUpperCase());u[l]!=null&&typeof u[l]=="string"&&(u[l]=Number(u[l]))}for(let s of w){let l=s.replace(/-([a-z])/g,(g,d)=>d.toUpperCase());if(typeof u[l]=="string")try{u[l]=JSON.parse(u[l])}catch{console.error(`Invalid JSON for --${s}`),process.exit(1)}}let i=oe(u,m);try{let s=await n.handler(i);D(s)}catch(s){console.error(s.message),process.exit(1)}})}}function ie(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function ae(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function ce(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function le(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 fe(e){let t=e.wallet,n=e.chain;if(typeof t!="string"||typeof n!="string")return;let r=J(t);if(!r)return;let o=v[n];if(!o)return;let a=r.addresses[o];a&&(e.wallet=a)}var q=new Set(["swaps_transaction_build","token_transfer","transaction_register","virtual-account_offramp_initiate","prediction-market_position_buy","prediction-market_position_sell","commerce_cart_update","commerce_checkout_start","commerce_checkout_pay"]);function ue(e,t){for(let n of t){if(q.has(n.name))continue;let r=n.name.split("_"),o=r.pop(),a=M(e,r);if(a.commands.find(i=>i.name()===o))continue;let c=a.command(o).description(n.description),f=ie(n.inputSchema),m=f.properties??{},y=new Set(f.required??[]),b=[],w=[],u=[];for(let[i,s]of Object.entries(m)){let l=s.description??i,g=ae(s),d=ce(s);le(s)&&w.push(i),d?(u.push(i),y.has(i)&&!g?c.requiredOption(`--${i} <json>`,`${l} (as JSON)`):(c.option(`--${i} <json>`,`${l} (as JSON)`),b.push(i))):g||!y.has(i)?(c.option(`--${i} <${i}>`,l),b.push(i)):c.requiredOption(`--${i} <${i}>`,l)}c.action(async i=>{await j.handler({});for(let s of b)i[s]===void 0&&(i[s]=null);for(let s of w)i[s]!=null&&typeof i[s]=="string"&&(i[s]=Number(i[s]));for(let s of u)if(typeof i[s]=="string")try{i[s]=JSON.parse(i[s])}catch{console.error(`Invalid JSON for --${s}`),process.exit(1)}try{fe(i);let s=A(),l=await R(s,n.name,i);D(l),U()}catch(s){console.error(s.message),process.exit(1)}})}}se(h,k);ue(h,S);h.command("tools").description("List available tools").action(()=>{let e=[...k.map(n=>({name:n.schema.name,description:n.schema.description})),...S.filter(n=>!k.some(r=>r.schema.name===n.name)&&!q.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(`
17
+ `+T).version(C).option("--json","Output as JSON instead of YAML");function re(){return h.opts().json?"json":"yaml"}function D(e){console.log(F(e,re()))}function U(){let e=te();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-VVJO3BGV.js");await e()});function M(e,t){let n=e;for(let r of t){let o=n.commands.find(a=>a.name()===r);o||(o=n.command(r)),n=o}return n}function Z(e,t=""){let n=[];for(let[r,o]of Object.entries(e)){let a=t?`${t}-${r}`:r,c=o;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(...Z(f.shape,a)):n.push({flatKey:a,field:o,path:a.split("-")})}return n}function oe(e,t){let n={};for(let{flatKey:r,path:o}of t){let a=r.replace(/-([a-z])/g,(f,m)=>m.toUpperCase()),c=a in e?e[a]:e[r];if(o.length===1)n[o[0]]=c;else{let f=n;for(let m=0;m<o.length-1;m++)(!f[o[m]]||typeof f[o[m]]!="object")&&(f[o[m]]={}),f=f[o[m]];f[o[o.length-1]]=c}}return n}function se(e,t){for(let n of t){let r=n.schema.name.split("_"),o=r.pop(),c=M(e,r).command(o).description(n.schema.description),f=n.schema.input.shape??{},m=Z(f),y=[],b=[],w=[];for(let{flatKey:u,field:i}of m){let s=i.description??u,l=i;for(;l._def.typeName==="ZodEffects";)l=l._def.schema;let g=l._def.typeName,d=l;d._def.typeName==="ZodNullable"&&(d=d._def.innerType),d._def.typeName==="ZodNumber"&&b.push(u),d._def.typeName==="ZodRecord"&&w.push(u),g==="ZodBoolean"?c.option(`--${u}`,s,!1):g==="ZodNullable"?(c.option(`--${u} <${u}>`,s),y.push(u)):c.requiredOption(`--${u} <${u}>`,s)}c.action(async u=>{n.schema.name.startsWith("consent_")||await j.handler({});for(let s of y){let l=s.replace(/-([a-z])/g,(g,d)=>d.toUpperCase());u[l]===void 0&&(u[l]=null)}for(let s of b){let l=s.replace(/-([a-z])/g,(g,d)=>d.toUpperCase());u[l]!=null&&typeof u[l]=="string"&&(u[l]=Number(u[l]))}for(let s of w){let l=s.replace(/-([a-z])/g,(g,d)=>d.toUpperCase());if(typeof u[l]=="string")try{u[l]=JSON.parse(u[l])}catch{console.error(`Invalid JSON for --${s}`),process.exit(1)}}let i=oe(u,m);try{let s=await n.handler(i);D(s)}catch(s){console.error(s.message),process.exit(1)}})}}function ie(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function ae(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function ce(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function le(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 fe(e){let t=e.wallet,n=e.chain;if(typeof t!="string"||typeof n!="string")return;let r=J(t);if(!r)return;let o=v[n];if(!o)return;let a=r.addresses[o];a&&(e.wallet=a)}var q=new Set(["swaps_transaction_build","token_transfer","transaction_register","virtual-account_offramp_initiate","prediction-market_position_buy","prediction-market_position_sell","commerce_cart_update","commerce_checkout_start","commerce_checkout_pay"]);function ue(e,t){for(let n of t){if(q.has(n.name))continue;let r=n.name.split("_"),o=r.pop(),a=M(e,r);if(a.commands.find(i=>i.name()===o))continue;let c=a.command(o).description(n.description),f=ie(n.inputSchema),m=f.properties??{},y=new Set(f.required??[]),b=[],w=[],u=[];for(let[i,s]of Object.entries(m)){let l=s.description??i,g=ae(s),d=ce(s);le(s)&&w.push(i),d?(u.push(i),y.has(i)&&!g?c.requiredOption(`--${i} <json>`,`${l} (as JSON)`):(c.option(`--${i} <json>`,`${l} (as JSON)`),b.push(i))):g||!y.has(i)?(c.option(`--${i} <${i}>`,l),b.push(i)):c.requiredOption(`--${i} <${i}>`,l)}c.action(async i=>{await j.handler({});for(let s of b)i[s]===void 0&&(i[s]=null);for(let s of w)i[s]!=null&&typeof i[s]=="string"&&(i[s]=Number(i[s]));for(let s of u)if(typeof i[s]=="string")try{i[s]=JSON.parse(i[s])}catch{console.error(`Invalid JSON for --${s}`),process.exit(1)}try{fe(i);let s=A(),l=await R(s,n.name,i);D(l),U()}catch(s){console.error(s.message),process.exit(1)}})}}se(h,k);ue(h,S);h.command("tools").description("List available tools").action(()=>{let e=[...k.map(n=>({name:n.schema.name,description:n.schema.description})),...S.filter(n=>!k.some(r=>r.schema.name===n.name)&&!q.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
18
  `)),U()});h.parse();
@@ -0,0 +1,12 @@
1
+ process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
+ import{e as k}from"./chunk-INE4OXJA.js";import{a as v}from"./chunk-LMDE72OE.js";var $=3e4,x=new Set(["BOLOS","dashboard",""]),b=`Ledger support requires additional packages.
3
+ Run: npm i -g @moonpay/cli --include=optional`;function y(){try{let e=v("@ledgerhq/device-management-kit"),n=v("@ledgerhq/device-transport-kit-node-hid"),t=v("rxjs");return{...e,...n,...t}}catch{throw new Error(b)}}function E(){try{return v("@ledgerhq/device-signer-kit-ethereum")}catch{throw new Error(b)}}function D(){try{return v("@ledgerhq/device-signer-kit-solana")}catch{throw new Error(b)}}var h=null,m=null;function p(){if(!h){let e=y();h=new e.DeviceManagementKitBuilder().addTransport(e.nodeHidTransportFactory).build()}return h}function S(){if(!m)throw new Error("No Ledger device connected. Connect first.");return m}var C={"unlock-device":"Unlock your Ledger device","confirm-open-app":"Confirm opening the app on your Ledger","sign-transaction":"Review and sign the transaction on your Ledger","sign-personal-message":"Review and sign the message on your Ledger","verify-address":"Verify the address shown on your Ledger"};async function w(e,n,t=6e4){let{DeviceActionStatus:s}=y();return new Promise((i,a)=>{let u="",d=!1,o=l=>{d||(d=!0,clearTimeout(c),g.unsubscribe(),l())},c=setTimeout(()=>{o(()=>{e.cancel(),a(new Error(`${n} timed out after ${t/1e3}s. Make sure the correct app is open on your Ledger and try again.`))})},t),g=e.observable.subscribe({next:l=>{switch(l.status){case s.Pending:{let r=l.intermediateValue?.requiredUserInteraction??"";if(r&&r!=="none"&&r!==u){u=r;let f=C[r]??r;f&&process.stderr.write(` ${f}
4
+ `)}break}case s.Completed:o(()=>i(l.output));break;case s.Error:o(()=>{let r=l.error,f=r instanceof Error?r.message:r&&typeof r=="object"?r._tag??r.message??JSON.stringify(r):String(r);a(new Error(`${n} failed: ${f}`))});break;case s.Stopped:o(()=>a(new Error(`${n} was cancelled`)));break}},error:l=>o(()=>a(l))})})}async function U(){try{let e=y(),n=p(),t=n.startDiscovering({});return await e.firstValueFrom(t.pipe(e.take(1),e.timeout(3e3))).finally(()=>{n.stopDiscovering()}),!0}catch{return!1}}async function I(){let e=y(),n=p().startDiscovering({});process.stderr.write(`Scanning for Ledger devices via USB...
5
+ `);let t=await e.firstValueFrom(n.pipe(e.take(1),e.timeout($))).finally(()=>{p().stopDiscovering()}),s=t.deviceModel.model??t.deviceModel.id;return process.stderr.write(`Connecting to Ledger ${s}...
6
+ `),m=await p().connect({device:t,sessionRefresherOptions:{isRefresherDisabled:!0}}),process.stderr.write(`Connected to Ledger ${s}
7
+ `),m}async function R(){if(!m)return null;try{let n=p().getDeviceSessionState({sessionId:m}),t=null;return n.subscribe(i=>{i.sessionStateType==="readyWithoutSecureChannel"&&(t=i.currentApp?.name??null)}).unsubscribe(),t}catch{return null}}var P={ethereum:"Ethereum",solana:"Solana",bitcoin:"Bitcoin",tron:"Tron"};function O(e){let n=String(e);return n.includes("6807")||n.includes("6a15")||n.includes("UnknownDeviceExchangeError")}async function M(e){process.stderr.write(`Installing ${e} app on your Ledger...
8
+ `);let{OpenAppWithDependenciesDeviceAction:n}=y(),t=new n({input:{appName:e}}),i=p().executeDeviceAction({sessionId:S(),deviceAction:t});await w(i,`Install ${e}`,18e4),process.stderr.write(`Installed ${e} app
9
+ `)}async function L(e){let n=k[e],t=P[n],s=await R();if(s===t||!s||x.has(s))return;process.stderr.write(`Opening ${t} app on your Ledger...
10
+ `);let{OpenAppDeviceAction:i}=y(),a=new i({input:{appName:t}}),d=p().executeDeviceAction({sessionId:S(),deviceAction:a});try{await w(d,`Open ${t}`)}catch(o){if(O(o)){await A(),await M(t),await A();return}if(!String(o).includes("isconnect"))throw o}await A()}async function A(){try{await p().disconnect({sessionId:m})}catch{}m=null,await new Promise(e=>setTimeout(e,500)),await I()}function T(e,n=0){switch(e){case"ethereum":return`44'/60'/${n}'/0/0`;case"solana":return`44'/501'/${n}'/0'`;case"bitcoin":return`84'/0'/${n}'/0/0`;case"tron":return`44'/195'/${n}'/0/0`}}async function B(e){let n=k[e];await L(e);let t=T(n),s=S(),i=p();switch(n){case"ethereum":{let{SignerEthBuilder:a}=E(),d=new a({dmk:i,sessionId:s}).build().getAddress(t,{skipOpenApp:!1});return(await w(d,"Get Ethereum address")).address}case"solana":{let{SignerSolanaBuilder:a}=D(),d=new a({dmk:i,sessionId:s}).build().getAddress(t,{skipOpenApp:!1});return await w(d,"Get Solana address")}case"bitcoin":throw new Error("Bitcoin address derivation via Ledger is not yet supported.");case"tron":throw new Error("Tron address derivation via Ledger is not supported. The Ethereum signer cannot interact with the Tron Ledger app.")}}async function N(){let e={};try{e.ethereum=await B("ethereum")}catch(n){process.stderr.write(`Failed to get Ethereum address: ${n}
11
+ `)}try{e.solana=await B("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 q(e,n){let t=k[e];await L(e);let s=T(t),i=S(),a=p();switch(t){case"ethereum":{let{SignerEthBuilder:u}=E(),d=new u({dmk:a,sessionId:i}).build(),o=n.startsWith("0x")?Uint8Array.from(Buffer.from(n.slice(2),"hex")):Uint8Array.from(Buffer.from(n,"base64")),c=d.signTransaction(s,o,{skipOpenApp:!1}),g=await w(c,"Sign transaction");return{transaction:JSON.stringify({r:g.r,s:g.s,v:g.v})}}case"solana":{let{SignerSolanaBuilder:u}=D(),d=new u({dmk:a,sessionId:i}).build(),{VersionedTransaction:o}=await import("@solana/web3.js"),c=Uint8Array.from(Buffer.from(n,"base64")),g=o.deserialize(c),l=g.message.serialize(),r=d.signTransaction(s,l,{skipOpenApp:!1}),f=await w(r,"Sign Solana transaction");return g.signatures[0]=f,{transaction:Buffer.from(g.serialize()).toString("base64")}}case"bitcoin":throw new Error("Bitcoin transaction signing via Ledger is not yet supported. Use a software wallet for Bitcoin transactions.");case"tron":throw new Error("Tron transaction signing via Ledger is not supported. Use a software wallet for Tron transactions.")}}async function H(e,n){let t=k[e];await L(e);let s=T(t),i=S(),a=p();switch(t){case"ethereum":{let{SignerEthBuilder:u}=E(),o=new u({dmk:a,sessionId:i}).build().signMessage(s,n,{skipOpenApp:!1}),c=await w(o,"Sign message"),g=c.r.startsWith("0x")?c.r.slice(2):c.r,l=c.s.startsWith("0x")?c.s.slice(2):c.s,r=c.v.toString(16).padStart(2,"0");return{signature:`0x${g}${l}${r}`}}case"solana":{let{SignerSolanaBuilder:u}=D(),d=new u({dmk:a,sessionId:i}).build(),o=Buffer.from(n,"utf8").toString("hex"),c=d.signMessage(s,o,{skipOpenApp:!1}),g=await w(c,"Sign Solana message");return{signature:(await import("bs58")).default.encode(g)}}case"bitcoin":throw new Error("Bitcoin message signing via Ledger is not yet supported. Use a software wallet for Bitcoin message signing.");case"tron":throw new Error("Tron message signing via Ledger is not supported. Use a software wallet for Tron message signing.")}}async function F(){if(m){try{await p().disconnect({sessionId:m})}catch{}m=null}if(h){try{h.close()}catch{}h=null}}export{I as connectLedger,F as disconnectLedger,U as isLedgerConnected,B as ledgerGetAddress,N as ledgerGetAllAddresses,H as ledgerSignMessage,q 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 as d,b as y,e as l}from"./chunk-WUNFPTA5.js";import{a as u,h as f}from"./chunk-6XYBS7GN.js";import"./chunk-INE4OXJA.js";import"./chunk-LMDE72OE.js";import{Server as x}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as N}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as T,ListToolsRequestSchema as v}from"@modelcontextprotocol/sdk/types.js";import{zodToJsonSchema as q}from"zod-to-json-schema";var h=new Map(l.map(s=>[s.schema.name,s]));function A(s){let n=s.inputSchema;if(n.$ref&&n.definitions){let c=n.$ref.replace("#/definitions/","");return n.definitions[c]??n}return n}async function J(){let s=new x({name:"moonpay",version:u},{capabilities:{tools:{listChanged:!0}}}),n=l.map(e=>({name:e.schema.name,description:e.schema.description,inputSchema:q(e.schema.input)})),c=new Map;for(let e of y){if(h.has(e.name))continue;let t=A(e);c.set(e.name,t.properties??{}),n.push({name:e.name,description:e.description,inputSchema:{type:"object",properties:t.properties??{},...t.required?{required:t.required}:{},...t.additionalProperties!==void 0?{additionalProperties:t.additionalProperties}:{}}})}let g=new Map(n.map(e=>[e.name,e]));s.setRequestHandler(v,async()=>({tools:n.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema}))})),s.setRequestHandler(T,async e=>{let{name:t,arguments:o={}}=e.params;if(!g.has(t))return{content:[{type:"text",text:`Unknown tool: ${t}`}],isError:!0};try{let i=h.get(t);if(i){let p=i.schema.input.shape??{};for(let[m,a]of Object.entries(p))o[m]===void 0&&a._def.typeName==="ZodNullable"&&(o[m]=null);let r=await i.handler(o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}let b=c.get(t)??{};for(let[p,r]of Object.entries(b))o[p]===void 0&&(Array.isArray(r.type)?r.type.includes("null"):r.anyOf?.some(R=>R.type==="null"))&&(o[p]=null),(r.type==="number"||r.type==="integer"||Array.isArray(r.type)&&r.type.some(a=>a==="number"||a==="integer")||r.anyOf?.some(a=>a.type==="number"||a.type==="integer"))&&typeof o[p]=="string"&&(o[p]=Number(o[p]));let w=f(),O=await d(w,t,o);return{content:[{type:"text",text:JSON.stringify(O,null,2)}]}}catch(i){return{content:[{type:"text",text:i instanceof Error?i.message:String(i)}],isError:!0}}});let S=new N;await s.connect(S)}export{J as startMcpServer};
2
+ import{a as d,b as y,e as l}from"./chunk-5RZNEJ6M.js";import{a as u,h as f}from"./chunk-YCWUFUSB.js";import"./chunk-INE4OXJA.js";import"./chunk-LMDE72OE.js";import{Server as x}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as N}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as T,ListToolsRequestSchema as v}from"@modelcontextprotocol/sdk/types.js";import{zodToJsonSchema as q}from"zod-to-json-schema";var h=new Map(l.map(s=>[s.schema.name,s]));function A(s){let n=s.inputSchema;if(n.$ref&&n.definitions){let c=n.$ref.replace("#/definitions/","");return n.definitions[c]??n}return n}async function J(){let s=new x({name:"moonpay",version:u},{capabilities:{tools:{listChanged:!0}}}),n=l.map(e=>({name:e.schema.name,description:e.schema.description,inputSchema:q(e.schema.input)})),c=new Map;for(let e of y){if(h.has(e.name))continue;let t=A(e);c.set(e.name,t.properties??{}),n.push({name:e.name,description:e.description,inputSchema:{type:"object",properties:t.properties??{},...t.required?{required:t.required}:{},...t.additionalProperties!==void 0?{additionalProperties:t.additionalProperties}:{}}})}let g=new Map(n.map(e=>[e.name,e]));s.setRequestHandler(v,async()=>({tools:n.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema}))})),s.setRequestHandler(T,async e=>{let{name:t,arguments:o={}}=e.params;if(!g.has(t))return{content:[{type:"text",text:`Unknown tool: ${t}`}],isError:!0};try{let i=h.get(t);if(i){let p=i.schema.input.shape??{};for(let[m,a]of Object.entries(p))o[m]===void 0&&a._def.typeName==="ZodNullable"&&(o[m]=null);let r=await i.handler(o);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}let b=c.get(t)??{};for(let[p,r]of Object.entries(b))o[p]===void 0&&(Array.isArray(r.type)?r.type.includes("null"):r.anyOf?.some(R=>R.type==="null"))&&(o[p]=null),(r.type==="number"||r.type==="integer"||Array.isArray(r.type)&&r.type.some(a=>a==="number"||a==="integer")||r.anyOf?.some(a=>a.type==="number"||a.type==="integer"))&&typeof o[p]=="string"&&(o[p]=Number(o[p]));let w=f(),O=await d(w,t,o);return{content:[{type:"text",text:JSON.stringify(O,null,2)}]}}catch(i){return{content:[{type:"text",text:i instanceof Error?i.message:String(i)}],isError:!0}}});let S=new N;await s.connect(S)}export{J as startMcpServer};
@@ -1,2 +1,2 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{m as a,n as b,o as c,p as d,q as e,r as f,s as g,t as h}from"./chunk-6XYBS7GN.js";import"./chunk-INE4OXJA.js";import"./chunk-LMDE72OE.js";export{f as addWallet,d as findWallet,e as findWalletOrThrow,a as loadWallets,c as mutateWallets,g as removeWallet,h as resolveSigningKey,b as saveWallets};
2
+ import{m as a,n as b,o as c,p as d,q as e,r as f,s as g,t as h}from"./chunk-YCWUFUSB.js";import"./chunk-INE4OXJA.js";import"./chunk-LMDE72OE.js";export{f as addWallet,d as findWallet,e as findWalletOrThrow,a as loadWallets,c as mutateWallets,g as removeWallet,h as resolveSigningKey,b as saveWallets};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonpay/cli",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "description": "MoonPay CLI — crypto infrastructure for AI agents",
5
5
  "homepage": "https://agents.moonpay.com",
6
6
  "publishConfig": {
@@ -1,12 +0,0 @@
1
- process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
- import{e as v}from"./chunk-INE4OXJA.js";import{a as y}from"./chunk-LMDE72OE.js";var $=3e4,C=new Set(["BOLOS","dashboard",""]),b=`Ledger support requires additional packages.
3
- Run: npm i -g @moonpay/cli --include=optional`;function h(){try{let e=y("@ledgerhq/device-management-kit"),n=y("@ledgerhq/device-transport-kit-node-hid"),t=y("rxjs");return{...e,...n,...t}}catch{throw new Error(b)}}function E(){try{return y("@ledgerhq/device-signer-kit-ethereum")}catch{throw new Error(b)}}function D(){try{return y("@ledgerhq/device-signer-kit-solana")}catch{throw new Error(b)}}var S=null,m=null;function l(){if(!S){let e=h();S=new e.DeviceManagementKitBuilder().addTransport(e.nodeHidTransportFactory).build()}return S}function k(){if(!m)throw new Error("No Ledger device connected. Connect first.");return m}var I={"unlock-device":"Unlock your Ledger device","confirm-open-app":"Confirm opening the app on your Ledger","sign-transaction":"Review and sign the transaction on your Ledger","sign-personal-message":"Review and sign the message on your Ledger","verify-address":"Verify the address shown on your Ledger"};async function w(e,n,t=6e4){let{DeviceActionStatus:r}=h();return new Promise((s,a)=>{let d="",c=!1,i=p=>{c||(c=!0,clearTimeout(g),u.unsubscribe(),p())},g=setTimeout(()=>{i(()=>{e.cancel(),a(new Error(`${n} timed out after ${t/1e3}s. Make sure the correct app is open on your Ledger and try again.`))})},t),u=e.observable.subscribe({next:p=>{switch(p.status){case r.Pending:{let o=p.intermediateValue?.requiredUserInteraction??"";if(o&&o!=="none"&&o!==d){d=o;let f=I[o]??o;f&&process.stderr.write(` ${f}
4
- `)}break}case r.Completed:i(()=>s(p.output));break;case r.Error:i(()=>{let o=p.error,f=o instanceof Error?o.message:o&&typeof o=="object"?o._tag??o.message??JSON.stringify(o):String(o);a(new Error(`${n} failed: ${f}`))});break;case r.Stopped:i(()=>a(new Error(`${n} was cancelled`)));break}},error:p=>i(()=>a(p))})})}async function U(){try{let e=h(),n=l(),t=n.startDiscovering({});return await e.firstValueFrom(t.pipe(e.take(1),e.timeout(3e3))).finally(()=>{n.stopDiscovering()}),!0}catch{return!1}}async function x(){let e=h(),n=l().startDiscovering({});process.stderr.write(`Scanning for Ledger devices via USB...
5
- `);let t=await e.firstValueFrom(n.pipe(e.take(1),e.timeout($))).finally(()=>{l().stopDiscovering()}),r=t.deviceModel.model??t.deviceModel.id;return process.stderr.write(`Connecting to Ledger ${r}...
6
- `),m=await l().connect({device:t,sessionRefresherOptions:{isRefresherDisabled:!0}}),process.stderr.write(`Connected to Ledger ${r}
7
- `),m}async function R(){if(!m)return null;try{let n=l().getDeviceSessionState({sessionId:m}),t=null;return n.subscribe(s=>{s.sessionStateType==="readyWithoutSecureChannel"&&(t=s.currentApp?.name??null)}).unsubscribe(),t}catch{return null}}var P={ethereum:"Ethereum",solana:"Solana",bitcoin:"Bitcoin",tron:"Tron"};function O(e){let n=String(e);return n.includes("6807")||n.includes("6a15")||n.includes("UnknownDeviceExchangeError")}async function M(e){process.stderr.write(`Installing ${e} app on your Ledger...
8
- `);let{OpenAppWithDependenciesDeviceAction:n}=h(),t=new n({input:{appName:e}}),s=l().executeDeviceAction({sessionId:k(),deviceAction:t});await w(s,`Install ${e}`,18e4),process.stderr.write(`Installed ${e} app
9
- `)}async function L(e){let n=v[e],t=P[n],r=await R();if(r===t||!r||C.has(r))return;process.stderr.write(`Opening ${t} app on your Ledger...
10
- `);let{OpenAppDeviceAction:s}=h(),a=new s({input:{appName:t}}),c=l().executeDeviceAction({sessionId:k(),deviceAction:a});try{await w(c,`Open ${t}`)}catch(i){if(O(i)){await A(),await M(t),await A();return}if(!String(i).includes("isconnect"))throw i}await A()}async function A(){try{await l().disconnect({sessionId:m})}catch{}m=null,await new Promise(e=>setTimeout(e,500)),await x()}function T(e,n=0){switch(e){case"ethereum":return`44'/60'/${n}'/0/0`;case"solana":return`44'/501'/${n}'/0'`;case"bitcoin":return`84'/0'/${n}'/0/0`;case"tron":return`44'/195'/${n}'/0/0`}}async function B(e){let n=v[e];await L(e);let t=T(n),r=k(),s=l();switch(n){case"ethereum":{let{SignerEthBuilder:a}=E(),c=new a({dmk:s,sessionId:r}).build().getAddress(t,{skipOpenApp:!1});return(await w(c,"Get Ethereum address")).address}case"solana":{let{SignerSolanaBuilder:a}=D(),c=new a({dmk:s,sessionId:r}).build().getAddress(t,{skipOpenApp:!1});return await w(c,"Get Solana address")}case"bitcoin":throw new Error("Bitcoin address derivation via Ledger is not yet supported.");case"tron":throw new Error("Tron address derivation via Ledger is not supported. The Ethereum signer cannot interact with the Tron Ledger app.")}}async function N(){let e={};try{e.ethereum=await B("ethereum")}catch(n){process.stderr.write(`Failed to get Ethereum address: ${n}
11
- `)}try{e.solana=await B("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 q(e,n){let t=v[e];await L(e);let r=T(t),s=k(),a=l();switch(t){case"ethereum":{let{SignerEthBuilder:d}=E(),c=new d({dmk:a,sessionId:s}).build(),i=n.startsWith("0x")?Uint8Array.from(Buffer.from(n.slice(2),"hex")):Uint8Array.from(Buffer.from(n,"base64")),g=c.signTransaction(r,i,{skipOpenApp:!1}),u=await w(g,"Sign transaction");return{transaction:JSON.stringify({r:u.r,s:u.s,v:u.v})}}case"solana":{let{SignerSolanaBuilder:d}=D(),c=new d({dmk:a,sessionId:s}).build(),{VersionedTransaction:i}=await import("@solana/web3.js"),g=Uint8Array.from(Buffer.from(n,"base64")),u=i.deserialize(g),p=u.message.serialize(),o=c.signTransaction(r,p,{skipOpenApp:!1}),f=await w(o,"Sign Solana transaction");return u.signatures[0]=f,{transaction:Buffer.from(u.serialize()).toString("base64")}}case"bitcoin":throw new Error("Bitcoin transaction signing via Ledger is not yet supported. Use a software wallet for Bitcoin transactions.");case"tron":throw new Error("Tron transaction signing via Ledger is not supported. Use a software wallet for Tron transactions.")}}async function H(e,n){let t=v[e];await L(e);let r=T(t),s=k(),a=l();switch(t){case"ethereum":{let{SignerEthBuilder:d}=E(),i=new d({dmk:a,sessionId:s}).build().signMessage(r,n,{skipOpenApp:!1}),g=await w(i,"Sign message"),u=g.v.toString(16).padStart(2,"0");return{signature:`0x${g.r}${g.s}${u}`}}case"solana":{let{SignerSolanaBuilder:d}=D(),c=new d({dmk:a,sessionId:s}).build(),i=Buffer.from(n,"utf8").toString("hex"),g=c.signMessage(r,i,{skipOpenApp:!1}),u=await w(g,"Sign Solana message");return{signature:(await import("bs58")).default.encode(u)}}case"bitcoin":throw new Error("Bitcoin message signing via Ledger is not yet supported. Use a software wallet for Bitcoin message signing.");case"tron":throw new Error("Tron message signing via Ledger is not supported. Use a software wallet for Tron message signing.")}}async function F(){if(m){try{await l().disconnect({sessionId:m})}catch{}m=null}}export{x as connectLedger,F as disconnectLedger,U as isLedgerConnected,B as ledgerGetAddress,N as ledgerGetAllAddresses,H as ledgerSignMessage,q as ledgerSignTransaction};