@moonpay/cli 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  process.noDeprecation = true; import { createRequire as __createRequire } from "module"; const require = __createRequire(import.meta.url);
2
2
  import{a as z,b as Q,c as Z,d as Se,e as ee,g as te,h as re,l as ne}from"./chunk-XJWHTFJ5.js";import{a as we,b as H,d as xe,f as q}from"./chunk-LMDE72OE.js";var le={};xe(le,{ensureEncryptionKey:()=>U,getEncryptionKey:()=>T});import{execFileSync as b,execSync as Re}from"child_process";import{randomBytes as Pe}from"crypto";import{existsSync as $e,readFileSync as He,writeFileSync as De}from"fs";import{homedir as Be,platform as ce}from"os";import{join as Ue}from"path";function Le(e){try{b("security",["delete-generic-password","-s",m,"-a",x],{stdio:"ignore"})}catch{}b("security",["add-generic-password","-s",m,"-a",x,"-w",e],{stdio:"ignore"})}function Me(){try{return b("security",["find-generic-password","-s",m,"-a",x,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function Je(e){Re(`printf '%s' | secret-tool store --label="${m}" service "${m}" account "${x}"`,{input:e,stdio:["pipe","ignore","ignore"]})}function je(){try{return b("secret-tool",["lookup","service",m,"account",x],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function Ve(e){p(),De(O,e,{encoding:"utf-8",mode:384})}function Ye(){try{return $e(O)&&He(O,"utf-8").trim()||null}catch{return null}}function Ge(e){try{let t=ce();return t==="darwin"?(Le(e),!0):t==="linux"?(Je(e),!0):!1}catch{return!1}}function Xe(){let e=ce();return e==="darwin"?Me():e==="linux"?je():null}function T(){let e=process.env.MOONPAY_ENCRYPTION_KEY;return e||(Xe()??Ye())}function U(){let e=T();if(e)return e;let t=Pe(32).toString("hex");return Ge(t)||(Ve(t),process.stderr.write("Note: Keychain unavailable. Encryption key stored in "+O+`
3
- `)),t}var m,x,O,L=H(()=>{"use strict";M();m="moonpay-cli",x="encryption-key",O=Ue(Be(),".config","moonpay",".encryption-key")});import{readFileSync as qe}from"fs";import{join as ze}from"path";import{homedir as Qe}from"os";function rt(){if(S!==void 0)return S;try{S=JSON.parse(qe(ze(Qe(),".config","moonpay","consent.json"),"utf-8")).agentId??null}catch{S=null}return S??null}function fe(){let e={"Content-Type":"application/json",[et]:Ze},t=rt();return t&&(e[tt]=t),e}var Ze,et,tt,S,ue=H(()=>{"use strict";Ze="1.0.2",et="X-CLI-Version",tt="X-Agent-Id"});import*as s from"fs";import*as de from"os";import*as E from"path";function p(){s.existsSync(C)||s.mkdirSync(C,{recursive:!0,mode:448})}function pe(e,t,r){let n=e+`.tmp.${process.pid}`;s.writeFileSync(n,t,{encoding:"utf-8",mode:r}),s.renameSync(n,e)}function ot(){p();try{let e=s.openSync(v,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY,384);s.writeSync(e,JSON.stringify({pid:process.pid,ts:Date.now()})),s.closeSync(e)}catch(e){if(e.code!=="EEXIST")throw e;try{let t=JSON.parse(s.readFileSync(v,"utf-8"));if(Date.now()-t.ts<nt)return null}catch{}try{s.unlinkSync(v)}catch{}try{let t=s.openSync(v,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY,384);s.writeSync(t,JSON.stringify({pid:process.pid,ts:Date.now()})),s.closeSync(t)}catch{return null}}return()=>{try{s.unlinkSync(v)}catch{}}}function ye(){if(!s.existsSync(J))return null;try{let e=JSON.parse(s.readFileSync(J,"utf-8"));return e.baseUrl?e:null}catch{return null}}function Xt(){let e=ye();return e||(it(j),j)}function I(){if(!s.existsSync(k))return null;let e=T();if(!e)return null;try{let t=JSON.parse(s.readFileSync(k,"utf-8")),r=z.parse(t),n=Z(r,e),o=JSON.parse(n);return!o.accessToken||!o.baseUrl?null:o}catch{return null}}function st(e){let t=U(),r=Q(JSON.stringify(e),t);p(),pe(k,JSON.stringify(r,null,2),384)}function it(e){p(),pe(J,JSON.stringify(e,null,2),384)}function qt(){s.existsSync(k)&&s.unlinkSync(k)}function zt(){let e=ye(),t=I();return e?.baseUrl??t?.baseUrl??j.baseUrl}async function at(e,t,r){let n=await fetch(`${e}/api/tools/${encodeURIComponent(t)}`,{method:"POST",signal:AbortSignal.timeout(15e3),headers:fe(),body:JSON.stringify(r)}),o=await n.json();if(!n.ok){let i=o;throw new Error(i?.error??`${t} failed (${n.status})`)}return o}async function ct(e){if(!e.refreshToken)throw new Error("No refresh token available");let t=ot();if(!t){await new Promise(n=>setTimeout(n,2e3));let r=I();if(r&&r.expiresAt>Date.now())return r;throw new Error("Token refresh failed (concurrent refresh in progress)")}try{let r=I();if(r&&r.expiresAt>Date.now()+6e4)return r;let n=await at(e.baseUrl,"refresh",{refreshToken:e.refreshToken}),o={accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt*1e3,baseUrl:e.baseUrl};return st(o),o}finally{t()}}async function Qt(){let e=I();if(!e)return null;if(Date.now()>=e.expiresAt-lt){if(e.refreshToken)try{return(await ct(e)).accessToken}catch{return null}return null}return e.accessToken}var C,J,k,v,j,nt,lt,M=H(()=>{"use strict";ee();L();ue();C=E.join(de.homedir(),".config","moonpay"),J=E.join(C,"config.json"),k=E.join(C,"credentials.json"),v=E.join(C,".credentials.lock"),j={baseUrl:"https://agents.moonpay.com"};nt=3e4;lt=300*1e3});import{existsSync as Y,readFileSync as me,writeFileSync as ft,renameSync as ge}from"fs";import{join as N}from"path";import{homedir as ut}from"os";import{randomBytes as dt}from"crypto";import*as a from"@local-wallet-standard/node";import he from"bs58";import{createHash as oe}from"crypto";import{HDKey as D}from"@scure/bip32";import{mnemonicToSeedSync as w}from"@scure/bip39";import{keccak_256 as B}from"@noble/hashes/sha3";import{derivePath as se}from"ed25519-hd-key";import*as ie from"bitcoinjs-lib";import ve from"ecpair";import*as _ from"tiny-secp256k1";import{Keypair as Ce}from"@solana/web3.js";import ke from"bs58";import{WalletContractV5R1 as Ee}from"@ton/ton";import{keyPairFromSeed as Ke}from"@ton/crypto";var We=ve(_);function ae(e,t,r=0){switch(t){case"solana":return Ae(e,r);case"ethereum":return _e(e,r);case"bitcoin":return Te(e,r);case"tron":return Ie(e,r);case"ton":return Fe(e,r)}}function Ae(e,t){let r=w(e),n=`m/44'/501'/${t}'/0'`,{key:o}=se(n,Buffer.from(r).toString("hex")),i=Ce.fromSeed(Uint8Array.from(o));return{privateKey:i.secretKey,address:i.publicKey.toBase58()}}function _e(e,t){let r=w(e),n=D.fromMasterSeed(r),o=`m/44'/60'/${t}'/0/0`,i=n.derive(o);if(!i.privateKey)throw new Error("Failed to derive EVM private key");let c=be(i.publicKey);return{privateKey:i.privateKey,address:c}}function be(e){let t=_.pointCompress(e,!1),n=B(t.slice(1)).slice(-20),o="0x"+Buffer.from(n).toString("hex");return Oe(o)}function Oe(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 Te(e,t){let r=w(e),n=D.fromMasterSeed(r),o=`m/84'/0'/${t}'/0/0`,i=n.derive(o);if(!i.privateKey)throw new Error("Failed to derive Bitcoin private key");let c=We.fromPrivateKey(Buffer.from(i.privateKey)),{address:y}=ie.payments.p2wpkh({pubkey:Buffer.from(c.publicKey)});if(!y)throw new Error("Failed to derive Bitcoin address");return{privateKey:i.privateKey,address:y}}function Ie(e,t){let r=w(e),n=D.fromMasterSeed(r),o=`m/44'/195'/${t}'/0/0`,i=n.derive(o);if(!i.privateKey)throw new Error("Failed to derive Tron private key");let c=Ne(i.publicKey);return{privateKey:i.privateKey,address:c}}function Ne(e){let t=_.pointCompress(e,!1),n=B(t.slice(1)).slice(-20),o=Buffer.concat([Buffer.from([65]),Buffer.from(n)]),i=oe("sha256").update(o).digest(),c=oe("sha256").update(i).digest(),y=Buffer.concat([o,c.slice(0,4)]);return ke.encode(y)}function Fe(e,t){let r=w(e),n=`m/44'/607'/${t}'/0'`,{key:o}=se(n,Buffer.from(r).toString("hex")),i=Ke(Buffer.from(o)),c=Ee.create({publicKey:Buffer.from(i.publicKey)});return{privateKey:i.secretKey,address:c.address.toString({bounceable:!1})}}M();var F=N(ut(),".config","moonpay"),V=N(F,"hardware-wallets.json");function f(){return F}function pt(e){let t={};for(let r of e){let n=re[r.chainId];n&&(t[n]=r.address)}return t}function g(e){return{name:e.name,type:"hd",addresses:pt(e.accounts),createdAt:e.createdAt}}function d(){if(!Y(V))return[];try{return(JSON.parse(me(V,"utf-8")).wallets??[]).map(t=>ne.parse(t))}catch{return[]}}function yt(e,t){p();let r=N(F,`.tmp.${dt(4).toString("hex")}`);ft(r,JSON.stringify(t,null,2),{mode:384}),ge(r,e)}function h(e){yt(V,{wallets:e})}var K=N(F,"wallets.json");function G(){if(Y(K)){process.stderr.write(`Migrating legacy wallets...
3
+ `)),t}var m,x,O,L=H(()=>{"use strict";M();m="moonpay-cli",x="encryption-key",O=Ue(Be(),".config","moonpay",".encryption-key")});import{readFileSync as qe}from"fs";import{join as ze}from"path";import{homedir as Qe}from"os";function rt(){if(S!==void 0)return S;try{S=JSON.parse(qe(ze(Qe(),".config","moonpay","consent.json"),"utf-8")).agentId??null}catch{S=null}return S??null}function fe(){let e={"Content-Type":"application/json",[et]:Ze},t=rt();return t&&(e[tt]=t),e}var Ze,et,tt,S,ue=H(()=>{"use strict";Ze="1.1.1",et="X-CLI-Version",tt="X-Agent-Id"});import*as s from"fs";import*as de from"os";import*as E from"path";function p(){s.existsSync(C)||s.mkdirSync(C,{recursive:!0,mode:448})}function pe(e,t,r){let n=e+`.tmp.${process.pid}`;s.writeFileSync(n,t,{encoding:"utf-8",mode:r}),s.renameSync(n,e)}function ot(){p();try{let e=s.openSync(v,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY,384);s.writeSync(e,JSON.stringify({pid:process.pid,ts:Date.now()})),s.closeSync(e)}catch(e){if(e.code!=="EEXIST")throw e;try{let t=JSON.parse(s.readFileSync(v,"utf-8"));if(Date.now()-t.ts<nt)return null}catch{}try{s.unlinkSync(v)}catch{}try{let t=s.openSync(v,s.constants.O_CREAT|s.constants.O_EXCL|s.constants.O_WRONLY,384);s.writeSync(t,JSON.stringify({pid:process.pid,ts:Date.now()})),s.closeSync(t)}catch{return null}}return()=>{try{s.unlinkSync(v)}catch{}}}function ye(){if(!s.existsSync(J))return null;try{let e=JSON.parse(s.readFileSync(J,"utf-8"));return e.baseUrl?e:null}catch{return null}}function Xt(){let e=ye();return e||(it(j),j)}function I(){if(!s.existsSync(k))return null;let e=T();if(!e)return null;try{let t=JSON.parse(s.readFileSync(k,"utf-8")),r=z.parse(t),n=Z(r,e),o=JSON.parse(n);return!o.accessToken||!o.baseUrl?null:o}catch{return null}}function st(e){let t=U(),r=Q(JSON.stringify(e),t);p(),pe(k,JSON.stringify(r,null,2),384)}function it(e){p(),pe(J,JSON.stringify(e,null,2),384)}function qt(){s.existsSync(k)&&s.unlinkSync(k)}function zt(){let e=ye(),t=I();return e?.baseUrl??t?.baseUrl??j.baseUrl}async function at(e,t,r){let n=await fetch(`${e}/api/tools/${encodeURIComponent(t)}`,{method:"POST",signal:AbortSignal.timeout(15e3),headers:fe(),body:JSON.stringify(r)}),o=await n.json();if(!n.ok){let i=o;throw new Error(i?.error??`${t} failed (${n.status})`)}return o}async function ct(e){if(!e.refreshToken)throw new Error("No refresh token available");let t=ot();if(!t){await new Promise(n=>setTimeout(n,2e3));let r=I();if(r&&r.expiresAt>Date.now())return r;throw new Error("Token refresh failed (concurrent refresh in progress)")}try{let r=I();if(r&&r.expiresAt>Date.now()+6e4)return r;let n=await at(e.baseUrl,"refresh",{refreshToken:e.refreshToken}),o={accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt*1e3,baseUrl:e.baseUrl};return st(o),o}finally{t()}}async function Qt(){let e=I();if(!e)return null;if(Date.now()>=e.expiresAt-lt){if(e.refreshToken)try{return(await ct(e)).accessToken}catch{return null}return null}return e.accessToken}var C,J,k,v,j,nt,lt,M=H(()=>{"use strict";ee();L();ue();C=E.join(de.homedir(),".config","moonpay"),J=E.join(C,"config.json"),k=E.join(C,"credentials.json"),v=E.join(C,".credentials.lock"),j={baseUrl:"https://agents.moonpay.com"};nt=3e4;lt=300*1e3});import{existsSync as Y,readFileSync as me,writeFileSync as ft,renameSync as ge}from"fs";import{join as N}from"path";import{homedir as ut}from"os";import{randomBytes as dt}from"crypto";import*as a from"@local-wallet-standard/node";import he from"bs58";import{createHash as oe}from"crypto";import{HDKey as D}from"@scure/bip32";import{mnemonicToSeedSync as w}from"@scure/bip39";import{keccak_256 as B}from"@noble/hashes/sha3";import{derivePath as se}from"ed25519-hd-key";import*as ie from"bitcoinjs-lib";import ve from"ecpair";import*as _ from"tiny-secp256k1";import{Keypair as Ce}from"@solana/web3.js";import ke from"bs58";import{WalletContractV5R1 as Ee}from"@ton/ton";import{keyPairFromSeed as Ke}from"@ton/crypto";var We=ve(_);function ae(e,t,r=0){switch(t){case"solana":return Ae(e,r);case"ethereum":return _e(e,r);case"bitcoin":return Te(e,r);case"tron":return Ie(e,r);case"ton":return Fe(e,r)}}function Ae(e,t){let r=w(e),n=`m/44'/501'/${t}'/0'`,{key:o}=se(n,Buffer.from(r).toString("hex")),i=Ce.fromSeed(Uint8Array.from(o));return{privateKey:i.secretKey,address:i.publicKey.toBase58()}}function _e(e,t){let r=w(e),n=D.fromMasterSeed(r),o=`m/44'/60'/${t}'/0/0`,i=n.derive(o);if(!i.privateKey)throw new Error("Failed to derive EVM private key");let c=be(i.publicKey);return{privateKey:i.privateKey,address:c}}function be(e){let t=_.pointCompress(e,!1),n=B(t.slice(1)).slice(-20),o="0x"+Buffer.from(n).toString("hex");return Oe(o)}function Oe(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 Te(e,t){let r=w(e),n=D.fromMasterSeed(r),o=`m/84'/0'/${t}'/0/0`,i=n.derive(o);if(!i.privateKey)throw new Error("Failed to derive Bitcoin private key");let c=We.fromPrivateKey(Buffer.from(i.privateKey)),{address:y}=ie.payments.p2wpkh({pubkey:Buffer.from(c.publicKey)});if(!y)throw new Error("Failed to derive Bitcoin address");return{privateKey:i.privateKey,address:y}}function Ie(e,t){let r=w(e),n=D.fromMasterSeed(r),o=`m/44'/195'/${t}'/0/0`,i=n.derive(o);if(!i.privateKey)throw new Error("Failed to derive Tron private key");let c=Ne(i.publicKey);return{privateKey:i.privateKey,address:c}}function Ne(e){let t=_.pointCompress(e,!1),n=B(t.slice(1)).slice(-20),o=Buffer.concat([Buffer.from([65]),Buffer.from(n)]),i=oe("sha256").update(o).digest(),c=oe("sha256").update(i).digest(),y=Buffer.concat([o,c.slice(0,4)]);return ke.encode(y)}function Fe(e,t){let r=w(e),n=`m/44'/607'/${t}'/0'`,{key:o}=se(n,Buffer.from(r).toString("hex")),i=Ke(Buffer.from(o)),c=Ee.create({publicKey:Buffer.from(i.publicKey)});return{privateKey:i.secretKey,address:c.address.toString({bounceable:!1})}}M();var F=N(ut(),".config","moonpay"),V=N(F,"hardware-wallets.json");function f(){return F}function pt(e){let t={};for(let r of e){let n=re[r.chainId];n&&(t[n]=r.address)}return t}function g(e){return{name:e.name,type:"hd",addresses:pt(e.accounts),createdAt:e.createdAt}}function d(){if(!Y(V))return[];try{return(JSON.parse(me(V,"utf-8")).wallets??[]).map(t=>ne.parse(t))}catch{return[]}}function yt(e,t){p();let r=N(F,`.tmp.${dt(4).toString("hex")}`);ft(r,JSON.stringify(t,null,2),{mode:384}),ge(r,e)}function h(e){yt(V,{wallets:e})}var K=N(F,"wallets.json");function G(){if(Y(K)){process.stderr.write(`Migrating legacy wallets...
4
4
  `);let{migrated:e,skipped:t}=mt();process.stderr.write(`Migrated ${e} wallet(s), skipped ${t}.
5
5
  `)}}function mt(){if(!Y(K))throw new Error("No legacy wallets.json found \u2014 nothing to migrate.");let{getEncryptionKey:e}=(L(),q(le)),{decrypt:t,encryptedFileSchema:r}=(ee(),q(Se)),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(me(K,"utf-8")),i=r.parse(o),c=t(i,n),y=JSON.parse(c).wallets??[],R=f(),A=d(),X=0,P=0;for(let l of y){try{a.getWallet(l.name,R),P++;continue}catch{}if(A.some(u=>u.name===l.name)){P++;continue}if(l.type==="hardware")A.push({name:l.name,type:"hardware",device:l.device,addresses:l.addresses,createdAt:l.createdAt});else if(l.type==="hd"&&l.mnemonic)a.importWalletMnemonic(l.name,l.mnemonic,null,null,R);else if(l.type==="imported"&&l.privateKey){let u=l.privateKey;if(!/^[0-9a-fA-F]+$/.test(u)){let $=he.decode(u);u=Buffer.from($.length===64?$.slice(0,32):$).toString("hex")}a.importWalletPrivateKey(l.name,u,null,R,null,u,u)}X++}return A.length>0&&h(A),ge(K,K+".migrated"),{migrated:X,skipped:P}}function gt(e){G(),W(e);let t=a.createWallet(e,null,24,f());return g(t)}function ht(e,t){W(e);let r=a.importWalletMnemonic(e,t,null,null,f());return g(r)}function wt(e,t){return W(e),g(a.importWalletPrivateKey(e,t,null,f()))}function xt(){G();let e=[];try{e=a.listWallets(f())}catch{}return[...e.map(r=>g(r)),...d()]}function St(e){G();let t=f();try{let r=a.getWallet(e,t);return g(r)}catch{}try{for(let r of a.listWallets(t))for(let n of r.accounts)if(n.address===e)return g(r)}catch{}for(let r of d()){if(r.name===e)return r;for(let n of Object.values(r.addresses))if(n===e)return r}return null}function cr(e){let t=St(e);if(!t)throw new Error(`Wallet "${e}" not found`);return t}function vt(e){try{a.deleteWallet(e,f());return}catch{}let t=d(),r=t.findIndex(n=>n.name===e);if(r===-1)throw new Error(`Wallet "${e}" not found`);t.splice(r,1),h(t)}function lr(e,t){if(e===t)return;W(t);try{a.getWallet(e,f()),a.renameWallet(e,t,f());return}catch(o){if(o instanceof Error&&!o.message.includes("not found"))throw o}let r=d(),n=r.find(o=>o.name===e);if(!n)throw new Error(`Wallet "${e}" not found`);n.name=t,h(r)}function fr(e){return a.exportWallet(e,null,f())}function Ct(e){W(e.name);let t=d();t.push(e),h(t)}function ur(e,t){let r=d(),n=r.find(o=>o.name===e);if(!n)throw new Error(`Hardware wallet "${e}" not found`);n.addresses=t,h(r)}function dr(e,t,r){return a.signTransaction(e,t,r,null,null,f())}function pr(e,t,r,n){return a.signMessage(e,t,r,null,n??null,null,f())}function yr(e,t){if(e.type==="hardware")throw new Error(`Wallet "${e.name}" is a hardware wallet. Signing must happen on the device.`);let r=te[t],n=a.exportWallet(e.name,null,f());if(n.includes(" "))return ae(n,r);let o;if(n.startsWith("{")){let c=JSON.parse(n);o=r==="solana"||r==="ton"?c.ed25519:c.secp256k1}else o=n;let i=Uint8Array.from(Buffer.from(o,"hex"));if(r==="solana"&&i.length===32){let c=we("tweetnacl");i=Uint8Array.from(c.sign.keyPair.fromSeed(i).secretKey)}return{privateKey:i,address:e.addresses[r]??""}}var kt=xt,mr=vt;function Et(e){if(e.type==="hardware"){Ct(e);return}if(e.type==="hd"&&e.mnemonic){ht(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=he.decode(t);t=Buffer.from(r.length===64?r.slice(0,32):r).toString("hex")}wt(e.name,t);return}gt(e.name)}function gr(e){for(let t of e)Et(t)}function hr(e){let t=kt();e(t),h(t.filter(r=>r.type==="hardware"))}function W(e){try{throw a.getWallet(e,f()),new Error(`Wallet "${e}" already exists`)}catch(t){if(t instanceof Error&&t.message.includes("already exists"))throw t}if(d().some(t=>t.name===e))throw new Error(`Wallet "${e}" already exists`)}export{Ze as a,fe as b,ue as c,p as d,Xt as e,I as f,st as g,qt as h,zt as i,at as j,ct as k,Qt as l,M as m,f as n,G as o,mt as p,gt as q,ht as r,wt as s,xt as t,St as u,cr as v,vt as w,lr as x,fr as y,Ct as z,ur as A,dr as B,pr as C,yr as D,kt as E,mr as F,Et as G,gr as H,hr as I};
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-WRXKKBGW.js";import{a as C,c as Y,i as A,m as H,u as J}from"./chunk-ROQAPDMH.js";import{g as v}from"./chunk-XJWHTFJ5.js";import"./chunk-LMDE72OE.js";H();import{Command as re}from"commander";var z=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function $(e){return t=>z?`${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-PQOCWPHS.js";import{a as C,c as Y,i as A,m as H,u as J}from"./chunk-R2GZHKKH.js";import{g as v}from"./chunk-XJWHTFJ5.js";import"./chunk-LMDE72OE.js";H();import{Command as re}from"commander";var z=!process.env.NO_COLOR&&process.stdout.isTTY===!0;function $(e){return t=>z?`${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 se(){return h.opts().json?"json":"yaml"}function D(e){console.log(F(e,se()))}function U(){let e=oe();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-D3HUA2HG.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 ie(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 ae(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=ie(u,m);try{let s=await n.handler(i);D(s)}catch(s){console.error(s.message),process.exit(1)}})}}function ce(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function le(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function fe(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function ue(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 me(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 pe(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=ce(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=le(s),d=fe(s);ue(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{me(i);let s=A(),l=await R(s,n.name,i);D(l),U()}catch(s){console.error(s.message),process.exit(1)}})}}ae(h,k);pe(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 se(){return h.opts().json?"json":"yaml"}function D(e){console.log(F(e,se()))}function U(){let e=oe();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-7YF77MF7.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 ie(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 ae(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=ie(u,m);try{let s=await n.handler(i);D(s)}catch(s){console.error(s.message),process.exit(1)}})}}function ce(e){if(e.$ref&&e.definitions){let t=e.$ref.replace("#/definitions/","");return e.definitions[t]}return e}function le(e){return Array.isArray(e.type)?e.type.includes("null"):e.anyOf?e.anyOf.some(t=>t.type==="null"):!1}function fe(e){return Array.isArray(e.type)?e.type.includes("object"):e.anyOf?e.anyOf.some(t=>t.type==="object"):e.type==="object"}function ue(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 me(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 pe(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=ce(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=le(s),d=fe(s);ue(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{me(i);let s=A(),l=await R(s,n.name,i);D(l),U()}catch(s){console.error(s.message),process.exit(1)}})}}ae(h,k);pe(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();
@@ -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-WRXKKBGW.js";import{a as u,c as x,i as f,m as N}from"./chunk-ROQAPDMH.js";import"./chunk-XJWHTFJ5.js";import"./chunk-LMDE72OE.js";import{Server as T}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as v}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as q,ListToolsRequestSchema as A}from"@modelcontextprotocol/sdk/types.js";import{zodToJsonSchema as M}from"zod-to-json-schema";N();x();var h=new Map(l.map(s=>[s.schema.name,s]));function k(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 _(){let s=new T({name:"moonpay",version:u},{capabilities:{tools:{listChanged:!0}}}),n=l.map(e=>({name:e.schema.name,description:e.schema.description,inputSchema:M(e.schema.input)})),c=new Map;for(let e of y){if(h.has(e.name))continue;let t=k(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(A,async()=>({tools:n.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema}))})),s.setRequestHandler(q,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 v;await s.connect(S)}export{_ as startMcpServer};
2
+ import{a as d,b as y,e as l}from"./chunk-PQOCWPHS.js";import{a as u,c as x,i as f,m as N}from"./chunk-R2GZHKKH.js";import"./chunk-XJWHTFJ5.js";import"./chunk-LMDE72OE.js";import{Server as T}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as v}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as q,ListToolsRequestSchema as A}from"@modelcontextprotocol/sdk/types.js";import{zodToJsonSchema as M}from"zod-to-json-schema";N();x();var h=new Map(l.map(s=>[s.schema.name,s]));function k(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 _(){let s=new T({name:"moonpay",version:u},{capabilities:{tools:{listChanged:!0}}}),n=l.map(e=>({name:e.schema.name,description:e.schema.description,inputSchema:M(e.schema.input)})),c=new Map;for(let e of y){if(h.has(e.name))continue;let t=k(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(A,async()=>({tools:n.map(e=>({name:e.name,description:e.description,inputSchema:e.inputSchema}))})),s.setRequestHandler(q,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 v;await s.connect(S)}export{_ 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{A as n,B as o,C as p,D as q,E as r,F as s,G as t,H as u,I as v,n as a,o as b,p as c,q as d,r as e,s as f,t as g,u as h,v as i,w as j,x as k,y as l,z as m}from"./chunk-ROQAPDMH.js";import"./chunk-XJWHTFJ5.js";import"./chunk-LMDE72OE.js";export{m as addHardwareWallet,t as addWallet,d as createWallet,j as deleteWallet,l as exportSecret,h as findWallet,i as findWalletOrThrow,a as getVaultPath,e as importMnemonic,f as importPrivateKey,g as listWallets,r as loadWallets,p as lwsSignMessage,o as lwsSignTransaction,c as migrateWallets,v as mutateWallets,n as refreshHardwareAddresses,s as removeWallet,k as renameWallet,b as requireMigrationCheck,q as resolveSigningKey,u as saveWallets};
2
+ import{A as n,B as o,C as p,D as q,E as r,F as s,G as t,H as u,I as v,n as a,o as b,p as c,q as d,r as e,s as f,t as g,u as h,v as i,w as j,x as k,y as l,z as m}from"./chunk-R2GZHKKH.js";import"./chunk-XJWHTFJ5.js";import"./chunk-LMDE72OE.js";export{m as addHardwareWallet,t as addWallet,d as createWallet,j as deleteWallet,l as exportSecret,h as findWallet,i as findWalletOrThrow,a as getVaultPath,e as importMnemonic,f as importPrivateKey,g as listWallets,r as loadWallets,p as lwsSignMessage,o as lwsSignTransaction,c as migrateWallets,v as mutateWallets,n as refreshHardwareAddresses,s as removeWallet,k as renameWallet,b as requireMigrationCheck,q as resolveSigningKey,u as saveWallets};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moonpay/cli",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "MoonPay CLI — how agents move money",
5
5
  "homepage": "https://agents.moonpay.com",
6
6
  "publishConfig": {
@@ -26,7 +26,7 @@
26
26
  "@ledgerhq/device-signer-kit-ethereum": "1.11.1",
27
27
  "@ledgerhq/device-signer-kit-solana": "1.6.2",
28
28
  "@ledgerhq/device-transport-kit-node-hid": "1.0.0",
29
- "@local-wallet-standard/node": "^0.2.23",
29
+ "@local-wallet-standard/node": "^0.2.25",
30
30
  "@modelcontextprotocol/sdk": "1.26.0",
31
31
  "@noble/hashes": "1.8.0",
32
32
  "@scure/bip32": "1.4.0",
@@ -26,7 +26,9 @@ mp wallet list
26
26
 
27
27
  ## Supported chains
28
28
 
29
- `solana`, `ethereum`, `base`, `polygon`, `arbitrum`, `optimism`
29
+ `solana`, `ethereum`, `base`, `polygon`, `arbitrum`, `optimism`, `bnb`, `avalanche`, `tron`, `bitcoin`, `ton`
30
+
31
+ Bitcoin uses a separate command: `mp bitcoin balance retrieve --wallet <btc-address>`
30
32
 
31
33
  ## Workflow
32
34
 
@@ -55,3 +57,4 @@ Use `mp -f table token balance list ...` for a quick table view, or `mp -f json
55
57
 
56
58
  - **moonpay-auth** — Set up wallets if none exist.
57
59
  - **moonpay-discover-tokens** — Research specific tokens in the portfolio.
60
+ - **moonpay-prediction-market** — Check prediction market positions and PnL.
@@ -127,7 +127,29 @@ Confirm both POL and USDC.e are present.
127
127
 
128
128
  ### 7. Trade on Polymarket
129
129
 
130
- Once funded, use the Polymarket CLI to trade:
130
+ Once funded, trade directly via MoonPay CLI:
131
+
132
+ ```bash
133
+ # Search markets
134
+ mp prediction-market market search --provider polymarket --query "bitcoin"
135
+
136
+ # Get trending markets
137
+ mp prediction-market market trending list --provider polymarket
138
+
139
+ # Register wallet (one-time)
140
+ mp prediction-market user create --provider polymarket --wallet <evm-address>
141
+
142
+ # Buy shares
143
+ mp prediction-market position buy --wallet main --provider polymarket --tokenId <token-id> --price 0.65 --size 100
144
+
145
+ # Check positions
146
+ mp prediction-market position list --provider polymarket --wallet <evm-address>
147
+
148
+ # Check PnL
149
+ mp prediction-market pnl retrieve --provider polymarket --wallet <evm-address>
150
+ ```
151
+
152
+ Or use the Polymarket CLI for advanced order types:
131
153
 
132
154
  ```bash
133
155
  polymarket markets search "query" # find markets
@@ -146,6 +168,7 @@ polymarket clob balance # check trading balance
146
168
 
147
169
  ## Related skills
148
170
 
171
+ - **moonpay-prediction-market** — Full prediction market trading guide
149
172
  - **moonpay-swap-tokens** — Bridge commands and supported chains
150
173
  - **moonpay-check-wallet** — Check Polygon balances
151
174
  - **moonpay-buy-crypto** — Buy POL or ETH with fiat
@@ -105,15 +105,38 @@ mp virtual-account retrieve
105
105
 
106
106
  If they have one, show the status and next step. If not, explain what it is and that they can set one up with `mp virtual-account create`.
107
107
 
108
- ## Mission 8: Skills
108
+ ## Mission 8: Prediction Markets
109
109
 
110
- **Goal:** Show what skills are available.
110
+ **Goal:** Browse prediction markets and understand how they work.
111
111
 
112
112
  ```bash
113
+ mp prediction-market market trending list --provider polymarket --limit 5
114
+ ```
115
+
116
+ Pick an interesting market and get details:
117
+
118
+ ```bash
119
+ mp prediction-market market event retrieve --provider polymarket --slug <slug-from-trending>
120
+ ```
121
+
122
+ Explain: prediction markets let you buy shares on outcomes. Price = implied probability. Shares pay $1 if the outcome resolves YES. Supports Polymarket (Polygon/USDC.e) and Kalshi (Solana/USDC).
123
+
124
+ ## Mission 9: Skills
125
+
126
+ **Goal:** Show what skills are available and how to manage them.
127
+
128
+ ```bash
129
+ # List all bundled skills
113
130
  mp skill list
131
+
132
+ # View a specific skill's instructions
133
+ mp skill retrieve --name moonpay-prediction-market
134
+
135
+ # Install all skills to Claude Code's skills directory
136
+ mp skill install
114
137
  ```
115
138
 
116
- Explain: skills are guides that teach agents how to use the CLI. Install them with `mp skill install`.
139
+ Explain: skills are guides that teach agents how to use the CLI for specific tasks. `mp skill list` shows all available skills. `mp skill retrieve --name <skill>` shows the full instructions for a specific skill. `mp skill install` copies all skills to `~/.claude/skills/` so Claude Code loads them automatically.
117
140
 
118
141
  ## Debrief
119
142
 
@@ -125,6 +148,7 @@ Summarize everything:
125
148
  - Generated a fiat buy link
126
149
  - Signed a message for verification
127
150
  - Explored virtual accounts
128
- - Discovered skills
151
+ - Browsed prediction markets
152
+ - Discovered and installed skills
129
153
 
130
154
  End with: "You're all set. Run `mp --help` to see all commands, or ask me anything."
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: moonpay-prediction-market
3
+ description: Trade on prediction markets (Polymarket, Kalshi). Search markets, buy/sell positions, track PnL, and view trade history.
4
+ tags: [trading, prediction-market, polymarket, kalshi]
5
+ ---
6
+
7
+ # Prediction markets
8
+
9
+ ## Goal
10
+
11
+ Search prediction markets, buy and sell outcome shares, track positions and PnL.
12
+
13
+ Supports two providers:
14
+ - **Polymarket** — runs on Polygon (USDC.e). Requires an EVM wallet.
15
+ - **Kalshi** — runs on Solana (USDC). Requires a Solana wallet.
16
+
17
+ ## Prerequisites
18
+
19
+ 1. Authenticate: `mp login --email <email>` then `mp verify --email <email> --code <code>`
20
+ 2. Have a local wallet: `mp wallet list` (create with `mp wallet create --name "main"` if needed)
21
+ 3. Register your wallet with the provider (one-time setup):
22
+
23
+ ```bash
24
+ # For Polymarket (use your EVM/Polygon address)
25
+ mp prediction-market user create --provider polymarket --wallet <evm-address>
26
+
27
+ # For Kalshi (use your Solana address)
28
+ mp prediction-market user create --provider kalshi --wallet <solana-address>
29
+ ```
30
+
31
+ 4. Fund the wallet — Polymarket needs USDC.e on Polygon, Kalshi needs USDC on Solana. See the **moonpay-fund-polymarket** or **moonpay-buy-crypto** skills.
32
+
33
+ ## Browse and research markets
34
+
35
+ ```bash
36
+ # Search markets by keyword
37
+ mp prediction-market market search --provider polymarket --query "bitcoin" --limit 10
38
+
39
+ # Get trending markets (sorted by 24h volume, min $150K)
40
+ mp prediction-market market trending list --provider polymarket --limit 10
41
+
42
+ # Browse market categories/tags
43
+ mp prediction-market market tag list --provider polymarket
44
+
45
+ # Filter markets by tag
46
+ mp prediction-market market search --provider polymarket --query "*" --tagIds "crypto,politics"
47
+
48
+ # Get full event details (all markets, outcomes, prices)
49
+ mp prediction-market market event retrieve --provider polymarket --slug <event-slug>
50
+
51
+ # Check current price for an outcome token
52
+ mp prediction-market market price retrieve --provider polymarket --tokenId <token-id>
53
+
54
+ # View price history for an outcome
55
+ mp prediction-market market price-history list --provider polymarket --tokenId <token-id> --interval 1w
56
+ ```
57
+
58
+ ## Buy and sell positions
59
+
60
+ ```bash
61
+ # Buy shares of an outcome
62
+ mp prediction-market position buy \
63
+ --wallet main \
64
+ --provider polymarket \
65
+ --tokenId <outcome-token-id> \
66
+ --price 0.65 \
67
+ --size 100
68
+
69
+ # Sell shares
70
+ mp prediction-market position sell \
71
+ --wallet main \
72
+ --provider polymarket \
73
+ --tokenId <outcome-token-id> \
74
+ --price 0.70 \
75
+ --size 50
76
+ ```
77
+
78
+ **Key concepts:**
79
+ - `tokenId` comes from `outcomeTokens[].tokenId` in market search results
80
+ - `price` is 0-1 (e.g., 0.65 = 65 cents per share, implies 65% probability)
81
+ - `size` is the number of shares
82
+ - Cost = price x size (e.g., 0.65 x 100 = $65 USDC)
83
+ - If the outcome resolves YES, each share pays $1. Profit = (1 - price) x size
84
+
85
+ ## Track positions and performance
86
+
87
+ ```bash
88
+ # View open positions
89
+ mp prediction-market position list --provider polymarket --wallet <address>
90
+
91
+ # View closed positions
92
+ mp prediction-market position list --provider polymarket --wallet <address> --status closed
93
+
94
+ # Get PnL summary
95
+ mp prediction-market pnl retrieve --provider polymarket --wallet <address>
96
+
97
+ # View trade history
98
+ mp prediction-market trade list --provider polymarket --wallet <address>
99
+
100
+ # View all activity (trades, splits, merges, redemptions)
101
+ mp prediction-market activity list --provider polymarket --wallet <address>
102
+ ```
103
+
104
+ ## Workflow
105
+
106
+ 1. **Discover**: Search or browse trending markets.
107
+ 2. **Research**: Get event details, check prices, review price history.
108
+ 3. **Trade**: Buy shares on outcomes you believe are mispriced.
109
+ 4. **Monitor**: Track positions and PnL.
110
+ 5. **Exit**: Sell positions when your thesis changes, or wait for resolution.
111
+
112
+ ## Example: trade a market
113
+
114
+ ```bash
115
+ # 1. Find a market
116
+ mp prediction-market market search --provider polymarket --query "bitcoin 100k"
117
+
118
+ # 2. Get event details (note the outcomeTokens)
119
+ mp prediction-market market event retrieve --provider polymarket --slug <slug-from-search>
120
+
121
+ # 3. Check price history
122
+ mp prediction-market market price-history list --provider polymarket --tokenId <yes-token-id> --interval 1w
123
+
124
+ # 4. Buy 50 "Yes" shares at 40 cents
125
+ mp prediction-market position buy --wallet main --provider polymarket --tokenId <yes-token-id> --price 0.40 --size 50
126
+
127
+ # 5. Check your position
128
+ mp prediction-market position list --provider polymarket --wallet <address>
129
+
130
+ # 6. Sell later at a higher price
131
+ mp prediction-market position sell --wallet main --provider polymarket --tokenId <yes-token-id> --price 0.60 --size 50
132
+ ```
133
+
134
+ ## Price history intervals
135
+
136
+ | Interval | Description |
137
+ |----------|-------------|
138
+ | `1hr` | Last hour |
139
+ | `1d` | Last day |
140
+ | `1w` | Last week |
141
+ | `1m` | Last month |
142
+ | `max` | All time |
143
+
144
+ ## Tips
145
+
146
+ - Use `mp -f json prediction-market ...` for programmatic output
147
+ - Markets with higher volume and liquidity have tighter spreads
148
+ - Check `acceptingOrders` — closed markets cannot be traded
149
+ - `negRisk` markets use a different settlement framework — the CLI handles this automatically
150
+ - Polymarket uses USDC.e on Polygon; Kalshi uses USDC on Solana
151
+
152
+ ## Related skills
153
+
154
+ - **moonpay-fund-polymarket** — Fund your Polymarket wallet with USDC.e and POL
155
+ - **moonpay-check-wallet** — Check Polygon/Solana balances
156
+ - **moonpay-swap-tokens** — Bridge tokens to Polygon
157
+ - **moonpay-trading-automation** — Automate trading strategies