@moonpay/cli 0.12.8 → 0.12.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-EYGDXGGY.js → chunk-GGQYZSAY.js} +1 -1
- package/dist/{chunk-TGGAWLNJ.js → chunk-HLZNAVGS.js} +13 -13
- package/dist/index.js +2 -2
- package/dist/ledger-WJT3D6CA.js +12 -0
- package/dist/{mcp-N4LMJANT.js → mcp-ZW7FWTF6.js} +1 -1
- package/dist/{store-T7DXSDE2.js → store-A6K3F4K7.js} +1 -1
- package/package.json +1 -1
- package/skills/moonpay-hardware-wallet/SKILL.md +2 -3
- package/dist/ledger-RME3PLAL.js +0 -12
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-
|
|
3
|
+
import{a as R,b as S,c as T,d as j,e as k}from"./chunk-HLZNAVGS.js";import{a as C,h as A,p as J}from"./chunk-GGQYZSAY.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-
|
|
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-ZW7FWTF6.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 S}from"./chunk-INE4OXJA.js";import{a as v}from"./chunk-LMDE72OE.js";var B=3e4;var T=`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(T)}}function I(){try{return v("@ledgerhq/device-signer-kit-ethereum")}catch{throw new Error(T)}}function D(){try{return v("@ledgerhq/device-signer-kit-solana")}catch{throw new Error(T)}}var h=null,l=null;function w(){if(!h){let e=y();h=new e.DeviceManagementKitBuilder().addTransport(e.nodeHidTransportFactory).build()}return h}function A(){if(!l)throw new Error("No Ledger device connected. Connect first.");return l}var C={"unlock-device":"ACTION REQUIRED: Unlock your Ledger device by entering your PIN","confirm-open-app":"ACTION REQUIRED: Confirm opening the app on your Ledger device screen","sign-transaction":"ACTION REQUIRED: Review and approve the transaction on your Ledger device screen","sign-personal-message":"ACTION REQUIRED: Review and approve the message on your Ledger device screen","verify-address":"ACTION REQUIRED: Verify the address shown on your Ledger device screen"};async function f(e,n,t=6e4){let{DeviceActionStatus:r}=y();return new Promise((a,o)=>{let d="",u=!1,i=c=>{u||(u=!0,clearTimeout(g),p.unsubscribe(),c())},g=setTimeout(()=>{i(()=>{e.cancel(),o(new Error(`${n} timed out after ${t/1e3}s. Make sure the correct app is open on your Ledger and try again.`))})},t),p=e.observable.subscribe({next:c=>{switch(c.status){case r.Pending:{let s=c.intermediateValue?.requiredUserInteraction??"";if(s&&s!=="none"&&s!==d){d=s;let m=C[s]??s;m&&process.stderr.write(` ${m}
|
|
4
|
+
`)}break}case r.Completed:i(()=>a(c.output));break;case r.Error:i(()=>{let s=c.error,m=s instanceof Error?s.message:s&&typeof s=="object"?s._tag??s.message??JSON.stringify(s):String(s);o(new Error(`${n} failed: ${m}`))});break;case r.Stopped:i(()=>o(new Error(`${n} was cancelled`)));break}},error:c=>i(()=>o(c))})})}async function O(){let e=y(),n=w().startDiscovering({});process.stderr.write(`Scanning for Ledger devices via USB...
|
|
5
|
+
`);let t=await e.firstValueFrom(n.pipe(e.take(1),e.timeout(B))).finally(()=>{w().stopDiscovering()}),r=t.deviceModel.model??t.deviceModel.id;process.stderr.write(`Connecting to Ledger ${r}...
|
|
6
|
+
`);let a=w();l=await a.connect({device:t});let o=a.getDeviceSessionState({sessionId:l});return await e.firstValueFrom(o.pipe(e.filter(d=>d.sessionStateType>=1),e.take(1),e.timeout(1e4))),process.stderr.write(`Connected to Ledger ${r}
|
|
7
|
+
`),l}async function P(){if(!l)return null;try{let e=y(),t=w().getDeviceSessionState({sessionId:l}),r=await e.firstValueFrom(t.pipe(e.take(1),e.timeout(3e3)));return r.sessionStateType>=1?r.currentApp?.name??null:null}catch{return null}}var U={ethereum:"Ethereum",solana:"Solana"};function M(e){let n=String(e);return n.includes("6807")||n.includes("6a15")||n.includes("UnknownDeviceExchangeError")}async function _(e){process.stderr.write(`Installing ${e} app on your Ledger...
|
|
8
|
+
`);let{OpenAppWithDependenciesDeviceAction:n}=y(),t=new n({input:{appName:e}}),a=w().executeDeviceAction({sessionId:A(),deviceAction:t});await f(a,`Install ${e}`,18e4),process.stderr.write(`Installed ${e} app
|
|
9
|
+
`)}async function R(e){let n=S[e],t=U[n];if(!t||await P()===t)return;process.stderr.write(`Opening ${t} app on your Ledger...
|
|
10
|
+
`);let{OpenAppDeviceAction:a}=y(),o=new a({input:{appName:t}}),u=w().executeDeviceAction({sessionId:A(),deviceAction:o});try{await f(u,`Open ${t}`)}catch(i){if(M(i)){await E(),await _(t),await E();return}if(!String(i).includes("isconnect"))throw i}await E()}async function E(){try{await w().disconnect({sessionId:l})}catch{}l=null,await new Promise(e=>setTimeout(e,500)),await O()}function L(e,n=0){switch(e){case"ethereum":return`44'/60'/${n}'/0/0`;case"solana":return`44'/501'/${n}'/0'`;case"bitcoin":case"tron":throw new Error(`${e} derivation via Ledger is not supported.`)}}function k(e){return e.startsWith("0x")?e.slice(2):e}function b(e){return e.startsWith("0x")?e:`0x${e}`}async function x(e){let n=S[e];if(n==="bitcoin")throw new Error("Bitcoin address derivation via Ledger is not yet supported.");if(n==="tron")throw new Error("Tron address derivation via Ledger is not supported. The Ethereum signer cannot interact with the Tron Ledger app.");await R(e);let t=L(n),r=A(),a=w();switch(n){case"ethereum":{let{SignerEthBuilder:o}=I(),u=new o({dmk:a,sessionId:r}).build().getAddress(t,{skipOpenApp:!1});return(await f(u,"Get Ethereum address")).address}case"solana":{let{SignerSolanaBuilder:o}=D(),u=new o({dmk:a,sessionId:r}).build().getAddress(t,{skipOpenApp:!1});return await f(u,"Get Solana address")}}}async function q(){let e={};try{e.ethereum=await x("ethereum")}catch(n){process.stderr.write(`Failed to get Ethereum address: ${n}
|
|
11
|
+
`)}try{e.solana=await x("solana")}catch(n){process.stderr.write(`Failed to get Solana address: ${n}
|
|
12
|
+
`)}if(!e.ethereum&&!e.solana)throw new Error("Could not derive any addresses from Ledger device");return e}async function F(e,n){let t=S[e];if(t==="bitcoin")throw new Error("Bitcoin transaction signing via Ledger is not yet supported. Use a software wallet for Bitcoin transactions.");if(t==="tron")throw new Error("Tron transaction signing via Ledger is not supported. Use a software wallet for Tron transactions.");await R(e);let r=L(t),a=A(),o=w();switch(t){case"ethereum":{let{SignerEthBuilder:d}=I(),u=new d({dmk:o,sessionId:a}).build(),i=b(n.startsWith("0x")?n:Buffer.from(n,"base64").toString("hex")),g=Uint8Array.from(Buffer.from(k(i),"hex")),p=u.signTransaction(r,g,{skipOpenApp:!1}),c=await f(p,"Sign transaction"),{parseTransaction:s,serializeTransaction:m}=await import("viem"),$=s(i);return{transaction:m($,{r:b(k(c.r)),s:b(k(c.s)),v:BigInt(c.v)})}}case"solana":{let{SignerSolanaBuilder:d}=D(),u=new d({dmk:o,sessionId:a}).build(),{VersionedTransaction:i}=await import("@solana/web3.js"),g=Uint8Array.from(Buffer.from(n,"base64")),p=i.deserialize(g),c=p.message.serialize(),s=u.signTransaction(r,c,{skipOpenApp:!1}),m=await f(s,"Sign Solana transaction");return p.signatures[0]=m,{transaction:Buffer.from(p.serialize()).toString("base64")}}}}async function V(e,n){let t=S[e];if(t==="bitcoin")throw new Error("Bitcoin message signing via Ledger is not yet supported. Use a software wallet for Bitcoin message signing.");if(t==="tron")throw new Error("Tron message signing via Ledger is not supported. Use a software wallet for Tron message signing.");await R(e);let r=L(t),a=A(),o=w();switch(t){case"ethereum":{let{SignerEthBuilder:d}=I(),i=new d({dmk:o,sessionId:a}).build().signMessage(r,n,{skipOpenApp:!1}),g=await f(i,"Sign message"),p=k(g.r),c=k(g.s),s=g.v.toString(16).padStart(2,"0");return{signature:`0x${p}${c}${s}`}}case"solana":{let{SignerSolanaBuilder:d}=D(),u=new d({dmk:o,sessionId:a}).build(),i=Buffer.from(n,"utf8").toString("hex"),g=u.signMessage(r,i,{skipOpenApp:!1}),p=await f(g,"Sign Solana message");return{signature:(await import("bs58")).default.encode(p)}}}}async function G(){if(l){try{await w().disconnect({sessionId:l})}catch{}l=null}if(h){try{h.close()}catch{}h=null}}export{O as connectLedger,G as disconnectLedger,x as ledgerGetAddress,q as ledgerGetAllAddresses,V as ledgerSignMessage,F 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-
|
|
2
|
+
import{a as d,b as y,e as l}from"./chunk-HLZNAVGS.js";import{a as u,h as f}from"./chunk-GGQYZSAY.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-
|
|
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-GGQYZSAY.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
|
@@ -30,7 +30,7 @@ mp wallet hardware add --name "my-ledger"
|
|
|
30
30
|
mp wallet hardware add --name "my-ledger" --device ledger
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
This connects to the device, derives addresses for all supported chains (Ethereum, Solana
|
|
33
|
+
This connects to the device, derives addresses for all supported chains (Ethereum, Solana), and saves the wallet. No secrets are stored — only addresses.
|
|
34
34
|
|
|
35
35
|
### Refresh addresses
|
|
36
36
|
|
|
@@ -104,8 +104,7 @@ mp token bridge \
|
|
|
104
104
|
|
|
105
105
|
- **Ethereum** (+ all EVM: Base, Polygon, Arbitrum, Optimism, BNB, Avalanche)
|
|
106
106
|
- **Solana**
|
|
107
|
-
-
|
|
108
|
-
- Bitcoin address derivation and signing are not yet supported
|
|
107
|
+
- Bitcoin and Tron are not supported via Ledger
|
|
109
108
|
|
|
110
109
|
## Tips
|
|
111
110
|
|
package/dist/ledger-RME3PLAL.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
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 P=3e4;var D=`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(D)}}function L(){try{return v("@ledgerhq/device-signer-kit-ethereum")}catch{throw new Error(D)}}function x(){try{return v("@ledgerhq/device-signer-kit-solana")}catch{throw new Error(D)}}var f=null,w=null;function l(){if(!f){let e=y();f=new e.DeviceManagementKitBuilder().addTransport(e.nodeHidTransportFactory).build()}return f}function A(){if(!w)throw new Error("No Ledger device connected. Connect first.");return w}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 h(e,n,t=6e4){let{DeviceActionStatus:r}=y();return new Promise((c,a)=>{let u="",d=!1,i=o=>{d||(d=!0,clearTimeout(g),p.unsubscribe(),o())},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),p=e.observable.subscribe({next:o=>{switch(o.status){case r.Pending:{let s=o.intermediateValue?.requiredUserInteraction??"";if(s&&s!=="none"&&s!==u){u=s;let m=C[s]??s;m&&process.stderr.write(` ${m}
|
|
4
|
-
`)}break}case r.Completed:i(()=>c(o.output));break;case r.Error:i(()=>{let s=o.error,m=s instanceof Error?s.message:s&&typeof s=="object"?s._tag??s.message??JSON.stringify(s):String(s);a(new Error(`${n} failed: ${m}`))});break;case r.Stopped:i(()=>a(new Error(`${n} was cancelled`)));break}},error:o=>i(()=>a(o))})})}async function q(){try{let e=y(),n=l(),t=n.startDiscovering({});return await e.firstValueFrom(t.pipe(e.take(1),e.timeout(3e3))).finally(()=>{n.stopDiscovering()}),!0}catch{if(f){try{f.close()}catch{}f=null}return!1}}async function R(){let e=y(),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(P))).finally(()=>{l().stopDiscovering()}),r=t.deviceModel.model??t.deviceModel.id;return process.stderr.write(`Connecting to Ledger ${r}...
|
|
6
|
-
`),w=await l().connect({device:t,sessionRefresherOptions:{isRefresherDisabled:!0}}),process.stderr.write(`Connected to Ledger ${r}
|
|
7
|
-
`),w}async function O(){if(!w)return null;try{let e=y(),t=l().getDeviceSessionState({sessionId:w}),r=await e.firstValueFrom(t.pipe(e.take(1),e.timeout(3e3)));return r.sessionStateType==="readyWithoutSecureChannel"?r.currentApp?.name??null:null}catch{return null}}var M={ethereum:"Ethereum",solana:"Solana"};function _(e){let n=String(e);return n.includes("6807")||n.includes("6a15")||n.includes("UnknownDeviceExchangeError")}async function U(e){process.stderr.write(`Installing ${e} app on your Ledger...
|
|
8
|
-
`);let{OpenAppWithDependenciesDeviceAction:n}=y(),t=new n({input:{appName:e}}),c=l().executeDeviceAction({sessionId:A(),deviceAction:t});await h(c,`Install ${e}`,18e4),process.stderr.write(`Installed ${e} app
|
|
9
|
-
`)}async function T(e){let n=k[e],t=M[n];if(!t||await O()===t)return;process.stderr.write(`Opening ${t} app on your Ledger...
|
|
10
|
-
`);let{OpenAppDeviceAction:c}=y(),a=new c({input:{appName:t}}),d=l().executeDeviceAction({sessionId:A(),deviceAction:a});try{await h(d,`Open ${t}`)}catch(i){if(_(i)){await b(),await U(t),await b();return}if(!String(i).includes("isconnect"))throw i}await b()}async function b(){try{await l().disconnect({sessionId:w})}catch{}w=null,await new Promise(e=>setTimeout(e,500)),await R()}function $(e,n=0){switch(e){case"ethereum":return`44'/60'/${n}'/0/0`;case"solana":return`44'/501'/${n}'/0'`;case"bitcoin":case"tron":throw new Error(`${e} derivation via Ledger is not supported.`)}}function S(e){return e.startsWith("0x")?e.slice(2):e}function E(e){return e.startsWith("0x")?e:`0x${e}`}async function B(e){let n=k[e];if(n==="bitcoin")throw new Error("Bitcoin address derivation via Ledger is not yet supported.");if(n==="tron")throw new Error("Tron address derivation via Ledger is not supported. The Ethereum signer cannot interact with the Tron Ledger app.");await T(e);let t=$(n),r=A(),c=l();switch(n){case"ethereum":{let{SignerEthBuilder:a}=L(),d=new a({dmk:c,sessionId:r}).build().getAddress(t,{skipOpenApp:!1});return(await h(d,"Get Ethereum address")).address}case"solana":{let{SignerSolanaBuilder:a}=x(),d=new a({dmk:c,sessionId:r}).build().getAddress(t,{skipOpenApp:!1});return await h(d,"Get Solana address")}}}async function F(){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 V(e,n){let t=k[e];if(t==="bitcoin")throw new Error("Bitcoin transaction signing via Ledger is not yet supported. Use a software wallet for Bitcoin transactions.");if(t==="tron")throw new Error("Tron transaction signing via Ledger is not supported. Use a software wallet for Tron transactions.");await T(e);let r=$(t),c=A(),a=l();switch(t){case"ethereum":{let{SignerEthBuilder:u}=L(),d=new u({dmk:a,sessionId:c}).build(),i=E(n.startsWith("0x")?n:Buffer.from(n,"base64").toString("hex")),g=Uint8Array.from(Buffer.from(S(i),"hex")),p=d.signTransaction(r,g,{skipOpenApp:!1}),o=await h(p,"Sign transaction"),{parseTransaction:s,serializeTransaction:m}=await import("viem"),I=s(i);return{transaction:m(I,{r:E(S(o.r)),s:E(S(o.s)),v:BigInt(o.v)})}}case"solana":{let{SignerSolanaBuilder:u}=x(),d=new u({dmk:a,sessionId:c}).build(),{VersionedTransaction:i}=await import("@solana/web3.js"),g=Uint8Array.from(Buffer.from(n,"base64")),p=i.deserialize(g),o=p.message.serialize(),s=d.signTransaction(r,o,{skipOpenApp:!1}),m=await h(s,"Sign Solana transaction");return p.signatures[0]=m,{transaction:Buffer.from(p.serialize()).toString("base64")}}}}async function G(e,n){let t=k[e];if(t==="bitcoin")throw new Error("Bitcoin message signing via Ledger is not yet supported. Use a software wallet for Bitcoin message signing.");if(t==="tron")throw new Error("Tron message signing via Ledger is not supported. Use a software wallet for Tron message signing.");await T(e);let r=$(t),c=A(),a=l();switch(t){case"ethereum":{let{SignerEthBuilder:u}=L(),i=new u({dmk:a,sessionId:c}).build().signMessage(r,n,{skipOpenApp:!1}),g=await h(i,"Sign message"),p=S(g.r),o=S(g.s),s=g.v.toString(16).padStart(2,"0");return{signature:`0x${p}${o}${s}`}}case"solana":{let{SignerSolanaBuilder:u}=x(),d=new u({dmk:a,sessionId:c}).build(),i=Buffer.from(n,"utf8").toString("hex"),g=d.signMessage(r,i,{skipOpenApp:!1}),p=await h(g,"Sign Solana message");return{signature:(await import("bs58")).default.encode(p)}}}}async function K(){if(w){try{await l().disconnect({sessionId:w})}catch{}w=null}if(f){try{f.close()}catch{}f=null}}export{R as connectLedger,K as disconnectLedger,q as isLedgerConnected,B as ledgerGetAddress,F as ledgerGetAllAddresses,G as ledgerSignMessage,V as ledgerSignTransaction};
|