@swapkit/wallet-hardware 4.6.3 → 4.8.0

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.
Files changed (52) hide show
  1. package/dist/chunk-3yr76n9s.js +5 -0
  2. package/dist/chunk-3yr76n9s.js.map +10 -0
  3. package/dist/chunk-3zf2pqfd.js +4 -0
  4. package/dist/chunk-3zf2pqfd.js.map +10 -0
  5. package/dist/{chunk-1jexf7qt.js → chunk-7fsaymh4.js} +3 -3
  6. package/dist/{chunk-1jexf7qt.js.map → chunk-7fsaymh4.js.map} +1 -1
  7. package/dist/{chunk-skvfn1dg.js → chunk-9tg9jj9j.js} +3 -3
  8. package/dist/{chunk-skvfn1dg.js.map → chunk-9tg9jj9j.js.map} +1 -1
  9. package/dist/chunk-mrsfcest.js +4 -0
  10. package/dist/chunk-mrsfcest.js.map +10 -0
  11. package/dist/{chunk-1jpcb30j.js → chunk-n05bv2n5.js} +3 -3
  12. package/dist/{chunk-1jpcb30j.js.map → chunk-n05bv2n5.js.map} +1 -1
  13. package/dist/chunk-px09mwnt.js +4 -0
  14. package/dist/chunk-px09mwnt.js.map +10 -0
  15. package/dist/{chunk-ybje7f3s.js → chunk-vwv6z2mk.js} +3 -3
  16. package/dist/{chunk-ybje7f3s.js.map → chunk-vwv6z2mk.js.map} +1 -1
  17. package/dist/chunk-x85da57j.js +4 -0
  18. package/dist/chunk-x85da57j.js.map +10 -0
  19. package/dist/chunk-y3yvq1zt.js +4 -0
  20. package/dist/chunk-y3yvq1zt.js.map +10 -0
  21. package/dist/keepkey/index.cjs +2 -2
  22. package/dist/keepkey/index.cjs.map +4 -4
  23. package/dist/keepkey/index.js +2 -2
  24. package/dist/keepkey/index.js.map +4 -4
  25. package/dist/ledger/index.cjs +3 -3
  26. package/dist/ledger/index.cjs.map +5 -6
  27. package/dist/ledger/index.js +3 -3
  28. package/dist/ledger/index.js.map +5 -6
  29. package/dist/trezor/index.cjs +2 -2
  30. package/dist/trezor/index.cjs.map +3 -3
  31. package/dist/trezor/index.js +2 -2
  32. package/dist/trezor/index.js.map +3 -3
  33. package/dist/types/keepkey/chains/utxo.d.ts +52 -14
  34. package/dist/types/keepkey/chains/utxo.d.ts.map +1 -1
  35. package/dist/types/keepkey/index.d.ts +2 -1
  36. package/dist/types/keepkey/index.d.ts.map +1 -1
  37. package/dist/types/ledger/clients/thorchain/lib.d.ts.map +1 -1
  38. package/dist/types/ledger/clients/utxo-legacy-adapter.d.ts +31 -0
  39. package/dist/types/ledger/clients/utxo-legacy-adapter.d.ts.map +1 -0
  40. package/dist/types/ledger/clients/utxo-psbt.d.ts +15 -0
  41. package/dist/types/ledger/clients/utxo-psbt.d.ts.map +1 -0
  42. package/dist/types/ledger/index.d.ts +2 -1
  43. package/dist/types/ledger/index.d.ts.map +1 -1
  44. package/dist/types/trezor/index.d.ts +2 -1
  45. package/dist/types/trezor/index.d.ts.map +1 -1
  46. package/package.json +5 -4
  47. package/dist/chunk-4fapcrj9.js +0 -5
  48. package/dist/chunk-4fapcrj9.js.map +0 -10
  49. package/dist/chunk-jj2v7mke.js +0 -4
  50. package/dist/chunk-jj2v7mke.js.map +0 -10
  51. package/dist/types/core.d.ts +0 -18
  52. package/dist/types/core.d.ts.map +0 -1
@@ -0,0 +1,5 @@
1
+ import{d as M}from"./chunk-n05bv2n5.js";import{SwapKitError as F}from"@swapkit/helpers";var Q=()=>navigator?.usb,$=async()=>{let j=Q();if(typeof j?.getDevices!=="function")return{};let{ledgerUSBVendorId:z}=await import("@ledgerhq/devices"),G=(await j?.getDevices()).filter((P)=>P.vendorId===z);if(G.length>0)return G[0];return j?.requestDevice({filters:[{vendorId:z}]})},B=async()=>{let j=await $();if(!j)throw new F("wallet_ledger_device_not_found");if(j.opened||await j.open(),j.configuration===null)await j.selectConfiguration(1);try{await j.reset()}catch{}let z=j.configuration??j.configurations?.[0],y=z?.interfaces.find(({alternates:m})=>m.some(({interfaceClass:J})=>J===255))||z?.interfaces.find(({alternates:m})=>m.some(({interfaceClass:J})=>J===3));if(!y)throw await j.close(),new F("wallet_ledger_connection_error");let G=y.alternates?.find(({interfaceClass:m})=>m===3)?.interfaceClass,P=y.alternates?.find(({interfaceClass:m})=>m===255)?.interfaceClass;if(G&&!P){let m=(await import("@ledgerhq/hw-transport-webhid")).default;if(!await m.isSupported())throw await j.close(),new F("wallet_ledger_webhid_not_supported");return await m.create()}try{await j.claimInterface(y.interfaceNumber)}catch(m){throw await j.close(),new F("wallet_ledger_connection_claimed",m)}let X=(await import("@ledgerhq/hw-transport-webusb")).default;if(!await X.isSupported())throw new F("wallet_ledger_webusb_not_supported");let{DisconnectedDevice:_}=await import("@ledgerhq/errors"),Y=new X(j,y.interfaceNumber),Z=(m)=>{if(j===m.device)Q()?.removeEventListener("disconnect",Z),Y._emitDisconnect(new _)};return Q()?.addEventListener("disconnect",Z),Y};
2
+ export{B as c};
3
+
4
+ //# debugId=90AE89FA46425EF264756E2164756E21
5
+ //# sourceMappingURL=chunk-3yr76n9s.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ledger/helpers/getLedgerTransport.ts"],
4
+ "sourcesContent": [
5
+ "import type Transport from \"@ledgerhq/hw-transport\";\nimport { SwapKitError } from \"@swapkit/helpers\";\n\nconst getNavigatorUsb = () =>\n navigator?.usb as unknown as {\n getDevices: () => Promise<any[]>;\n requestDevice: (requestObject: any) => Promise<any>;\n removeEventListener: (event: string, callback: (e: any) => void) => void;\n addEventListener: (event: string, callback: (e: any) => void) => void;\n };\n\nconst getLedgerDevices = async (): Promise<USBDevice> => {\n const navigatorUsb = getNavigatorUsb();\n\n if (typeof navigatorUsb?.getDevices !== \"function\") return {} as USBDevice;\n const { ledgerUSBVendorId } = await import(\"@ledgerhq/devices\");\n\n const devices = await navigatorUsb?.getDevices();\n const existingDevices = devices.filter((d) => d.vendorId === ledgerUSBVendorId);\n if (existingDevices.length > 0) return existingDevices[0];\n\n return navigatorUsb?.requestDevice({ filters: [{ vendorId: ledgerUSBVendorId }] });\n};\n\nexport const getLedgerTransport = async (): Promise<Transport> => {\n const device = await getLedgerDevices();\n\n if (!device) {\n throw new SwapKitError(\"wallet_ledger_device_not_found\");\n }\n\n device.opened || (await device.open());\n if (device.configuration === null) await device.selectConfiguration(1);\n\n try {\n await device.reset();\n } catch {\n // reset fails on devices that are already open\n }\n\n const configuration = device.configuration ?? device.configurations?.[0];\n\n const iface =\n configuration?.interfaces.find(({ alternates }: { alternates: { interfaceClass: number }[] }) =>\n alternates.some(({ interfaceClass }) => interfaceClass === 0xff),\n ) ||\n configuration?.interfaces.find(({ alternates }: { alternates: { interfaceClass: number }[] }) =>\n alternates.some(({ interfaceClass }) => interfaceClass === 0x03),\n );\n\n if (!iface) {\n await device.close();\n throw new SwapKitError(\"wallet_ledger_connection_error\");\n }\n\n const klass0x03 = (iface.alternates as any[])?.find(\n ({ interfaceClass }: { interfaceClass: number }) => interfaceClass === 0x03,\n )?.interfaceClass as number;\n\n const klass0xff = (iface.alternates as any[])?.find(\n ({ interfaceClass }: { interfaceClass: number }) => interfaceClass === 0xff,\n )?.interfaceClass as number;\n\n if (klass0x03 && !klass0xff) {\n // -------- HID class (NEAR, ETH, SOL, etc.) -> WebHID transport --------\n const TransportWebHID = (await import(\"@ledgerhq/hw-transport-webhid\")).default;\n const supported = await TransportWebHID.isSupported();\n if (!supported) {\n await device.close();\n throw new SwapKitError(\"wallet_ledger_webhid_not_supported\");\n }\n const transport = await TransportWebHID.create();\n return transport;\n }\n\n try {\n await device.claimInterface(iface.interfaceNumber);\n } catch (error: unknown) {\n await device.close();\n\n throw new SwapKitError(\"wallet_ledger_connection_claimed\", error);\n }\n\n const Transport = (await import(\"@ledgerhq/hw-transport-webusb\")).default;\n const isSupported = await Transport.isSupported();\n if (!isSupported) throw new SwapKitError(\"wallet_ledger_webusb_not_supported\");\n\n const { DisconnectedDevice } = await import(\"@ledgerhq/errors\");\n\n const transport = new Transport(device, iface.interfaceNumber);\n\n const onDisconnect = (e: any) => {\n if (device === e.device) {\n getNavigatorUsb()?.removeEventListener(\"disconnect\", onDisconnect);\n\n transport._emitDisconnect(new DisconnectedDevice());\n }\n };\n getNavigatorUsb()?.addEventListener(\"disconnect\", onDisconnect);\n\n return transport as Transport;\n};\n"
6
+ ],
7
+ "mappings": "wCACA,uBAAS,yBAET,IAAM,EAAkB,IACtB,WAAW,IAOP,EAAmB,SAAgC,CACvD,IAAM,EAAe,EAAgB,EAErC,GAAI,OAAO,GAAc,aAAe,WAAY,MAAO,CAAC,EAC5D,IAAQ,qBAAsB,KAAa,6BAGrC,GADU,MAAM,GAAc,WAAW,GACf,OAAO,CAAC,IAAM,EAAE,WAAa,CAAiB,EAC9E,GAAI,EAAgB,OAAS,EAAG,OAAO,EAAgB,GAEvD,OAAO,GAAc,cAAc,CAAE,QAAS,CAAC,CAAE,SAAU,CAAkB,CAAC,CAAE,CAAC,GAGtE,EAAqB,SAAgC,CAChE,IAAM,EAAS,MAAM,EAAiB,EAEtC,GAAI,CAAC,EACH,MAAM,IAAI,EAAa,gCAAgC,EAIzD,GADA,EAAO,QAAW,MAAM,EAAO,KAAK,EAChC,EAAO,gBAAkB,KAAM,MAAM,EAAO,oBAAoB,CAAC,EAErE,GAAI,CACF,MAAM,EAAO,MAAM,EACnB,KAAM,EAIR,IAAM,EAAgB,EAAO,eAAiB,EAAO,iBAAiB,GAEhE,EACJ,GAAe,WAAW,KAAK,EAAG,gBAChC,EAAW,KAAK,EAAG,oBAAqB,IAAmB,GAAI,CACjE,GACA,GAAe,WAAW,KAAK,EAAG,gBAChC,EAAW,KAAK,EAAG,oBAAqB,IAAmB,CAAI,CACjE,EAEF,GAAI,CAAC,EAEH,MADA,MAAM,EAAO,MAAM,EACb,IAAI,EAAa,gCAAgC,EAGzD,IAAM,EAAa,EAAM,YAAsB,KAC7C,EAAG,oBAAiD,IAAmB,CACzE,GAAG,eAEG,EAAa,EAAM,YAAsB,KAC7C,EAAG,oBAAiD,IAAmB,GACzE,GAAG,eAEH,GAAI,GAAa,CAAC,EAAW,CAE3B,IAAM,GAAmB,KAAa,0CAAkC,QAExE,GAAI,CADc,MAAM,EAAgB,YAAY,EAGlD,MADA,MAAM,EAAO,MAAM,EACb,IAAI,EAAa,oCAAoC,EAG7D,OADkB,MAAM,EAAgB,OAAO,EAIjD,GAAI,CACF,MAAM,EAAO,eAAe,EAAM,eAAe,EACjD,MAAO,EAAgB,CAGvB,MAFA,MAAM,EAAO,MAAM,EAEb,IAAI,EAAa,mCAAoC,CAAK,EAGlE,IAAM,GAAa,KAAa,0CAAkC,QAElE,GAAI,CADgB,MAAM,EAAU,YAAY,EAC9B,MAAM,IAAI,EAAa,oCAAoC,EAE7E,IAAQ,sBAAuB,KAAa,4BAEtC,EAAY,IAAI,EAAU,EAAQ,EAAM,eAAe,EAEvD,EAAe,CAAC,IAAW,CAC/B,GAAI,IAAW,EAAE,OACf,EAAgB,GAAG,oBAAoB,aAAc,CAAY,EAEjE,EAAU,gBAAgB,IAAI,CAAoB,GAKtD,OAFA,EAAgB,GAAG,iBAAiB,aAAc,CAAY,EAEvD",
8
+ "debugId": "90AE89FA46425EF264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,4 @@
1
+ import{c as K}from"./chunk-3yr76n9s.js";import{d as W}from"./chunk-n05bv2n5.js";import{base64 as A}from"@scure/base";import{HDKey as x}from"@scure/bip32";import{derivationPathToString as f,getWalletFormatFor as m,SwapKitError as E}from"@swapkit/helpers";function y(q){switch(q){case"bech32":return"wpkh(@0/**)";case"p2sh":return"sh(wpkh(@0/**))";case"legacy":return"pkh(@0/**)";default:return"wpkh(@0/**)"}}function b(q){return typeof q==="string"?q:f(q)}function P(q){return q.replace(/^m\//,"").split("/").filter(Boolean).map((J)=>{let R=J.endsWith("'"),M=Number.parseInt(R?J.slice(0,-1):J,10);return R?(M|2147483648)>>>0:M})}var w=({chain:q})=>{let J,R;async function M(){if(!J){let V=await K(),{AppClient:Q}=await import("ledger-bitcoin");J=new Q(V)}return J}async function B(){if(!R)R=await(await M()).getMasterFingerprint();return R}return(V)=>{let Q=V?b(V):"84'/0'/0'/0/0",_=Q.split("/").slice(0,3).join("/"),I=Q.split("/").slice(3),N=Number(I[0]??0),O=Number(I[1]??0),X=m(Q),k=y(X),Z,$;async function H(){let j=await M(),G=await B();if(!Z)Z=await j.getExtendedPubkey(`m/${_}`);let{DefaultWalletPolicy:z}=await import("ledger-bitcoin"),D=new z(k,`[${G}/${_}]${Z}`);return{app:j,fpr:G,policy:D,xpub:Z}}async function S(){if(!$){let{xpub:j}=await H(),z=x.fromExtendedKey(j).derive(`m/${N}/${O}`);if(!z.publicKey)throw new E("wallet_ledger_get_address_error",{message:`Cannot derive leaf pubkey for ${q}`});$=z.publicKey}return $}return{connect:async()=>{await M()},getAddress:async()=>{let{app:j,policy:G}=await H(),z=await j.getWalletAddress(G,null,N,O,!1);if(!z)throw new E("wallet_ledger_get_address_error",{message:`Cannot get ${q} address from ledger derivation path: ${Q}`});return z},getExtendedPublicKey:async(j=`m/${_}`)=>{return(await M()).getExtendedPubkey(j)},signTransaction:async(j)=>{let{app:G,policy:z,fpr:D}=await H(),T=Number.parseInt(D,16)>>>0,C=P(Q),F=await S();for(let Y=0;Y<j.inputsLength;Y++)j.updateInput(Y,{bip32Derivation:[[F,{fingerprint:T,path:C}]]});let L=A.encode(j.toPSBT(0)),v=await G.signPsbt(L,z,null);for(let[Y,U]of v)j.updateInput(Y,{partialSig:[[new Uint8Array(U.pubkey),new Uint8Array(U.signature)]]});return j.finalize(),j}}}},o=w({chain:"bitcoin"}),d=w({chain:"litecoin"});export{d as LitecoinPsbtLedger,o as BitcoinPsbtLedger};
2
+
3
+ //# debugId=27457FA5B66F8C7364756E2164756E21
4
+ //# sourceMappingURL=chunk-3zf2pqfd.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ledger/clients/utxo-psbt.ts"],
4
+ "sourcesContent": [
5
+ "import { base64 } from \"@scure/base\";\nimport { HDKey } from \"@scure/bip32\";\nimport { type DerivationPathArray, derivationPathToString, getWalletFormatFor, SwapKitError } from \"@swapkit/helpers\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\n\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\ntype SupportedCoin = \"bitcoin\" | \"litecoin\";\n\ntype DefaultDescriptorTemplate = \"wpkh(@0/**)\" | \"tr(@0/**)\" | \"sh(wpkh(@0/**))\" | \"pkh(@0/**)\";\n\nfunction templateForFormat(format: ReturnType<typeof getWalletFormatFor>): DefaultDescriptorTemplate {\n switch (format) {\n case \"bech32\":\n return \"wpkh(@0/**)\";\n case \"p2sh\":\n return \"sh(wpkh(@0/**))\";\n case \"legacy\":\n return \"pkh(@0/**)\";\n default:\n return \"wpkh(@0/**)\";\n }\n}\n\nfunction pathToString(path: DerivationPathArray | string): string {\n return typeof path === \"string\" ? path : derivationPathToString(path);\n}\n\nfunction pathToNumberArray(path: string): number[] {\n return path\n .replace(/^m\\//, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map((p) => {\n const hardened = p.endsWith(\"'\");\n const num = Number.parseInt(hardened ? p.slice(0, -1) : p, 10);\n return hardened ? (num | 0x80000000) >>> 0 : num;\n });\n}\n\nconst BaseLedgerPsbtUTXO = ({ chain }: { chain: SupportedCoin }) => {\n let appClient: import(\"ledger-bitcoin\").AppClient | undefined;\n let masterFingerprint: string | undefined;\n\n async function getAppClient() {\n if (!appClient) {\n const transport = await getLedgerTransport();\n const { AppClient } = await import(\"ledger-bitcoin\");\n appClient = new AppClient(transport);\n }\n return appClient;\n }\n\n async function getFingerprint() {\n if (!masterFingerprint) {\n const app = await getAppClient();\n masterFingerprint = await app.getMasterFingerprint();\n }\n return masterFingerprint;\n }\n\n return (derivationPathArray?: DerivationPathArray | string) => {\n // Single-address account: change == index == 0 by default.\n const derivationPath = derivationPathArray ? pathToString(derivationPathArray) : \"84'/0'/0'/0/0\";\n const accountPath = derivationPath.split(\"/\").slice(0, 3).join(\"/\");\n const leafSegments = derivationPath.split(\"/\").slice(3);\n const change = Number(leafSegments[0] ?? 0);\n const addressIndex = Number(leafSegments[1] ?? 0);\n const format = getWalletFormatFor(derivationPath);\n const template = templateForFormat(format);\n\n let cachedAccountXpub: string | undefined;\n let cachedLeafPubkey: Uint8Array | undefined;\n\n async function buildPolicy() {\n const app = await getAppClient();\n const fpr = await getFingerprint();\n if (!cachedAccountXpub) {\n cachedAccountXpub = await app.getExtendedPubkey(`m/${accountPath}`);\n }\n const { DefaultWalletPolicy } = await import(\"ledger-bitcoin\");\n const policy = new DefaultWalletPolicy(template, `[${fpr}/${accountPath}]${cachedAccountXpub}`);\n return { app, fpr, policy, xpub: cachedAccountXpub };\n }\n\n async function getLeafPubkey() {\n if (!cachedLeafPubkey) {\n const { xpub } = await buildPolicy();\n const accountKey = HDKey.fromExtendedKey(xpub);\n const leaf = accountKey.derive(`m/${change}/${addressIndex}`);\n if (!leaf.publicKey) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", {\n message: `Cannot derive leaf pubkey for ${chain}`,\n });\n }\n cachedLeafPubkey = leaf.publicKey;\n }\n return cachedLeafPubkey;\n }\n\n return {\n connect: async () => {\n await getAppClient();\n },\n getAddress: async () => {\n const { app, policy } = await buildPolicy();\n const address = await app.getWalletAddress(policy, null, change, addressIndex, false);\n if (!address) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", {\n message: `Cannot get ${chain} address from ledger derivation path: ${derivationPath}`,\n });\n }\n return address;\n },\n getExtendedPublicKey: async (path = `m/${accountPath}`) => {\n const app = await getAppClient();\n return app.getExtendedPubkey(path);\n },\n signTransaction: async (tx: Transaction): Promise<Transaction> => {\n const { app, policy, fpr } = await buildPolicy();\n const fingerprintBE = Number.parseInt(fpr, 16) >>> 0;\n const pathNumbers = pathToNumberArray(derivationPath);\n const leafPubkey = await getLeafPubkey();\n\n // Single-address account: every input is owned by the same key + path.\n for (let i = 0; i < tx.inputsLength; i++) {\n tx.updateInput(i, { bip32Derivation: [[leafPubkey, { fingerprint: fingerprintBE, path: pathNumbers }]] });\n }\n\n const psbtB64 = base64.encode(tx.toPSBT(0));\n const sigs = await app.signPsbt(psbtB64, policy, null);\n\n for (const [idx, partial] of sigs) {\n tx.updateInput(idx, { partialSig: [[new Uint8Array(partial.pubkey), new Uint8Array(partial.signature)]] });\n }\n\n tx.finalize();\n return tx;\n },\n };\n };\n};\n\nexport const BitcoinPsbtLedger = BaseLedgerPsbtUTXO({ chain: \"bitcoin\" });\nexport const LitecoinPsbtLedger = BaseLedgerPsbtUTXO({ chain: \"litecoin\" });\n"
6
+ ],
7
+ "mappings": "sFAAA,WAAS,oBACT,gBAAS,qBACT,iCAAmC,wBAAwB,kBAAoB,yBAS/E,SAAS,CAAiB,CAAC,EAA0E,CACnG,OAAQ,OACD,SACH,MAAO,kBACJ,OACH,MAAO,sBACJ,SACH,MAAO,qBAEP,MAAO,eAIb,SAAS,CAAY,CAAC,EAA4C,CAChE,OAAO,OAAO,IAAS,SAAW,EAAO,EAAuB,CAAI,EAGtE,SAAS,CAAiB,CAAC,EAAwB,CACjD,OAAO,EACJ,QAAQ,OAAQ,EAAE,EAClB,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,IAAM,CACV,IAAM,EAAW,EAAE,SAAS,GAAG,EACzB,EAAM,OAAO,SAAS,EAAW,EAAE,MAAM,EAAG,EAAE,EAAI,EAAG,EAAE,EAC7D,OAAO,GAAY,EAAM,cAAgB,EAAI,EAC9C,EAGL,IAAM,EAAqB,EAAG,WAAsC,CAClE,IAAI,EACA,EAEJ,eAAe,CAAY,EAAG,CAC5B,GAAI,CAAC,EAAW,CACd,IAAM,EAAY,MAAM,EAAmB,GACnC,aAAc,KAAa,0BACnC,EAAY,IAAI,EAAU,CAAS,EAErC,OAAO,EAGT,eAAe,CAAc,EAAG,CAC9B,GAAI,CAAC,EAEH,EAAoB,MADR,MAAM,EAAa,GACD,qBAAqB,EAErD,OAAO,EAGT,MAAO,CAAC,IAAuD,CAE7D,IAAM,EAAiB,EAAsB,EAAa,CAAmB,EAAI,gBAC3E,EAAc,EAAe,MAAM,GAAG,EAAE,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAC5D,EAAe,EAAe,MAAM,GAAG,EAAE,MAAM,CAAC,EAChD,EAAS,OAAO,EAAa,IAAM,CAAC,EACpC,EAAe,OAAO,EAAa,IAAM,CAAC,EAC1C,EAAS,EAAmB,CAAc,EAC1C,EAAW,EAAkB,CAAM,EAErC,EACA,EAEJ,eAAe,CAAW,EAAG,CAC3B,IAAM,EAAM,MAAM,EAAa,EACzB,EAAM,MAAM,EAAe,EACjC,GAAI,CAAC,EACH,EAAoB,MAAM,EAAI,kBAAkB,KAAK,GAAa,EAEpE,IAAQ,uBAAwB,KAAa,0BACvC,EAAS,IAAI,EAAoB,EAAU,IAAI,KAAO,KAAe,GAAmB,EAC9F,MAAO,CAAE,MAAK,MAAK,SAAQ,KAAM,CAAkB,EAGrD,eAAe,CAAa,EAAG,CAC7B,GAAI,CAAC,EAAkB,CACrB,IAAQ,QAAS,MAAM,EAAY,EAE7B,EADa,EAAM,gBAAgB,CAAI,EACrB,OAAO,KAAK,KAAU,GAAc,EAC5D,GAAI,CAAC,EAAK,UACR,MAAM,IAAI,EAAa,kCAAmC,CACxD,QAAS,iCAAiC,GAC5C,CAAC,EAEH,EAAmB,EAAK,UAE1B,OAAO,EAGT,MAAO,CACL,QAAS,SAAY,CACnB,MAAM,EAAa,GAErB,WAAY,SAAY,CACtB,IAAQ,MAAK,UAAW,MAAM,EAAY,EACpC,EAAU,MAAM,EAAI,iBAAiB,EAAQ,KAAM,EAAQ,EAAc,EAAK,EACpF,GAAI,CAAC,EACH,MAAM,IAAI,EAAa,kCAAmC,CACxD,QAAS,cAAc,0CAA8C,GACvE,CAAC,EAEH,OAAO,GAET,qBAAsB,MAAO,EAAO,KAAK,MAAkB,CAEzD,OADY,MAAM,EAAa,GACpB,kBAAkB,CAAI,GAEnC,gBAAiB,MAAO,IAA0C,CAChE,IAAQ,MAAK,SAAQ,OAAQ,MAAM,EAAY,EACzC,EAAgB,OAAO,SAAS,EAAK,EAAE,IAAM,EAC7C,EAAc,EAAkB,CAAc,EAC9C,EAAa,MAAM,EAAc,EAGvC,QAAS,EAAI,EAAG,EAAI,EAAG,aAAc,IACnC,EAAG,YAAY,EAAG,CAAE,gBAAiB,CAAC,CAAC,EAAY,CAAE,YAAa,EAAe,KAAM,CAAY,CAAC,CAAC,CAAE,CAAC,EAG1G,IAAM,EAAU,EAAO,OAAO,EAAG,OAAO,CAAC,CAAC,EACpC,EAAO,MAAM,EAAI,SAAS,EAAS,EAAQ,IAAI,EAErD,QAAY,EAAK,KAAY,EAC3B,EAAG,YAAY,EAAK,CAAE,WAAY,CAAC,CAAC,IAAI,WAAW,EAAQ,MAAM,EAAG,IAAI,WAAW,EAAQ,SAAS,CAAC,CAAC,CAAE,CAAC,EAI3G,OADA,EAAG,SAAS,EACL,EAEX,IAIS,EAAoB,EAAmB,CAAE,MAAO,SAAU,CAAC,EAC3D,EAAqB,EAAmB,CAAE,MAAO,UAAW,CAAC",
8
+ "debugId": "27457FA5B66F8C7364756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,5 +1,5 @@
1
1
  import{SwapKitError as I}from"@swapkit/helpers";var M=2147483648,U;((j)=>{j.BTC="Bitcoin";j.BCH="BitcoinCash";j.DOGE="Dogecoin";j.LTC="Litecoin";j.DASH="Dash";j.XRP="Ripple"})(U||={});function V(B){if(B==="m/")return!0;return/^m(((\/[0-9]+h)+|(\/[0-9]+H)+|(\/[0-9]+')*)((\/[0-9]+)*))$/.test(B)}function X(B){let q=B;if(!V(q))throw new I("wallet_keepkey_invalid_params",{reason:`Not a bip32 path: '${q}'`});if(/^m\//i.test(q))q=q.slice(2);let z=q.split("/");if(z.length===1&&z[0]==="")return[];let F=Array(z.length);for(let v=0;v<z.length;v++){let J=z[v];if(J){let j=/(\d+)([hH']?)/.exec(J);if(j===null)throw new I("wallet_keepkey_invalid_params",{reason:"Invalid input"});let[,Q="",G=""]=j;if(F[v]=Number.parseInt(Q,10),F[v]>=M)throw new I("wallet_keepkey_invalid_params",{reason:"Invalid child index"});if(G==="h"||G==="H"||G==="'")F[v]+=M;else if(G.length>0)throw new I("wallet_keepkey_invalid_params",{reason:"Invalid modifier"})}}return F}
2
- export{U as c,X as d};
2
+ export{U as a,X as b};
3
3
 
4
- //# debugId=A46876CC32E4781D64756E2164756E21
5
- //# sourceMappingURL=chunk-1jexf7qt.js.map
4
+ //# debugId=21044284CC8847F864756E2164756E21
5
+ //# sourceMappingURL=chunk-7fsaymh4.js.map
@@ -5,6 +5,6 @@
5
5
  "/*\n KeepKey Specific bip32 path conventions\n*/\n\nimport { SwapKitError } from \"@swapkit/helpers\";\n\nconst HARDENED = 0x80000000;\n\nexport enum ChainToKeepKeyName {\n BTC = \"Bitcoin\",\n BCH = \"BitcoinCash\",\n DOGE = \"Dogecoin\",\n LTC = \"Litecoin\",\n DASH = \"Dash\",\n XRP = \"Ripple\",\n}\n\nexport function addressNListToBIP32(address: number[]) {\n return `m/${address.map((num) => (num >= HARDENED ? `${num - HARDENED}'` : num)).join(\"/\")}`;\n}\n\nexport function bip32Like(path: string) {\n if (path === \"m/\") return true;\n\n return /^m(((\\/[0-9]+h)+|(\\/[0-9]+H)+|(\\/[0-9]+')*)((\\/[0-9]+)*))$/.test(path);\n}\n\nexport function bip32ToAddressNList(initPath: string): number[] {\n let path = initPath;\n\n if (!bip32Like(path)) {\n throw new SwapKitError(\"wallet_keepkey_invalid_params\", { reason: `Not a bip32 path: '${path}'` });\n }\n\n if (/^m\\//i.test(path)) {\n path = path.slice(2);\n }\n const segments = path.split(\"/\");\n\n if (segments.length === 1 && segments[0] === \"\") return [];\n\n const ret = new Array(segments.length);\n\n for (let i = 0; i < segments.length; i++) {\n // TODO: Check for better way instead of exec\n const segment = segments[i];\n if (segment) {\n const tmp = /(\\d+)([hH']?)/.exec(segment);\n if (tmp === null) throw new SwapKitError(\"wallet_keepkey_invalid_params\", { reason: \"Invalid input\" });\n\n const [, num = \"\", modifier = \"\"] = tmp;\n\n ret[i] = Number.parseInt(num, 10);\n\n if (ret[i] >= HARDENED)\n throw new SwapKitError(\"wallet_keepkey_invalid_params\", { reason: \"Invalid child index\" });\n\n if (modifier === \"h\" || modifier === \"H\" || modifier === \"'\") {\n ret[i] += HARDENED;\n } else if (modifier.length > 0) {\n throw new SwapKitError(\"wallet_keepkey_invalid_params\", { reason: \"Invalid modifier\" });\n }\n }\n }\n\n return ret;\n}\n"
6
6
  ],
7
7
  "mappings": "AAIA,uBAAS,yBAET,IAAM,EAAW,WAEL,GAAL,CAAK,IAAL,CACL,MAAM,UACN,MAAM,cACN,OAAO,WACP,MAAM,WACN,OAAO,OACP,MAAM,WANI,QAaL,SAAS,CAAS,CAAC,EAAc,CACtC,GAAI,IAAS,KAAM,MAAO,GAE1B,MAAO,6DAA6D,KAAK,CAAI,EAGxE,SAAS,CAAmB,CAAC,EAA4B,CAC9D,IAAI,EAAO,EAEX,GAAI,CAAC,EAAU,CAAI,EACjB,MAAM,IAAI,EAAa,gCAAiC,CAAE,OAAQ,sBAAsB,IAAQ,CAAC,EAGnG,GAAI,QAAQ,KAAK,CAAI,EACnB,EAAO,EAAK,MAAM,CAAC,EAErB,IAAM,EAAW,EAAK,MAAM,GAAG,EAE/B,GAAI,EAAS,SAAW,GAAK,EAAS,KAAO,GAAI,MAAO,CAAC,EAEzD,IAAM,EAAU,MAAM,EAAS,MAAM,EAErC,QAAS,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CAExC,IAAM,EAAU,EAAS,GACzB,GAAI,EAAS,CACX,IAAM,EAAM,gBAAgB,KAAK,CAAO,EACxC,GAAI,IAAQ,KAAM,MAAM,IAAI,EAAa,gCAAiC,CAAE,OAAQ,eAAgB,CAAC,EAErG,KAAS,EAAM,GAAI,EAAW,IAAM,EAIpC,GAFA,EAAI,GAAK,OAAO,SAAS,EAAK,EAAE,EAE5B,EAAI,IAAM,EACZ,MAAM,IAAI,EAAa,gCAAiC,CAAE,OAAQ,qBAAsB,CAAC,EAE3F,GAAI,IAAa,KAAO,IAAa,KAAO,IAAa,IACvD,EAAI,IAAM,EACL,QAAI,EAAS,OAAS,EAC3B,MAAM,IAAI,EAAa,gCAAiC,CAAE,OAAQ,kBAAmB,CAAC,GAK5F,OAAO",
8
- "debugId": "A46876CC32E4781D64756E2164756E21",
8
+ "debugId": "21044284CC8847F864756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,4 +1,4 @@
1
- import{e as M}from"./chunk-1jpcb30j.js";import{ChainToChainId as w,derivationPathToString as Z,SwapKitError as B,SwapKitNumber as E,WalletOption as u}from"@swapkit/helpers";async function y({chain:C,derivationPath:H,provider:L}){let{AbstractSigner:f,Signature:I}=await import("ethers");class $ extends f{address;chain;derivationPath;provider;constructor({chain:j,derivationPath:q,provider:J}){super(J);this.address="",this.chain=j,this.derivationPath=q,this.provider=J}getAddress=async()=>{if(!this.address){let q=await(await import("@trezor/connect-web")).default.ethereumGetAddress({path:Z(this.derivationPath),showOnTrezor:!0});if(!q.success)throw new B({errorKey:"wallet_trezor_failed_to_get_address",info:{...q,chain:this.chain,derivationPath:this.derivationPath}});this.address=q.payload.address}return this.address};signMessage=async(j)=>{let J=await(await import("@trezor/connect-web")).default.ethereumSignMessage({message:j,path:Z(this.derivationPath)});if(!J.success)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{...J,chain:this.chain,derivationPath:this.derivationPath,message:j}});return J.payload.signature};signTypedData=async(j,q,J,A)=>{let O=(await import("@trezor/connect-web")).default,{buildEIP712DomainType:V}=await import("@swapkit/toolboxes/evm"),{TypedDataEncoder:X}=await import("ethers"),{EIP712Domain:Y,...Q}=q,W=A??X.from(Q).primaryType,R=V(j),D={domain:j,message:J,primaryType:W,types:{EIP712Domain:R,...Q}},U=await O.ethereumSignTypedData({data:D,metamask_v4_compat:!0,path:Z(this.derivationPath)});if(!U.success)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:this.chain,error:U.payload.error}});return U.payload.signature.startsWith("0x")?U.payload.signature:`0x${U.payload.signature}`};signTransaction=async({to:j,gasLimit:q,value:J,data:A,nonce:O,maxFeePerGas:V,maxPriorityFeePerGas:X,gasPrice:Y})=>{if(!j)throw new B({errorKey:"wallet_missing_params",info:{to:j}});if(!q)throw new B({errorKey:"wallet_missing_params",info:{gasLimit:q}});let Q=V&&X;if(Q&&!V)throw new B({errorKey:"wallet_missing_params",info:{maxFeePerGas:V}});if(Q&&!X)throw new B({errorKey:"wallet_missing_params",info:{maxPriorityFeePerGas:X}});if(!(Q||Y))throw new B({errorKey:"wallet_missing_params",info:{gasPrice:Y}});let W=(await import("@trezor/connect-web")).default,{toHexString:R}=await import("@swapkit/toolboxes/evm"),{Transaction:D}=await import("ethers"),U=Q?{maxFeePerGas:R(BigInt(V?.toString()||0)),maxPriorityFeePerGas:R(BigInt(X?.toString()||0))}:Y&&{gasPrice:R(BigInt(Y?.toString()||0))}||{gasPrice:"0x0"},b=R(BigInt(O||await this.provider.getTransactionCount(await this.getAddress(),"pending"))),N={chainId:Number.parseInt(w[this.chain],10),data:A?.toString()||"0x",gasLimit:R(BigInt(q?.toString()||0)),nonce:b,to:j.toString(),value:R(BigInt(J?.toString()||0)),...U},{success:z,payload:k}=await W.ethereumSignTransaction({path:Z(this.derivationPath),transaction:N});if(!z)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{...k,chain:this.chain,derivationPath:this.derivationPath}});let{r:K,s:G,v:F}=k,h=I.from({r:K,s:G,v:new E(BigInt(F)).getBaseValue("number")}),_=D.from({...N,nonce:Number.parseInt(N.nonce,16),signature:h,type:Q?2:0}).serialized;if(!_)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:this.chain,derivationPath:this.derivationPath}});return _};connect=(j)=>{if(!j)throw new B({errorKey:"wallet_provider_not_found",info:{chain:this.chain,derivationPath:this.derivationPath,wallet:u.TREZOR}});return new $({chain:this.chain,derivationPath:this.derivationPath,provider:j})}}return new $({chain:C,derivationPath:H,provider:L})}export{y as getEVMSigner};
1
+ import{d as M}from"./chunk-n05bv2n5.js";import{ChainToChainId as w,derivationPathToString as Z,SwapKitError as B,SwapKitNumber as E,WalletOption as u}from"@swapkit/helpers";async function y({chain:C,derivationPath:H,provider:L}){let{AbstractSigner:f,Signature:I}=await import("ethers");class $ extends f{address;chain;derivationPath;provider;constructor({chain:j,derivationPath:q,provider:J}){super(J);this.address="",this.chain=j,this.derivationPath=q,this.provider=J}getAddress=async()=>{if(!this.address){let q=await(await import("@trezor/connect-web")).default.ethereumGetAddress({path:Z(this.derivationPath),showOnTrezor:!0});if(!q.success)throw new B({errorKey:"wallet_trezor_failed_to_get_address",info:{...q,chain:this.chain,derivationPath:this.derivationPath}});this.address=q.payload.address}return this.address};signMessage=async(j)=>{let J=await(await import("@trezor/connect-web")).default.ethereumSignMessage({message:j,path:Z(this.derivationPath)});if(!J.success)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{...J,chain:this.chain,derivationPath:this.derivationPath,message:j}});return J.payload.signature};signTypedData=async(j,q,J,A)=>{let O=(await import("@trezor/connect-web")).default,{buildEIP712DomainType:V}=await import("@swapkit/toolboxes/evm"),{TypedDataEncoder:X}=await import("ethers"),{EIP712Domain:Y,...Q}=q,W=A??X.from(Q).primaryType,R=V(j),D={domain:j,message:J,primaryType:W,types:{EIP712Domain:R,...Q}},U=await O.ethereumSignTypedData({data:D,metamask_v4_compat:!0,path:Z(this.derivationPath)});if(!U.success)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:this.chain,error:U.payload.error}});return U.payload.signature.startsWith("0x")?U.payload.signature:`0x${U.payload.signature}`};signTransaction=async({to:j,gasLimit:q,value:J,data:A,nonce:O,maxFeePerGas:V,maxPriorityFeePerGas:X,gasPrice:Y})=>{if(!j)throw new B({errorKey:"wallet_missing_params",info:{to:j}});if(!q)throw new B({errorKey:"wallet_missing_params",info:{gasLimit:q}});let Q=V&&X;if(Q&&!V)throw new B({errorKey:"wallet_missing_params",info:{maxFeePerGas:V}});if(Q&&!X)throw new B({errorKey:"wallet_missing_params",info:{maxPriorityFeePerGas:X}});if(!(Q||Y))throw new B({errorKey:"wallet_missing_params",info:{gasPrice:Y}});let W=(await import("@trezor/connect-web")).default,{toHexString:R}=await import("@swapkit/toolboxes/evm"),{Transaction:D}=await import("ethers"),U=Q?{maxFeePerGas:R(BigInt(V?.toString()||0)),maxPriorityFeePerGas:R(BigInt(X?.toString()||0))}:Y&&{gasPrice:R(BigInt(Y?.toString()||0))}||{gasPrice:"0x0"},b=R(BigInt(O||await this.provider.getTransactionCount(await this.getAddress(),"pending"))),N={chainId:Number.parseInt(w[this.chain],10),data:A?.toString()||"0x",gasLimit:R(BigInt(q?.toString()||0)),nonce:b,to:j.toString(),value:R(BigInt(J?.toString()||0)),...U},{success:z,payload:k}=await W.ethereumSignTransaction({path:Z(this.derivationPath),transaction:N});if(!z)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{...k,chain:this.chain,derivationPath:this.derivationPath}});let{r:K,s:G,v:F}=k,h=I.from({r:K,s:G,v:new E(BigInt(F)).getBaseValue("number")}),_=D.from({...N,nonce:Number.parseInt(N.nonce,16),signature:h,type:Q?2:0}).serialized;if(!_)throw new B({errorKey:"wallet_trezor_failed_to_sign_transaction",info:{chain:this.chain,derivationPath:this.derivationPath}});return _};connect=(j)=>{if(!j)throw new B({errorKey:"wallet_provider_not_found",info:{chain:this.chain,derivationPath:this.derivationPath,wallet:u.TREZOR}});return new $({chain:this.chain,derivationPath:this.derivationPath,provider:j})}}return new $({chain:C,derivationPath:H,provider:L})}export{y as getEVMSigner};
2
2
 
3
- //# debugId=D61B5080CA3C4A5964756E2164756E21
4
- //# sourceMappingURL=chunk-skvfn1dg.js.map
3
+ //# debugId=25ED379438549D1964756E2164756E21
4
+ //# sourceMappingURL=chunk-9tg9jj9j.js.map
@@ -5,6 +5,6 @@
5
5
  "import {\n type Chain,\n ChainToChainId,\n type DerivationPathArray,\n derivationPathToString,\n SwapKitError,\n SwapKitNumber,\n WalletOption,\n} from \"@swapkit/helpers\";\nimport type { JsonRpcProvider, Provider, TransactionRequest, TypedDataDomain, TypedDataField } from \"ethers\";\n\ntype TrezorEVMSignerParams = {\n chain: Chain;\n derivationPath: DerivationPathArray;\n provider: Provider | JsonRpcProvider;\n};\n\nexport async function getEVMSigner({ chain, derivationPath, provider }: TrezorEVMSignerParams) {\n const { AbstractSigner, Signature } = await import(\"ethers\");\n\n class TrezorSigner extends AbstractSigner {\n address: string;\n chain: Chain;\n derivationPath: DerivationPathArray;\n readonly provider: Provider | JsonRpcProvider;\n\n constructor({ chain, derivationPath, provider }: TrezorEVMSignerParams) {\n super(provider);\n\n this.address = \"\";\n this.chain = chain;\n this.derivationPath = derivationPath;\n this.provider = provider;\n }\n\n getAddress = async () => {\n if (!this.address) {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const result = await TrezorConnect.ethereumGetAddress({\n path: derivationPathToString(this.derivationPath),\n showOnTrezor: true,\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_get_address\",\n info: { ...result, chain: this.chain, derivationPath: this.derivationPath },\n });\n }\n\n this.address = result.payload.address;\n }\n\n return this.address;\n };\n\n signMessage = async (message: string) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n\n const result = await TrezorConnect.ethereumSignMessage({\n message,\n path: derivationPathToString(this.derivationPath),\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { ...result, chain: this.chain, derivationPath: this.derivationPath, message },\n });\n }\n\n return result.payload.signature;\n };\n\n signTypedData = async (\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>,\n explicitPrimaryType?: string,\n ) => {\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { buildEIP712DomainType } = await import(\"@swapkit/toolboxes/evm\");\n const { TypedDataEncoder } = await import(\"ethers\");\n\n const { EIP712Domain: _, ...filteredTypes } = types;\n const primaryType = explicitPrimaryType ?? TypedDataEncoder.from(filteredTypes).primaryType;\n const domainTypes = buildEIP712DomainType(domain);\n\n const data = {\n domain: domain as Record<string, unknown>,\n message: value,\n primaryType,\n types: { EIP712Domain: domainTypes, ...filteredTypes },\n };\n\n const result = await TrezorConnect.ethereumSignTypedData({\n data: data as Parameters<typeof TrezorConnect.ethereumSignTypedData>[0][\"data\"],\n metamask_v4_compat: true,\n path: derivationPathToString(this.derivationPath),\n });\n\n if (!result.success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: this.chain, error: result.payload.error },\n });\n }\n\n return result.payload.signature.startsWith(\"0x\") ? result.payload.signature : `0x${result.payload.signature}`;\n };\n\n signTransaction = async ({\n to,\n gasLimit,\n value,\n data,\n nonce,\n maxFeePerGas,\n maxPriorityFeePerGas,\n gasPrice,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: any: refactor\n }: TransactionRequest) => {\n if (!to) throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { to } });\n if (!gasLimit) throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { gasLimit } });\n\n const isEIP1559 = maxFeePerGas && maxPriorityFeePerGas;\n\n if (isEIP1559 && !maxFeePerGas) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { maxFeePerGas } });\n }\n if (isEIP1559 && !maxPriorityFeePerGas) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { maxPriorityFeePerGas } });\n }\n if (!(isEIP1559 || gasPrice)) {\n throw new SwapKitError({ errorKey: \"wallet_missing_params\", info: { gasPrice } });\n }\n\n const TrezorConnect = (await import(\"@trezor/connect-web\")).default;\n const { toHexString } = await import(\"@swapkit/toolboxes/evm\");\n const { Transaction } = await import(\"ethers\");\n\n const additionalFields = isEIP1559\n ? {\n maxFeePerGas: toHexString(BigInt(maxFeePerGas?.toString() || 0)),\n maxPriorityFeePerGas: toHexString(BigInt(maxPriorityFeePerGas?.toString() || 0)),\n }\n : (gasPrice && { gasPrice: toHexString(BigInt(gasPrice?.toString() || 0)) }) || { gasPrice: \"0x0\" };\n\n const hexifiedNonce = toHexString(\n BigInt(nonce || (await this.provider.getTransactionCount(await this.getAddress(), \"pending\"))),\n );\n\n const formattedTx = {\n chainId: Number.parseInt(ChainToChainId[this.chain], 10),\n data: data?.toString() || \"0x\",\n gasLimit: toHexString(BigInt(gasLimit?.toString() || 0)),\n nonce: hexifiedNonce,\n to: to.toString(),\n value: toHexString(BigInt(value?.toString() || 0)),\n ...additionalFields,\n };\n\n const { success, payload } = await TrezorConnect.ethereumSignTransaction({\n path: derivationPathToString(this.derivationPath),\n transaction: formattedTx,\n });\n\n if (!success) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { ...payload, chain: this.chain, derivationPath: this.derivationPath },\n });\n }\n\n const { r, s, v } = payload;\n\n const signature = Signature.from({ r, s, v: new SwapKitNumber(BigInt(v)).getBaseValue(\"number\") });\n\n const serializedTx = Transaction.from({\n ...formattedTx,\n nonce: Number.parseInt(formattedTx.nonce, 16),\n signature,\n type: isEIP1559 ? 2 : 0,\n }).serialized;\n\n if (!serializedTx) {\n throw new SwapKitError({\n errorKey: \"wallet_trezor_failed_to_sign_transaction\",\n info: { chain: this.chain, derivationPath: this.derivationPath },\n });\n }\n\n return serializedTx;\n };\n\n connect = (provider: Provider | null) => {\n if (!provider) {\n throw new SwapKitError({\n errorKey: \"wallet_provider_not_found\",\n info: { chain: this.chain, derivationPath: this.derivationPath, wallet: WalletOption.TREZOR },\n });\n }\n\n return new TrezorSigner({ chain: this.chain, derivationPath: this.derivationPath, provider });\n };\n }\n\n return new TrezorSigner({ chain, derivationPath, provider });\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "D61B5080CA3C4A5964756E2164756E21",
8
+ "debugId": "25ED379438549D1964756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,4 @@
1
+ var A=require("@scure/base");async function E(q){let{RawTx:D}=await import("@swapkit/utxo-signer"),v=[];for(let j=0;j<q.inputsLength;j++){let f=q.getInput(j);if(!f.txid||f.index===void 0)throw Error(`PSBT input ${j} is missing txid/index`);let B=f.nonWitnessUtxo?A.hex.encode(D.encode(f.nonWitnessUtxo)):"",z=f.witnessUtxo?{script:f.witnessUtxo.script,value:Number(f.witnessUtxo.amount)}:void 0;v.push({hash:A.hex.encode(f.txid),index:f.index,txHex:B,value:z?.value??0,witnessUtxo:z})}return v}function G({legacyClient:q,chain:D,address:v}){return{getAddress:async()=>v,signTransaction:async(j)=>{let f=await E(j),B=await q.signTransaction(j,f),{Transaction:z}=await import("@swapkit/utxo-signer");return z.fromRaw(A.hex.decode(B))}}}
2
+
3
+ //# debugId=E761B05D18A24EBF64756E2164756E21
4
+ //# sourceMappingURL=chunk-mrsfcest.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ledger/clients/utxo-legacy-adapter.ts"],
4
+ "sourcesContent": [
5
+ "import { hex } from \"@scure/base\";\nimport type { UTXOChain } from \"@swapkit/helpers\";\nimport type { UTXOType } from \"@swapkit/toolboxes/utxo\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\n\n/**\n * Extract per-input metadata from a V3 PSBT in the shape the legacy\n * `@ledgerhq/hw-app-btc.createPaymentTransaction` adapter expects.\n *\n * For segwit inputs the SwapKit V3 API populates `witnessUtxo`; for legacy\n * (BCH/DOGE/DASH) it populates `nonWitnessUtxo` with the full prior-tx bytes.\n * We re-encode the parsed `nonWitnessUtxo` back to hex via `RawTx.encode` so\n * `btcApp.splitTransaction(hex)` can consume it.\n *\n * Single-address account assumption: all inputs share our derivation path.\n */\nexport async function extractInputsFromPsbt(tx: Transaction): Promise<UTXOType[]> {\n const { RawTx } = await import(\"@swapkit/utxo-signer\");\n const inputs: UTXOType[] = [];\n\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n\n if (!input.txid || input.index === undefined) {\n throw new Error(`PSBT input ${i} is missing txid/index`);\n }\n\n const txHex = input.nonWitnessUtxo ? hex.encode(RawTx.encode(input.nonWitnessUtxo)) : \"\";\n const witnessUtxo = input.witnessUtxo\n ? { script: input.witnessUtxo.script, value: Number(input.witnessUtxo.amount) }\n : undefined;\n\n inputs.push({\n hash: hex.encode(input.txid),\n index: input.index,\n txHex,\n value: witnessUtxo?.value ?? 0,\n witnessUtxo,\n } as UTXOType);\n }\n\n return inputs;\n}\n\n/**\n * Build a toolbox-compatible signer from the existing legacy Ledger UTXO\n * client. The toolbox synthesizes `signAndBroadcastTransaction` on top of\n * `signer.signTransaction(tx) → Transaction`.\n */\nexport function createLegacyPsbtSigner({\n legacyClient,\n chain: _chain,\n address,\n}: {\n legacyClient: { signTransaction: (tx: Transaction, inputUtxos: UTXOType[]) => Promise<string> };\n chain: UTXOChain;\n address: string;\n}) {\n return {\n getAddress: async () => address,\n signTransaction: async (tx: Transaction): Promise<Transaction> => {\n const inputUtxos = await extractInputsFromPsbt(tx);\n const signedTxHex = await legacyClient.signTransaction(tx, inputUtxos);\n\n const { Transaction: TxClass } = await import(\"@swapkit/utxo-signer\");\n // `Transaction.fromRaw` parses a serialised tx (no PSBT envelope) — exactly\n // what `createPaymentTransaction` returns.\n return TxClass.fromRaw(hex.decode(signedTxHex));\n },\n };\n}\n"
6
+ ],
7
+ "mappings": "AAAoB,IAApB,yBAgBA,eAAsB,CAAqB,CAAC,EAAsC,CAChF,IAAQ,SAAU,KAAa,gCACzB,EAAqB,CAAC,EAE5B,QAAS,EAAI,EAAG,EAAI,EAAG,aAAc,IAAK,CACxC,IAAM,EAAQ,EAAG,SAAS,CAAC,EAE3B,GAAI,CAAC,EAAM,MAAQ,EAAM,QAAU,OACjC,MAAU,MAAM,cAAc,yBAAyB,EAGzD,IAAM,EAAQ,EAAM,eAAiB,MAAI,OAAO,EAAM,OAAO,EAAM,cAAc,CAAC,EAAI,GAChF,EAAc,EAAM,YACtB,CAAE,OAAQ,EAAM,YAAY,OAAQ,MAAO,OAAO,EAAM,YAAY,MAAM,CAAE,EAC5E,OAEJ,EAAO,KAAK,CACV,KAAM,MAAI,OAAO,EAAM,IAAI,EAC3B,MAAO,EAAM,MACb,QACA,MAAO,GAAa,OAAS,EAC7B,aACF,CAAa,EAGf,OAAO,EAQF,SAAS,CAAsB,EACpC,eACA,MAAO,EACP,WAKC,CACD,MAAO,CACL,WAAY,SAAY,EACxB,gBAAiB,MAAO,IAA0C,CAChE,IAAM,EAAa,MAAM,EAAsB,CAAE,EAC3C,EAAc,MAAM,EAAa,gBAAgB,EAAI,CAAU,GAE7D,YAAa,GAAY,KAAa,gCAG9C,OAAO,EAAQ,QAAQ,MAAI,OAAO,CAAW,CAAC,EAElD",
8
+ "debugId": "E761B05D18A24EBF64756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,5 +1,5 @@
1
1
  var d=((a)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});
2
- export{d as e};
2
+ export{d};
3
3
 
4
- //# debugId=C12E7419EA3375B964756E2164756E21
5
- //# sourceMappingURL=chunk-1jpcb30j.js.map
4
+ //# debugId=9C53265D397A7C1564756E2164756E21
5
+ //# sourceMappingURL=chunk-n05bv2n5.js.map
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "C12E7419EA3375B964756E2164756E21",
7
+ "debugId": "9C53265D397A7C1564756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -0,0 +1,4 @@
1
+ import{d as E}from"./chunk-n05bv2n5.js";import{hex as B}from"@scure/base";async function G(q){let{RawTx:D}=await import("@swapkit/utxo-signer"),v=[];for(let j=0;j<q.inputsLength;j++){let f=q.getInput(j);if(!f.txid||f.index===void 0)throw Error(`PSBT input ${j} is missing txid/index`);let A=f.nonWitnessUtxo?B.encode(D.encode(f.nonWitnessUtxo)):"",z=f.witnessUtxo?{script:f.witnessUtxo.script,value:Number(f.witnessUtxo.amount)}:void 0;v.push({hash:B.encode(f.txid),index:f.index,txHex:A,value:z?.value??0,witnessUtxo:z})}return v}function K({legacyClient:q,chain:D,address:v}){return{getAddress:async()=>v,signTransaction:async(j)=>{let f=await G(j),A=await q.signTransaction(j,f),{Transaction:z}=await import("@swapkit/utxo-signer");return z.fromRaw(B.decode(A))}}}export{G as extractInputsFromPsbt,K as createLegacyPsbtSigner};
2
+
3
+ //# debugId=95BF8F59DBE0DD4C64756E2164756E21
4
+ //# sourceMappingURL=chunk-px09mwnt.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ledger/clients/utxo-legacy-adapter.ts"],
4
+ "sourcesContent": [
5
+ "import { hex } from \"@scure/base\";\nimport type { UTXOChain } from \"@swapkit/helpers\";\nimport type { UTXOType } from \"@swapkit/toolboxes/utxo\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\n\n/**\n * Extract per-input metadata from a V3 PSBT in the shape the legacy\n * `@ledgerhq/hw-app-btc.createPaymentTransaction` adapter expects.\n *\n * For segwit inputs the SwapKit V3 API populates `witnessUtxo`; for legacy\n * (BCH/DOGE/DASH) it populates `nonWitnessUtxo` with the full prior-tx bytes.\n * We re-encode the parsed `nonWitnessUtxo` back to hex via `RawTx.encode` so\n * `btcApp.splitTransaction(hex)` can consume it.\n *\n * Single-address account assumption: all inputs share our derivation path.\n */\nexport async function extractInputsFromPsbt(tx: Transaction): Promise<UTXOType[]> {\n const { RawTx } = await import(\"@swapkit/utxo-signer\");\n const inputs: UTXOType[] = [];\n\n for (let i = 0; i < tx.inputsLength; i++) {\n const input = tx.getInput(i);\n\n if (!input.txid || input.index === undefined) {\n throw new Error(`PSBT input ${i} is missing txid/index`);\n }\n\n const txHex = input.nonWitnessUtxo ? hex.encode(RawTx.encode(input.nonWitnessUtxo)) : \"\";\n const witnessUtxo = input.witnessUtxo\n ? { script: input.witnessUtxo.script, value: Number(input.witnessUtxo.amount) }\n : undefined;\n\n inputs.push({\n hash: hex.encode(input.txid),\n index: input.index,\n txHex,\n value: witnessUtxo?.value ?? 0,\n witnessUtxo,\n } as UTXOType);\n }\n\n return inputs;\n}\n\n/**\n * Build a toolbox-compatible signer from the existing legacy Ledger UTXO\n * client. The toolbox synthesizes `signAndBroadcastTransaction` on top of\n * `signer.signTransaction(tx) → Transaction`.\n */\nexport function createLegacyPsbtSigner({\n legacyClient,\n chain: _chain,\n address,\n}: {\n legacyClient: { signTransaction: (tx: Transaction, inputUtxos: UTXOType[]) => Promise<string> };\n chain: UTXOChain;\n address: string;\n}) {\n return {\n getAddress: async () => address,\n signTransaction: async (tx: Transaction): Promise<Transaction> => {\n const inputUtxos = await extractInputsFromPsbt(tx);\n const signedTxHex = await legacyClient.signTransaction(tx, inputUtxos);\n\n const { Transaction: TxClass } = await import(\"@swapkit/utxo-signer\");\n // `Transaction.fromRaw` parses a serialised tx (no PSBT envelope) — exactly\n // what `createPaymentTransaction` returns.\n return TxClass.fromRaw(hex.decode(signedTxHex));\n },\n };\n}\n"
6
+ ],
7
+ "mappings": "wCAAA,cAAS,oBAgBT,eAAsB,CAAqB,CAAC,EAAsC,CAChF,IAAQ,SAAU,KAAa,gCACzB,EAAqB,CAAC,EAE5B,QAAS,EAAI,EAAG,EAAI,EAAG,aAAc,IAAK,CACxC,IAAM,EAAQ,EAAG,SAAS,CAAC,EAE3B,GAAI,CAAC,EAAM,MAAQ,EAAM,QAAU,OACjC,MAAU,MAAM,cAAc,yBAAyB,EAGzD,IAAM,EAAQ,EAAM,eAAiB,EAAI,OAAO,EAAM,OAAO,EAAM,cAAc,CAAC,EAAI,GAChF,EAAc,EAAM,YACtB,CAAE,OAAQ,EAAM,YAAY,OAAQ,MAAO,OAAO,EAAM,YAAY,MAAM,CAAE,EAC5E,OAEJ,EAAO,KAAK,CACV,KAAM,EAAI,OAAO,EAAM,IAAI,EAC3B,MAAO,EAAM,MACb,QACA,MAAO,GAAa,OAAS,EAC7B,aACF,CAAa,EAGf,OAAO,EAQF,SAAS,CAAsB,EACpC,eACA,MAAO,EACP,WAKC,CACD,MAAO,CACL,WAAY,SAAY,EACxB,gBAAiB,MAAO,IAA0C,CAChE,IAAM,EAAa,MAAM,EAAsB,CAAE,EAC3C,EAAc,MAAM,EAAa,gBAAgB,EAAI,CAAU,GAE7D,YAAa,GAAY,KAAa,gCAG9C,OAAO,EAAQ,QAAQ,EAAI,OAAO,CAAW,CAAC,EAElD",
8
+ "debugId": "95BF8F59DBE0DD4C64756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,4 +1,4 @@
1
- import{d as z}from"./chunk-1jexf7qt.js";import"./chunk-1jpcb30j.js";import{Chain as W,DerivationPath as X,derivationPathToString as Y}from"@swapkit/helpers";import{getRippleToolbox as Z}from"@swapkit/toolboxes/ripple";var w=async({sdk:E,derivationPath:F})=>{let G=F?Y(F):`${X[W.Ripple]}/0`,{address:j}=await E.address.xrpGetAddress({address_n:z(G)}),y=await Z({signer:{getAddress:()=>Promise.resolve(j),signTransaction:()=>{throw Error("signTransaction not supported via toolbox")}}});return{...y,address:j,getAddress:()=>j,transfer:async({recipient:I,assetValue:M,memo:q})=>{let f=await y.createTransaction({assetValue:M,memo:q,recipient:I,sender:j}),O={type:"auth/StdTx",value:{fee:{amount:[{amount:"1000",denom:"drop"}],gas:"28000"},memo:q&&q.length>0?q:"",msg:[{type:"ripple-sdk/MsgSend",value:{amount:[{amount:f.Amount,denom:"drop"}],from_address:j,to_address:I}}],signatures:null}},Q={addressNList:z(G),flags:f.Flags===0?void 0:f.Flags,lastLedgerSequence:f.LastLedgerSequence?.toString(),payment:{amount:f.Amount,destination:f.Destination,destinationTag:(f.DestinationTag??"0").toString()},sequence:(f.Sequence??0).toString(),tx:O},J=JSON.parse(await E.xrp.xrpSignTransaction(Q)),K=J.tx_blob??J.value?.signatures?.[0]?.serializedTx;if(!K)throw Error("KeepKey XRP sign failed");let U=Buffer.from(K,"base64").toString("hex");return y.broadcastTransaction(U)}}};export{w as rippleWalletMethods};
1
+ import{b as z}from"./chunk-7fsaymh4.js";import"./chunk-n05bv2n5.js";import{Chain as W,DerivationPath as X,derivationPathToString as Y}from"@swapkit/helpers";import{getRippleToolbox as Z}from"@swapkit/toolboxes/ripple";var w=async({sdk:E,derivationPath:F})=>{let G=F?Y(F):`${X[W.Ripple]}/0`,{address:j}=await E.address.xrpGetAddress({address_n:z(G)}),y=await Z({signer:{getAddress:()=>Promise.resolve(j),signTransaction:()=>{throw Error("signTransaction not supported via toolbox")}}});return{...y,address:j,getAddress:()=>j,transfer:async({recipient:I,assetValue:M,memo:q})=>{let f=await y.createTransaction({assetValue:M,memo:q,recipient:I,sender:j}),O={type:"auth/StdTx",value:{fee:{amount:[{amount:"1000",denom:"drop"}],gas:"28000"},memo:q&&q.length>0?q:"",msg:[{type:"ripple-sdk/MsgSend",value:{amount:[{amount:f.Amount,denom:"drop"}],from_address:j,to_address:I}}],signatures:null}},Q={addressNList:z(G),flags:f.Flags===0?void 0:f.Flags,lastLedgerSequence:f.LastLedgerSequence?.toString(),payment:{amount:f.Amount,destination:f.Destination,destinationTag:(f.DestinationTag??"0").toString()},sequence:(f.Sequence??0).toString(),tx:O},J=JSON.parse(await E.xrp.xrpSignTransaction(Q)),K=J.tx_blob??J.value?.signatures?.[0]?.serializedTx;if(!K)throw Error("KeepKey XRP sign failed");let U=Buffer.from(K,"base64").toString("hex");return y.broadcastTransaction(U)}}};export{w as rippleWalletMethods};
2
2
 
3
- //# debugId=AECB70126D85316964756E2164756E21
4
- //# sourceMappingURL=chunk-ybje7f3s.js.map
3
+ //# debugId=B9E7C62A7E5CA45F64756E2164756E21
4
+ //# sourceMappingURL=chunk-vwv6z2mk.js.map
@@ -5,6 +5,6 @@
5
5
  "import type { KeepKeySdk } from \"@keepkey/keepkey-sdk\";\nimport {\n Chain,\n DerivationPath,\n type DerivationPathArray,\n derivationPathToString,\n type GenericTransferParams,\n} from \"@swapkit/helpers\";\nimport { getRippleToolbox } from \"@swapkit/toolboxes/ripple\";\nimport { bip32ToAddressNList } from \"../coins\";\n\nexport const rippleWalletMethods = async ({\n sdk,\n derivationPath,\n}: {\n sdk: KeepKeySdk;\n derivationPath?: DerivationPathArray;\n}) => {\n // Derivation path handling (default to standard XRP 44'/144'/0'/0/0)\n const derivationPathString = derivationPath\n ? derivationPathToString(derivationPath)\n : `${DerivationPath[Chain.Ripple]}/0`;\n\n // Fetch address from KeepKey\n const { address } = await (sdk as any).address.xrpGetAddress({\n address_n: bip32ToAddressNList(derivationPathString),\n });\n\n // Inject minimal signer so toolbox's address helpers work\n const signer = {\n getAddress: () => Promise.resolve(address),\n signTransaction: () => {\n throw new Error(\"signTransaction not supported via toolbox\");\n },\n };\n\n const toolbox = await getRippleToolbox({ signer });\n\n const transfer = async ({ recipient, assetValue, memo }: GenericTransferParams) => {\n // Build XRPL Payment tx using toolbox helper\n const tx = await toolbox.createTransaction({ assetValue, memo, recipient, sender: address });\n\n // Convert toolbox Payment tx into KeepKey StdTx wrapper (KeepKey-specific format)\n const stdTx = {\n type: \"auth/StdTx\",\n value: {\n fee: { amount: [{ amount: \"1000\", denom: \"drop\" }], gas: \"28000\" },\n memo: memo && memo.length > 0 ? memo : \"\",\n msg: [\n {\n type: \"ripple-sdk/MsgSend\",\n value: { amount: [{ amount: tx.Amount, denom: \"drop\" }], from_address: address, to_address: recipient },\n },\n ],\n signatures: null,\n },\n };\n\n const unsignedTx = {\n addressNList: bip32ToAddressNList(derivationPathString),\n flags: tx.Flags === 0 ? undefined : tx.Flags,\n lastLedgerSequence: tx.LastLedgerSequence?.toString(),\n payment: {\n amount: tx.Amount,\n destination: tx.Destination,\n destinationTag: (tx.DestinationTag ?? \"0\").toString(),\n },\n sequence: (tx.Sequence ?? 0).toString(),\n tx: stdTx,\n } as any;\n\n // Sign with KeepKey\n const responseSign = JSON.parse(await (sdk as any).xrp.xrpSignTransaction(unsignedTx));\n\n // keepkey-sdk may return either { tx_blob } or StdTx with Base64 serializedTx\n const txBlob: string | undefined =\n (responseSign as any).tx_blob ?? (responseSign as any).value?.signatures?.[0]?.serializedTx;\n if (!txBlob) throw new Error(\"KeepKey XRP sign failed\");\n\n const buffer = Buffer.from(txBlob, \"base64\");\n const txBlobHex = buffer.toString(\"hex\");\n\n // Broadcast signed tx via toolbox\n return toolbox.broadcastTransaction(txBlobHex);\n };\n\n return { ...toolbox, address, getAddress: () => address, transfer };\n};\n"
6
6
  ],
7
7
  "mappings": "0EACA,UACE,oBACA,4BAEA,yBAGF,2BAAS,kCAGF,IAAM,EAAsB,OACjC,MACA,oBAII,CAEJ,IAAM,EAAuB,EACzB,EAAuB,CAAc,EACrC,GAAG,EAAe,EAAM,aAGpB,WAAY,MAAO,EAAY,QAAQ,cAAc,CAC3D,UAAW,EAAoB,CAAoB,CACrD,CAAC,EAUK,EAAU,MAAM,EAAiB,CAAE,OAP1B,CACb,WAAY,IAAM,QAAQ,QAAQ,CAAO,EACzC,gBAAiB,IAAM,CACrB,MAAU,MAAM,2CAA2C,EAE/D,CAEgD,CAAC,EAkDjD,MAAO,IAAK,EAAS,UAAS,WAAY,IAAM,EAAS,SAhDxC,OAAS,YAAW,aAAY,UAAkC,CAEjF,IAAM,EAAK,MAAM,EAAQ,kBAAkB,CAAE,aAAY,OAAM,YAAW,OAAQ,CAAQ,CAAC,EAGrF,EAAQ,CACZ,KAAM,aACN,MAAO,CACL,IAAK,CAAE,OAAQ,CAAC,CAAE,OAAQ,OAAQ,MAAO,MAAO,CAAC,EAAG,IAAK,OAAQ,EACjE,KAAM,GAAQ,EAAK,OAAS,EAAI,EAAO,GACvC,IAAK,CACH,CACE,KAAM,qBACN,MAAO,CAAE,OAAQ,CAAC,CAAE,OAAQ,EAAG,OAAQ,MAAO,MAAO,CAAC,EAAG,aAAc,EAAS,WAAY,CAAU,CACxG,CACF,EACA,WAAY,IACd,CACF,EAEM,EAAa,CACjB,aAAc,EAAoB,CAAoB,EACtD,MAAO,EAAG,QAAU,EAAI,OAAY,EAAG,MACvC,mBAAoB,EAAG,oBAAoB,SAAS,EACpD,QAAS,CACP,OAAQ,EAAG,OACX,YAAa,EAAG,YAChB,gBAAiB,EAAG,gBAAkB,KAAK,SAAS,CACtD,EACA,UAAW,EAAG,UAAY,GAAG,SAAS,EACtC,GAAI,CACN,EAGM,EAAe,KAAK,MAAM,MAAO,EAAY,IAAI,mBAAmB,CAAU,CAAC,EAG/E,EACH,EAAqB,SAAY,EAAqB,OAAO,aAAa,IAAI,aACjF,GAAI,CAAC,EAAQ,MAAU,MAAM,yBAAyB,EAGtD,IAAM,EADS,OAAO,KAAK,EAAQ,QAAQ,EAClB,SAAS,KAAK,EAGvC,OAAO,EAAQ,qBAAqB,CAAS,EAGmB",
8
- "debugId": "AECB70126D85316964756E2164756E21",
8
+ "debugId": "B9E7C62A7E5CA45F64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,4 @@
1
+ var K=require("@scure/base"),w=require("@scure/bip32"),R=require("@swapkit/helpers");function x(q){switch(q){case"bech32":return"wpkh(@0/**)";case"p2sh":return"sh(wpkh(@0/**))";case"legacy":return"pkh(@0/**)";default:return"wpkh(@0/**)"}}function f(q){return typeof q==="string"?q:R.derivationPathToString(q)}function m(q){return q.replace(/^m\//,"").split("/").filter(Boolean).map((J)=>{let V=J.endsWith("'"),M=Number.parseInt(V?J.slice(0,-1):J,10);return V?(M|2147483648)>>>0:M})}var B=({chain:q})=>{let J,V;async function M(){if(!J){let Y=await E(),{AppClient:Q}=await import("ledger-bitcoin");J=new Q(Y)}return J}async function X(){if(!V)V=await(await M()).getMasterFingerprint();return V}return(Y)=>{let Q=Y?f(Y):"84'/0'/0'/0/0",$=Q.split("/").slice(0,3).join("/"),N=Q.split("/").slice(3),O=Number(N[0]??0),U=Number(N[1]??0),k=R.getWalletFormatFor(Q),S=x(k),_,H;async function D(){let j=await M(),G=await X();if(!_)_=await j.getExtendedPubkey(`m/${$}`);let{DefaultWalletPolicy:z}=await import("ledger-bitcoin"),I=new z(S,`[${G}/${$}]${_}`);return{app:j,fpr:G,policy:I,xpub:_}}async function T(){if(!H){let{xpub:j}=await D(),z=w.HDKey.fromExtendedKey(j).derive(`m/${O}/${U}`);if(!z.publicKey)throw new R.SwapKitError("wallet_ledger_get_address_error",{message:`Cannot derive leaf pubkey for ${q}`});H=z.publicKey}return H}return{connect:async()=>{await M()},getAddress:async()=>{let{app:j,policy:G}=await D(),z=await j.getWalletAddress(G,null,O,U,!1);if(!z)throw new R.SwapKitError("wallet_ledger_get_address_error",{message:`Cannot get ${q} address from ledger derivation path: ${Q}`});return z},getExtendedPublicKey:async(j=`m/${$}`)=>{return(await M()).getExtendedPubkey(j)},signTransaction:async(j)=>{let{app:G,policy:z,fpr:I}=await D(),C=Number.parseInt(I,16)>>>0,F=m(Q),L=await T();for(let Z=0;Z<j.inputsLength;Z++)j.updateInput(Z,{bip32Derivation:[[L,{fingerprint:C,path:F}]]});let v=K.base64.encode(j.toPSBT(0)),A=await G.signPsbt(v,z,null);for(let[Z,W]of A)j.updateInput(Z,{partialSig:[[new Uint8Array(W.pubkey),new Uint8Array(W.signature)]]});return j.finalize(),j}}}},b=B({chain:"bitcoin"}),P=B({chain:"litecoin"});
2
+
3
+ //# debugId=0B3F2685533B86ED64756E2164756E21
4
+ //# sourceMappingURL=chunk-x85da57j.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ledger/clients/utxo-psbt.ts"],
4
+ "sourcesContent": [
5
+ "import { base64 } from \"@scure/base\";\nimport { HDKey } from \"@scure/bip32\";\nimport { type DerivationPathArray, derivationPathToString, getWalletFormatFor, SwapKitError } from \"@swapkit/helpers\";\nimport type { Transaction } from \"@swapkit/utxo-signer\";\n\nimport { getLedgerTransport } from \"../helpers/getLedgerTransport\";\n\ntype SupportedCoin = \"bitcoin\" | \"litecoin\";\n\ntype DefaultDescriptorTemplate = \"wpkh(@0/**)\" | \"tr(@0/**)\" | \"sh(wpkh(@0/**))\" | \"pkh(@0/**)\";\n\nfunction templateForFormat(format: ReturnType<typeof getWalletFormatFor>): DefaultDescriptorTemplate {\n switch (format) {\n case \"bech32\":\n return \"wpkh(@0/**)\";\n case \"p2sh\":\n return \"sh(wpkh(@0/**))\";\n case \"legacy\":\n return \"pkh(@0/**)\";\n default:\n return \"wpkh(@0/**)\";\n }\n}\n\nfunction pathToString(path: DerivationPathArray | string): string {\n return typeof path === \"string\" ? path : derivationPathToString(path);\n}\n\nfunction pathToNumberArray(path: string): number[] {\n return path\n .replace(/^m\\//, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map((p) => {\n const hardened = p.endsWith(\"'\");\n const num = Number.parseInt(hardened ? p.slice(0, -1) : p, 10);\n return hardened ? (num | 0x80000000) >>> 0 : num;\n });\n}\n\nconst BaseLedgerPsbtUTXO = ({ chain }: { chain: SupportedCoin }) => {\n let appClient: import(\"ledger-bitcoin\").AppClient | undefined;\n let masterFingerprint: string | undefined;\n\n async function getAppClient() {\n if (!appClient) {\n const transport = await getLedgerTransport();\n const { AppClient } = await import(\"ledger-bitcoin\");\n appClient = new AppClient(transport);\n }\n return appClient;\n }\n\n async function getFingerprint() {\n if (!masterFingerprint) {\n const app = await getAppClient();\n masterFingerprint = await app.getMasterFingerprint();\n }\n return masterFingerprint;\n }\n\n return (derivationPathArray?: DerivationPathArray | string) => {\n // Single-address account: change == index == 0 by default.\n const derivationPath = derivationPathArray ? pathToString(derivationPathArray) : \"84'/0'/0'/0/0\";\n const accountPath = derivationPath.split(\"/\").slice(0, 3).join(\"/\");\n const leafSegments = derivationPath.split(\"/\").slice(3);\n const change = Number(leafSegments[0] ?? 0);\n const addressIndex = Number(leafSegments[1] ?? 0);\n const format = getWalletFormatFor(derivationPath);\n const template = templateForFormat(format);\n\n let cachedAccountXpub: string | undefined;\n let cachedLeafPubkey: Uint8Array | undefined;\n\n async function buildPolicy() {\n const app = await getAppClient();\n const fpr = await getFingerprint();\n if (!cachedAccountXpub) {\n cachedAccountXpub = await app.getExtendedPubkey(`m/${accountPath}`);\n }\n const { DefaultWalletPolicy } = await import(\"ledger-bitcoin\");\n const policy = new DefaultWalletPolicy(template, `[${fpr}/${accountPath}]${cachedAccountXpub}`);\n return { app, fpr, policy, xpub: cachedAccountXpub };\n }\n\n async function getLeafPubkey() {\n if (!cachedLeafPubkey) {\n const { xpub } = await buildPolicy();\n const accountKey = HDKey.fromExtendedKey(xpub);\n const leaf = accountKey.derive(`m/${change}/${addressIndex}`);\n if (!leaf.publicKey) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", {\n message: `Cannot derive leaf pubkey for ${chain}`,\n });\n }\n cachedLeafPubkey = leaf.publicKey;\n }\n return cachedLeafPubkey;\n }\n\n return {\n connect: async () => {\n await getAppClient();\n },\n getAddress: async () => {\n const { app, policy } = await buildPolicy();\n const address = await app.getWalletAddress(policy, null, change, addressIndex, false);\n if (!address) {\n throw new SwapKitError(\"wallet_ledger_get_address_error\", {\n message: `Cannot get ${chain} address from ledger derivation path: ${derivationPath}`,\n });\n }\n return address;\n },\n getExtendedPublicKey: async (path = `m/${accountPath}`) => {\n const app = await getAppClient();\n return app.getExtendedPubkey(path);\n },\n signTransaction: async (tx: Transaction): Promise<Transaction> => {\n const { app, policy, fpr } = await buildPolicy();\n const fingerprintBE = Number.parseInt(fpr, 16) >>> 0;\n const pathNumbers = pathToNumberArray(derivationPath);\n const leafPubkey = await getLeafPubkey();\n\n // Single-address account: every input is owned by the same key + path.\n for (let i = 0; i < tx.inputsLength; i++) {\n tx.updateInput(i, { bip32Derivation: [[leafPubkey, { fingerprint: fingerprintBE, path: pathNumbers }]] });\n }\n\n const psbtB64 = base64.encode(tx.toPSBT(0));\n const sigs = await app.signPsbt(psbtB64, policy, null);\n\n for (const [idx, partial] of sigs) {\n tx.updateInput(idx, { partialSig: [[new Uint8Array(partial.pubkey), new Uint8Array(partial.signature)]] });\n }\n\n tx.finalize();\n return tx;\n },\n };\n };\n};\n\nexport const BitcoinPsbtLedger = BaseLedgerPsbtUTXO({ chain: \"bitcoin\" });\nexport const LitecoinPsbtLedger = BaseLedgerPsbtUTXO({ chain: \"litecoin\" });\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "0B3F2685533B86ED64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,4 @@
1
+ var z=require("@swapkit/helpers"),P=()=>navigator?.usb,_=async()=>{let j=P();if(typeof j?.getDevices!=="function")return{};let{ledgerUSBVendorId:F}=await import("@ledgerhq/devices"),G=(await j?.getDevices()).filter((M)=>M.vendorId===F);if(G.length>0)return G[0];return j?.requestDevice({filters:[{vendorId:F}]})},O=async()=>{let j=await _();if(!j)throw new z.SwapKitError("wallet_ledger_device_not_found");if(j.opened||await j.open(),j.configuration===null)await j.selectConfiguration(1);try{await j.reset()}catch{}let F=j.configuration??j.configurations?.[0],y=F?.interfaces.find(({alternates:m})=>m.some(({interfaceClass:J})=>J===255))||F?.interfaces.find(({alternates:m})=>m.some(({interfaceClass:J})=>J===3));if(!y)throw await j.close(),new z.SwapKitError("wallet_ledger_connection_error");let G=y.alternates?.find(({interfaceClass:m})=>m===3)?.interfaceClass,M=y.alternates?.find(({interfaceClass:m})=>m===255)?.interfaceClass;if(G&&!M){let m=(await import("@ledgerhq/hw-transport-webhid")).default;if(!await m.isSupported())throw await j.close(),new z.SwapKitError("wallet_ledger_webhid_not_supported");return await m.create()}try{await j.claimInterface(y.interfaceNumber)}catch(m){throw await j.close(),new z.SwapKitError("wallet_ledger_connection_claimed",m)}let Q=(await import("@ledgerhq/hw-transport-webusb")).default;if(!await Q.isSupported())throw new z.SwapKitError("wallet_ledger_webusb_not_supported");let{DisconnectedDevice:Z}=await import("@ledgerhq/errors"),X=new Q(j,y.interfaceNumber),Y=(m)=>{if(j===m.device)P()?.removeEventListener("disconnect",Y),X._emitDisconnect(new Z)};return P()?.addEventListener("disconnect",Y),X};
2
+
3
+ //# debugId=FCBF0AF43D42884C64756E2164756E21
4
+ //# sourceMappingURL=chunk-y3yvq1zt.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ledger/helpers/getLedgerTransport.ts"],
4
+ "sourcesContent": [
5
+ "import type Transport from \"@ledgerhq/hw-transport\";\nimport { SwapKitError } from \"@swapkit/helpers\";\n\nconst getNavigatorUsb = () =>\n navigator?.usb as unknown as {\n getDevices: () => Promise<any[]>;\n requestDevice: (requestObject: any) => Promise<any>;\n removeEventListener: (event: string, callback: (e: any) => void) => void;\n addEventListener: (event: string, callback: (e: any) => void) => void;\n };\n\nconst getLedgerDevices = async (): Promise<USBDevice> => {\n const navigatorUsb = getNavigatorUsb();\n\n if (typeof navigatorUsb?.getDevices !== \"function\") return {} as USBDevice;\n const { ledgerUSBVendorId } = await import(\"@ledgerhq/devices\");\n\n const devices = await navigatorUsb?.getDevices();\n const existingDevices = devices.filter((d) => d.vendorId === ledgerUSBVendorId);\n if (existingDevices.length > 0) return existingDevices[0];\n\n return navigatorUsb?.requestDevice({ filters: [{ vendorId: ledgerUSBVendorId }] });\n};\n\nexport const getLedgerTransport = async (): Promise<Transport> => {\n const device = await getLedgerDevices();\n\n if (!device) {\n throw new SwapKitError(\"wallet_ledger_device_not_found\");\n }\n\n device.opened || (await device.open());\n if (device.configuration === null) await device.selectConfiguration(1);\n\n try {\n await device.reset();\n } catch {\n // reset fails on devices that are already open\n }\n\n const configuration = device.configuration ?? device.configurations?.[0];\n\n const iface =\n configuration?.interfaces.find(({ alternates }: { alternates: { interfaceClass: number }[] }) =>\n alternates.some(({ interfaceClass }) => interfaceClass === 0xff),\n ) ||\n configuration?.interfaces.find(({ alternates }: { alternates: { interfaceClass: number }[] }) =>\n alternates.some(({ interfaceClass }) => interfaceClass === 0x03),\n );\n\n if (!iface) {\n await device.close();\n throw new SwapKitError(\"wallet_ledger_connection_error\");\n }\n\n const klass0x03 = (iface.alternates as any[])?.find(\n ({ interfaceClass }: { interfaceClass: number }) => interfaceClass === 0x03,\n )?.interfaceClass as number;\n\n const klass0xff = (iface.alternates as any[])?.find(\n ({ interfaceClass }: { interfaceClass: number }) => interfaceClass === 0xff,\n )?.interfaceClass as number;\n\n if (klass0x03 && !klass0xff) {\n // -------- HID class (NEAR, ETH, SOL, etc.) -> WebHID transport --------\n const TransportWebHID = (await import(\"@ledgerhq/hw-transport-webhid\")).default;\n const supported = await TransportWebHID.isSupported();\n if (!supported) {\n await device.close();\n throw new SwapKitError(\"wallet_ledger_webhid_not_supported\");\n }\n const transport = await TransportWebHID.create();\n return transport;\n }\n\n try {\n await device.claimInterface(iface.interfaceNumber);\n } catch (error: unknown) {\n await device.close();\n\n throw new SwapKitError(\"wallet_ledger_connection_claimed\", error);\n }\n\n const Transport = (await import(\"@ledgerhq/hw-transport-webusb\")).default;\n const isSupported = await Transport.isSupported();\n if (!isSupported) throw new SwapKitError(\"wallet_ledger_webusb_not_supported\");\n\n const { DisconnectedDevice } = await import(\"@ledgerhq/errors\");\n\n const transport = new Transport(device, iface.interfaceNumber);\n\n const onDisconnect = (e: any) => {\n if (device === e.device) {\n getNavigatorUsb()?.removeEventListener(\"disconnect\", onDisconnect);\n\n transport._emitDisconnect(new DisconnectedDevice());\n }\n };\n getNavigatorUsb()?.addEventListener(\"disconnect\", onDisconnect);\n\n return transport as Transport;\n};\n"
6
+ ],
7
+ "mappings": "AAC6B,IAA7B,8BAEM,EAAkB,IACtB,WAAW,IAOP,EAAmB,SAAgC,CACvD,IAAM,EAAe,EAAgB,EAErC,GAAI,OAAO,GAAc,aAAe,WAAY,MAAO,CAAC,EAC5D,IAAQ,qBAAsB,KAAa,6BAGrC,GADU,MAAM,GAAc,WAAW,GACf,OAAO,CAAC,IAAM,EAAE,WAAa,CAAiB,EAC9E,GAAI,EAAgB,OAAS,EAAG,OAAO,EAAgB,GAEvD,OAAO,GAAc,cAAc,CAAE,QAAS,CAAC,CAAE,SAAU,CAAkB,CAAC,CAAE,CAAC,GAGtE,EAAqB,SAAgC,CAChE,IAAM,EAAS,MAAM,EAAiB,EAEtC,GAAI,CAAC,EACH,MAAM,IAAI,eAAa,gCAAgC,EAIzD,GADA,EAAO,QAAW,MAAM,EAAO,KAAK,EAChC,EAAO,gBAAkB,KAAM,MAAM,EAAO,oBAAoB,CAAC,EAErE,GAAI,CACF,MAAM,EAAO,MAAM,EACnB,KAAM,EAIR,IAAM,EAAgB,EAAO,eAAiB,EAAO,iBAAiB,GAEhE,EACJ,GAAe,WAAW,KAAK,EAAG,gBAChC,EAAW,KAAK,EAAG,oBAAqB,IAAmB,GAAI,CACjE,GACA,GAAe,WAAW,KAAK,EAAG,gBAChC,EAAW,KAAK,EAAG,oBAAqB,IAAmB,CAAI,CACjE,EAEF,GAAI,CAAC,EAEH,MADA,MAAM,EAAO,MAAM,EACb,IAAI,eAAa,gCAAgC,EAGzD,IAAM,EAAa,EAAM,YAAsB,KAC7C,EAAG,oBAAiD,IAAmB,CACzE,GAAG,eAEG,EAAa,EAAM,YAAsB,KAC7C,EAAG,oBAAiD,IAAmB,GACzE,GAAG,eAEH,GAAI,GAAa,CAAC,EAAW,CAE3B,IAAM,GAAmB,KAAa,0CAAkC,QAExE,GAAI,CADc,MAAM,EAAgB,YAAY,EAGlD,MADA,MAAM,EAAO,MAAM,EACb,IAAI,eAAa,oCAAoC,EAG7D,OADkB,MAAM,EAAgB,OAAO,EAIjD,GAAI,CACF,MAAM,EAAO,eAAe,EAAM,eAAe,EACjD,MAAO,EAAgB,CAGvB,MAFA,MAAM,EAAO,MAAM,EAEb,IAAI,eAAa,mCAAoC,CAAK,EAGlE,IAAM,GAAa,KAAa,0CAAkC,QAElE,GAAI,CADgB,MAAM,EAAU,YAAY,EAC9B,MAAM,IAAI,eAAa,oCAAoC,EAE7E,IAAQ,sBAAuB,KAAa,4BAEtC,EAAY,IAAI,EAAU,EAAQ,EAAM,eAAe,EAEvD,EAAe,CAAC,IAAW,CAC/B,GAAI,IAAW,EAAE,OACf,EAAgB,GAAG,oBAAoB,aAAc,CAAY,EAEjE,EAAU,gBAAgB,IAAI,CAAoB,GAKtD,OAFA,EAAgB,GAAG,iBAAiB,aAAc,CAAY,EAEvD",
8
+ "debugId": "FCBF0AF43D42884C64756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,4 +1,4 @@
1
- var Zz={};zz(Zz,{keepkeyWallet:()=>t,KEEPKEY_SUPPORTED_CHAINS:()=>Jz});module.exports=e(Zz);var a=require("@keepkey/keepkey-sdk"),z=require("@swapkit/helpers");var k=require("@swapkit/helpers");async function c({sdk:Q,derivationPath:J}){let{DEFAULT_COSMOS_FEE_MAINNET:X,getCosmosToolbox:V,getFeeRateFromSwapKit:$,createStargateClient:Y}=await import("@swapkit/toolboxes/cosmos"),N=J?k.derivationPathToString(J):`${k.DerivationPath.GAIA}/0`,{address:j}=await Q.address.cosmosGetAddress({address_n:v(N)}),L=await V(k.Chain.Cosmos);if(X.amount[0])X.amount[0].amount=String(await $(k.GAIAConfig.chainId,500));return{...L,address:j,transfer:async({assetValue:G,recipient:q,memo:D})=>{let S=G.getBaseValue("string"),O=await L.getAccount(j),F=await Q.cosmos.cosmosSignAmino({signDoc:{account_number:O?.accountNumber.toString()??"",chain_id:k.GAIAConfig.chainId,fee:X,memo:D||"",msgs:[{type:"cosmos-sdk/MsgSend",value:{amount:[{amount:S,denom:"uatom"}],from_address:j,to_address:q}}],sequence:O?.sequence.toString()??""},signerAddress:j}),H=atob(F.serialized),T=new Uint8Array(H.length).map((_,M)=>H.charCodeAt(M)),Z=await k.getRPCUrl(k.Chain.Cosmos);return(await(await Y(Z)).broadcastTx(T)).transactionHash}}}var K=require("@swapkit/helpers"),h=require("ethers");class m extends h.AbstractSigner{sdk;chain;derivationPath;address;provider;constructor({sdk:Q,chain:J,derivationPath:X,provider:V}){super();this.sdk=Q,this.chain=J,this.derivationPath=X||K.NetworkDerivationPath.ETH,this.address="",this.provider=V}signTypedData=async(Q,J,X,V)=>{let{buildEIP712DomainType:$}=await import("@swapkit/toolboxes/evm"),{TypedDataEncoder:Y}=await import("ethers"),{EIP712Domain:N,...j}=J,L=V??Y.from(j).primaryType,R=$(Q),G=await this.getAddress(),q=await this.sdk.eth.ethSignTypedData({address:G,typedData:{domain:Q,message:X,primaryType:L,types:{EIP712Domain:R,...j}}});if(typeof q!=="string")throw new K.SwapKitError("wallet_keepkey_method_not_supported",{method:"signTypedData"});return q.startsWith("0x")?q:`0x${q}`};getAddress=async()=>{if(this.address)return this.address;let{address:Q}=await this.sdk.address.ethereumGetAddress({address_n:v(K.derivationPathToString(this.derivationPath))});return this.address=Q,Q};signMessage=(Q)=>this.sdk.eth.ethSign({address:this.address,message:Q});signTransaction=async({to:Q,value:J,gasLimit:X,nonce:V,data:$,maxFeePerGas:Y,maxPriorityFeePerGas:N,gasPrice:j})=>{if(!Q)throw new K.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing to address"});if(!X)throw new K.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing gasLimit"});if(!$)throw new K.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing data"});let L=!!((Y||N)&&!j);if(L&&!Y)throw new K.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing maxFeePerGas"});if(L&&!N)throw new K.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing maxPriorityFeePerGas"});if(!(L||j))throw new K.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing gasPrice"});let{toHexString:R}=await import("@swapkit/toolboxes/evm"),G=V?BigInt(V):BigInt(await this.provider.getTransactionCount(await this.getAddress(),"pending")),q={addressNList:[2147483692,2147483708,2147483648,0,0],chainId:R(BigInt(K.ChainToChainId[this.chain])),data:$,from:this.address,gas:R(BigInt(X)),nonce:R(G),to:Q.toString(),value:R(BigInt(J||0)),...L&&{maxFeePerGas:R(BigInt(Y?.toString()||"0")),maxPriorityFeePerGas:R(BigInt(N?.toString()||"0"))},...!L&&{gasPrice:R(BigInt(j?.toString()||"0"))}};return(await this.sdk.eth.ethSignTransaction(q)).serialized};sendTransaction=async(Q)=>{if(!this.provider)throw new K.SwapKitError("wallet_keepkey_no_provider");let J=await this.signTransaction(Q);return await this.provider.broadcastTransaction(J)};connect=(Q)=>new m({chain:this.chain,derivationPath:this.derivationPath,provider:Q,sdk:this.sdk})}var f=require("@swapkit/helpers");async function d({sdk:Q,derivationPath:J}){let{createStargateClient:X,getCosmosToolbox:V}=await import("@swapkit/toolboxes/cosmos"),$=await V(f.Chain.Maya),Y=J?f.derivationPathToString(J):`${f.DerivationPath.MAYA}/0`,{address:N}=await Q.address.mayachainGetAddress({address_n:v(Y)}),j=async({assetValue:G,recipient:q,sender:D,memo:S})=>{let O=await import("@cosmjs/amino"),F=O.makeSignDoc??O.default?.makeSignDoc,{getDenomWithChain:H}=await import("@swapkit/toolboxes/cosmos"),T=await $.getAccount(D);if(!T)throw new f.SwapKitError("wallet_keepkey_account_not_found");let{accountNumber:Z,sequence:U=0}=T,I=G.getBaseValue("string"),_=q&&q!=="",M=_?{type:"mayachain/MsgSend",value:{amount:[{amount:I,denom:G.symbol.toLowerCase()}],from_address:D,to_address:q}}:{type:"mayachain/MsgDeposit",value:{coins:[{amount:I,asset:H(G)}],memo:S,signer:D}},P=F([M],{amount:[],gas:"500000000"},f.MAYAConfig.chainId,S,Z?.toString(),U),B=await(_?Q.mayachain.mayachainSignAminoTransfer:Q.mayachain.mayachainSignAminoDeposit)({signDoc:P,signerAddress:D}),b=atob(B.serialized);return new Uint8Array(b.length).map((E,y)=>b.charCodeAt(y))};return{...$,address:N,deposit:async({assetValue:G,memo:q})=>{let D=await f.getRPCUrl(f.Chain.Maya),S=await X(D),O=await j({assetValue:G,memo:q,sender:N}),{transactionHash:F}=await S.broadcastTx(O);return F},transfer:async({assetValue:G,recipient:q,memo:D})=>{let S=await f.getRPCUrl(f.Chain.Maya),O=await X(S),F=await j({assetValue:G,memo:D,recipient:q,sender:N}),{transactionHash:H}=await O.broadcastTx(F);return H}}}var w=require("@swapkit/helpers");async function o({sdk:Q,derivationPath:J}){let X=await import("@cosmjs/amino"),V=X.makeSignDoc??X.default?.makeSignDoc,{buildAminoMsg:$,getDefaultChainFee:Y,createStargateClient:N,getCosmosToolbox:j}=await import("@swapkit/toolboxes/cosmos"),L=await j(w.Chain.THORChain),R=J?w.derivationPathToString(J):`${w.DerivationPath.THOR}/0`,{address:G}=await Q.address.thorchainGetAddress({address_n:v(R)}),q=async({assetValue:O,recipient:F,sender:H,memo:T})=>{let Z=await L.getAccount(H);if(!Z)throw new w.SwapKitError("wallet_keepkey_account_not_found");let{accountNumber:U,sequence:I=0}=Z,_=F&&F!=="",M=$({assetValue:O,memo:T,recipient:F,sender:H}),P=V([M],Y(w.Chain.THORChain),w.THORConfig.chainId,T,U?.toString(),I),A=_?await Q.thorchain.thorchainSignAminoTransfer({signDoc:P,signerAddress:H}):await Q.thorchain.thorchainSignAminoDeposit({signDoc:P,signerAddress:H}),B=atob(A.serialized);return new Uint8Array(B.length).map((b,E)=>B.charCodeAt(E))};return{...L,address:G,deposit:async({assetValue:O,memo:F})=>{let H=await w.getRPCUrl(w.Chain.THORChain),T=await N(H),Z=await q({assetValue:O,memo:F,sender:G}),{transactionHash:U}=await T.broadcastTx(Z);return U},transfer:async({assetValue:O,recipient:F,memo:H})=>{let T=await w.getRPCUrl(w.Chain.THORChain),Z=await N(T),U=await q({assetValue:O,memo:H,recipient:F,sender:G}),{transactionHash:I}=await Z.broadcastTx(U);return I}}}var W=require("@swapkit/helpers"),x=require("@swapkit/toolboxes/utxo");async function r({sdk:Q,chain:J,derivationPath:X}){let{getUtxoToolbox:V}=await import("@swapkit/toolboxes/utxo"),$=await V(J),Y=[W.Chain.Bitcoin,W.Chain.Litecoin].includes(J)?"p2wpkh":"p2pkh",N=X?W.derivationPathToString(X):`${W.DerivationPath[J]}/0`,j={address_n:v(N),coin:l[J],script_type:Y},L=(await Q.address.utxoGetAddress(j)).address,R=x.getNetworkForChain(J),G=async(Z,U,I="")=>{let _=[];for(let A=0;A<Z.outputsLength;A++){let B=Z.getOutput(A),b=Z.getOutputAddress(A,R),E=Number(B.amount);if(b===L)_.push({addressNList:j.address_n,addressType:"change",amount:E,isChange:!0,scriptType:Y});else if(b){let y=J===W.Chain.BitcoinCash?x.stripToCashAddress(b):b;if(y)_.push({address:y,addressType:"spend",amount:E})}}let M=(A)=>{return A.filter((B)=>B!==null&&typeof B==="object"&&Object.keys(B).length>0)};return(await Q.utxo.utxoSignTransaction({coin:l[J],inputs:U,opReturnData:I,outputs:M(_)})).serializedTx?.toString()},q=async({recipient:Z,feeOptionKey:U,feeRate:I,memo:_,...M})=>{if(!L)throw new W.SwapKitError("wallet_keepkey_invalid_params",{reason:"From address must be provided"});if(!Z)throw new W.SwapKitError("wallet_keepkey_invalid_params",{reason:"Recipient address must be provided"});let P=J===W.Chain.BitcoinCash?$.buildTx:$.createTransaction,{tx:A,inputs:B}=await P({...M,feeRate:I||(await $.getFeeRates())[U||W.FeeOption.Fast],fetchTxHex:!0,memo:_,recipient:Z,sender:L}),b=B.map(({value:y,index:C,hash:g,txHex:u})=>({addressNList:j.address_n,amount:y.toString(),hex:u||"",scriptType:Y,txid:g,vout:C})),E=await G(A,b,_);return $.broadcastTx(E)},D=async(Z,U,I="")=>{let _=v(X?W.derivationPathToString(X.slice(0,3)):W.DerivationPath[J]),M=[];for(let B=0;B<Z.outputsLength;B++){let b=Z.getOutput(B),E=Z.getOutputAddress(B,R),y=Number(b.amount);if(E===L)M.push({addressNList:j.address_n,addressType:"change",amount:y,isChange:!0,scriptType:Y});else if(E){let C=J===W.Chain.BitcoinCash?x.stripToCashAddress(E):E;if(C)M.push({address:C,addressType:"spend",amount:y})}}let P=U.map(({hash:B,index:b,value:E,txHex:y,derivationIndex:C,isChange:g})=>{let u=g?1:0;return{addressNList:[..._,u,C],amount:E.toString(),hex:y||"",scriptType:Y,txid:B,vout:b}});return(await Q.utxo.utxoSignTransaction({coin:l[J],inputs:P,opReturnData:I,outputs:M.filter((B)=>B!==null&&typeof B==="object"&&Object.keys(B).length>0)})).serializedTx?.toString()||""},S=async({utxos:Z,recipient:U,assetValue:I,memo:_,feeRate:M,feeOptionKey:P})=>{let A=M||(await $.getFeeRates())[P||W.FeeOption.Fast],B=J===W.Chain.BitcoinCash?$.buildTx:$.createTransaction,{tx:b,inputs:E}=await B({assetValue:I,feeRate:A,fetchTxHex:!0,memo:_,recipient:U,sender:L}),y=E.map((g)=>{let u=Z.find((p)=>p.hash===g.hash&&p.index===g.index);return{...g,derivationIndex:u?.derivationIndex??0,isChange:u?.isChange??!1}}),C=await D(b,y,_);return $.broadcastTx(C)},O=X?W.derivationPathToString(X.slice(0,3)):W.DerivationPath[J].split("/").slice(0,4).join("/");async function F(){try{let Z={address_n:v(O),coin:l[J],script_type:Y,showDisplay:!1,symbol:J.toUpperCase()},U=await Q.system.info.getPublicKey(Z);return{path:O,xpub:U.xpub}}catch(Z){throw new W.SwapKitError("wallet_keepkey_failed_to_get_public_key",{chain:J,error:Z instanceof Error?Z.message:"Unknown error"})}}async function H({index:Z,change:U=!1}){try{let I=`${O}/${Number(U)}/${Z}`,_=await Q.address.utxoGetAddress({address_n:v(I),coin:l[J],script_type:Y}),M=_.address;if(J===W.Chain.BitcoinCash)M=x.stripToCashAddress(_.address);return{address:M,change:U,index:Z,pubkey:""}}catch{return}}let T=x.createHDWalletHelpers({chain:J,deriveAddress:H,getBalance:$.getBalance,getUtxos:(Z)=>x.getUtxoApi(J).getUtxos({address:Z,fetchTxHex:!0})});return{...$,...T,address:L,deriveAddressAtIndex:H,getExtendedPublicKey:F,signTransaction:G,signTransactionWithMultipleInputs:D,transfer:q,transferFromMultipleAddresses:S}}var t=n({connect:({addChain:Q,supportedChains:J,walletType:X})=>async function($,Y){let N=z.filterSupportedChains({chains:$,supportedChains:J,walletType:X}),j=z.SKConfig.get("integrations").keepKey;if(!j)throw Error("KeepKey config not found");let L=z.SKConfig.get("apiKeys").keepKey||"1234";await i();let R={apiKey:L,pairingInfo:j},G=await a.KeepKeySdk.create(R);if(R.apiKey&&R.apiKey!==L)z.SKConfig.setApiKey("keepKey",R.apiKey);return await Promise.all(N.map(async(q)=>{let D=await Qz({chain:q,derivationPath:Y?.[q]||z.NetworkDerivationPath[q],sdk:G}),S=await D.getAddress()||"";Q({...D,address:S,chain:q,walletType:z.WalletOption.KEEPKEY})})),!0},name:"connectKeepkey",supportedChains:[z.Chain.Arbitrum,z.Chain.Avalanche,z.Chain.Base,z.Chain.Berachain,z.Chain.BinanceSmartChain,z.Chain.Bitcoin,z.Chain.BitcoinCash,z.Chain.Cosmos,z.Chain.Dogecoin,z.Chain.Dash,z.Chain.Ethereum,z.Chain.Gnosis,z.Chain.Litecoin,z.Chain.Monad,z.Chain.Ripple,z.Chain.Optimism,z.Chain.Polygon,z.Chain.THORChain,z.Chain.Maya,z.Chain.XLayer],walletType:z.WalletOption.KEEPKEY}),Jz=s(t);async function Qz({sdk:Q,chain:J,derivationPath:X}){let{getProvider:V,getEvmToolboxAsync:$}=await import("@swapkit/toolboxes/evm");switch(J){case z.Chain.BinanceSmartChain:case z.Chain.Arbitrum:case z.Chain.Berachain:case z.Chain.Optimism:case z.Chain.Polygon:case z.Chain.Avalanche:case z.Chain.Base:case z.Chain.Ethereum:case z.Chain.Gnosis:case z.Chain.Monad:case z.Chain.XLayer:{let Y=await V(J),N=new m({chain:J,derivationPath:X,provider:Y,sdk:Q});return await $(J,{provider:Y,signer:N})}case z.Chain.Cosmos:return c({derivationPath:X,sdk:Q});case z.Chain.THORChain:return o({derivationPath:X,sdk:Q});case z.Chain.Maya:return d({derivationPath:X,sdk:Q});case z.Chain.Bitcoin:case z.Chain.BitcoinCash:case z.Chain.Dash:case z.Chain.Dogecoin:case z.Chain.Litecoin:return r({chain:J,derivationPath:X,sdk:Q});case z.Chain.Ripple:{let{rippleWalletMethods:Y}=await import("../chunk-8sth2w05.js");return Y({derivationPath:X,sdk:Q})}default:throw new z.SwapKitError("wallet_keepkey_chain_not_supported",{chain:J})}}async function i(Q=0){if(Q>=3)alert("KeepKey desktop is required for keepkey-sdk, please go to https://keepkey.com/get-started");if(!await Xz())window.location.assign("keepkey://launch"),await new Promise((X)=>setTimeout(X,30000)),await i(Q+1)}async function Xz(Q="http://localhost:1646/spec/swagger.json"){try{return(await fetch(Q)).status===200}catch{return!1}}
1
+ var Zz={};zz(Zz,{keepkeyWallet:()=>i,KEEPKEY_SUPPORTED_CHAINS:()=>Jz});module.exports=e(Zz);var a=require("@keepkey/keepkey-sdk"),z=require("@swapkit/helpers"),c=require("@swapkit/wallet-core");var x=require("@swapkit/helpers");async function d({sdk:Q,derivationPath:J}){let{DEFAULT_COSMOS_FEE_MAINNET:X,getCosmosToolbox:E,getFeeRateFromSwapKit:Y,createStargateClient:q}=await import("@swapkit/toolboxes/cosmos"),M=J?x.derivationPathToString(J):`${x.DerivationPath.GAIA}/0`,{address:B}=await Q.address.cosmosGetAddress({address_n:v(M)}),L=await E(x.Chain.Cosmos);if(X.amount[0])X.amount[0].amount=String(await Y(x.GAIAConfig.chainId,500));return{...L,address:B,transfer:async({assetValue:U,recipient:j,memo:F})=>{let y=U.getBaseValue("string"),b=await L.getAccount(B),K=await Q.cosmos.cosmosSignAmino({signDoc:{account_number:b?.accountNumber.toString()??"",chain_id:x.GAIAConfig.chainId,fee:X,memo:F||"",msgs:[{type:"cosmos-sdk/MsgSend",value:{amount:[{amount:y,denom:"uatom"}],from_address:B,to_address:j}}],sequence:b?.sequence.toString()??""},signerAddress:B}),V=atob(K.serialized),k=new Uint8Array(V.length).map((_,W)=>V.charCodeAt(W)),P=await x.getRPCUrl(x.Chain.Cosmos);return(await(await q(P)).broadcastTx(k)).transactionHash}}}var A=require("@swapkit/helpers"),o=require("ethers");class p extends o.AbstractSigner{sdk;chain;derivationPath;address;provider;constructor({sdk:Q,chain:J,derivationPath:X,provider:E}){super();this.sdk=Q,this.chain=J,this.derivationPath=X||A.NetworkDerivationPath.ETH,this.address="",this.provider=E}signTypedData=async(Q,J,X,E)=>{let{buildEIP712DomainType:Y}=await import("@swapkit/toolboxes/evm"),{TypedDataEncoder:q}=await import("ethers"),{EIP712Domain:M,...B}=J,L=E??q.from(B).primaryType,N=Y(Q),U=await this.getAddress(),j=await this.sdk.eth.ethSignTypedData({address:U,typedData:{domain:Q,message:X,primaryType:L,types:{EIP712Domain:N,...B}}});if(typeof j!=="string")throw new A.SwapKitError("wallet_keepkey_method_not_supported",{method:"signTypedData"});return j.startsWith("0x")?j:`0x${j}`};getAddress=async()=>{if(this.address)return this.address;let{address:Q}=await this.sdk.address.ethereumGetAddress({address_n:v(A.derivationPathToString(this.derivationPath))});return this.address=Q,Q};signMessage=(Q)=>this.sdk.eth.ethSign({address:this.address,message:Q});signTransaction=async({to:Q,value:J,gasLimit:X,nonce:E,data:Y,maxFeePerGas:q,maxPriorityFeePerGas:M,gasPrice:B})=>{if(!Q)throw new A.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing to address"});if(!X)throw new A.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing gasLimit"});if(!Y)throw new A.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing data"});let L=!!((q||M)&&!B);if(L&&!q)throw new A.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing maxFeePerGas"});if(L&&!M)throw new A.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing maxPriorityFeePerGas"});if(!(L||B))throw new A.SwapKitError("wallet_keepkey_invalid_params",{reason:"Missing gasPrice"});let{toHexString:N}=await import("@swapkit/toolboxes/evm"),U=E?BigInt(E):BigInt(await this.provider.getTransactionCount(await this.getAddress(),"pending")),j={addressNList:[2147483692,2147483708,2147483648,0,0],chainId:N(BigInt(A.ChainToChainId[this.chain])),data:Y,from:this.address,gas:N(BigInt(X)),nonce:N(U),to:Q.toString(),value:N(BigInt(J||0)),...L&&{maxFeePerGas:N(BigInt(q?.toString()||"0")),maxPriorityFeePerGas:N(BigInt(M?.toString()||"0"))},...!L&&{gasPrice:N(BigInt(B?.toString()||"0"))}};return(await this.sdk.eth.ethSignTransaction(j)).serialized};sendTransaction=async(Q)=>{if(!this.provider)throw new A.SwapKitError("wallet_keepkey_no_provider");let J=await this.signTransaction(Q);return await this.provider.broadcastTransaction(J)};connect=(Q)=>new p({chain:this.chain,derivationPath:this.derivationPath,provider:Q,sdk:this.sdk})}var S=require("@swapkit/helpers");async function r({sdk:Q,derivationPath:J}){let{createStargateClient:X,getCosmosToolbox:E}=await import("@swapkit/toolboxes/cosmos"),Y=await E(S.Chain.Maya),q=J?S.derivationPathToString(J):`${S.DerivationPath.MAYA}/0`,{address:M}=await Q.address.mayachainGetAddress({address_n:v(q)}),B=async({assetValue:U,recipient:j,sender:F,memo:y})=>{let b=await import("@cosmjs/amino"),K=b.makeSignDoc??b.default?.makeSignDoc,{getDenomWithChain:V}=await import("@swapkit/toolboxes/cosmos"),k=await Y.getAccount(F);if(!k)throw new S.SwapKitError("wallet_keepkey_account_not_found");let{accountNumber:P,sequence:Z=0}=k,$=U.getBaseValue("string"),_=j&&j!=="",W=_?{type:"mayachain/MsgSend",value:{amount:[{amount:$,denom:U.symbol.toLowerCase()}],from_address:F,to_address:j}}:{type:"mayachain/MsgDeposit",value:{coins:[{amount:$,asset:V(U)}],memo:y,signer:F}},H=K([W],{amount:[],gas:"500000000"},S.MAYAConfig.chainId,y,P?.toString(),Z),O=await(_?Q.mayachain.mayachainSignAminoTransfer:Q.mayachain.mayachainSignAminoDeposit)({signDoc:H,signerAddress:F}),G=atob(O.serialized);return new Uint8Array(G.length).map((T,f)=>G.charCodeAt(f))};return{...Y,address:M,deposit:async({assetValue:U,memo:j})=>{let F=await S.getRPCUrl(S.Chain.Maya),y=await X(F),b=await B({assetValue:U,memo:j,sender:M}),{transactionHash:K}=await y.broadcastTx(b);return K},transfer:async({assetValue:U,recipient:j,memo:F})=>{let y=await S.getRPCUrl(S.Chain.Maya),b=await X(y),K=await B({assetValue:U,memo:F,recipient:j,sender:M}),{transactionHash:V}=await b.broadcastTx(K);return V}}}var w=require("@swapkit/helpers");async function s({sdk:Q,derivationPath:J}){let X=await import("@cosmjs/amino"),E=X.makeSignDoc??X.default?.makeSignDoc,{buildAminoMsg:Y,getDefaultChainFee:q,createStargateClient:M,getCosmosToolbox:B}=await import("@swapkit/toolboxes/cosmos"),L=await B(w.Chain.THORChain),N=J?w.derivationPathToString(J):`${w.DerivationPath.THOR}/0`,{address:U}=await Q.address.thorchainGetAddress({address_n:v(N)}),j=async({assetValue:b,recipient:K,sender:V,memo:k})=>{let P=await L.getAccount(V);if(!P)throw new w.SwapKitError("wallet_keepkey_account_not_found");let{accountNumber:Z,sequence:$=0}=P,_=K&&K!=="",W=Y({assetValue:b,memo:k,recipient:K,sender:V}),H=E([W],q(w.Chain.THORChain),w.THORConfig.chainId,k,Z?.toString(),$),I=_?await Q.thorchain.thorchainSignAminoTransfer({signDoc:H,signerAddress:V}):await Q.thorchain.thorchainSignAminoDeposit({signDoc:H,signerAddress:V}),O=atob(I.serialized);return new Uint8Array(O.length).map((G,T)=>O.charCodeAt(T))};return{...L,address:U,deposit:async({assetValue:b,memo:K})=>{let V=await w.getRPCUrl(w.Chain.THORChain),k=await M(V),P=await j({assetValue:b,memo:K,sender:U}),{transactionHash:Z}=await k.broadcastTx(P);return Z},transfer:async({assetValue:b,recipient:K,memo:V})=>{let k=await w.getRPCUrl(w.Chain.THORChain),P=await M(k),Z=await j({assetValue:b,memo:V,recipient:K,sender:U}),{transactionHash:$}=await P.broadcastTx(Z);return $}}}var R=require("@swapkit/helpers"),D=require("@swapkit/toolboxes/utxo");async function n({sdk:Q,chain:J,derivationPath:X}){let{getUtxoToolbox:E}=await import("@swapkit/toolboxes/utxo"),Y=await E(J),q=[R.Chain.Bitcoin,R.Chain.Litecoin].includes(J)?"p2wpkh":"p2pkh",M=X?R.derivationPathToString(X):`${R.DerivationPath[J]}/0`,B={address_n:v(M),coin:m[J],script_type:q},L=(await Q.address.utxoGetAddress(B)).address,N=D.getNetworkForChain(J),U=async(Z,$,_="")=>{let W=[];for(let O=0;O<Z.outputsLength;O++){let G=Z.getOutput(O),T=Z.getOutputAddress(O,N),f=Number(G.amount);if(T===L)W.push({addressNList:B.address_n,addressType:"change",amount:f,isChange:!0,scriptType:q});else if(T){let g=J===R.Chain.BitcoinCash?D.stripToCashAddress(T):T;if(g)W.push({address:g,addressType:"spend",amount:f})}}let H=(O)=>{return O.filter((G)=>G!==null&&typeof G==="object"&&Object.keys(G).length>0)};return(await Q.utxo.utxoSignTransaction({coin:m[J],inputs:$,opReturnData:_,outputs:H(W)})).serializedTx?.toString()},j=async({recipient:Z,feeOptionKey:$,feeRate:_,memo:W,...H})=>{if(!L)throw new R.SwapKitError("wallet_keepkey_invalid_params",{reason:"From address must be provided"});if(!Z)throw new R.SwapKitError("wallet_keepkey_invalid_params",{reason:"Recipient address must be provided"});let I=J===R.Chain.BitcoinCash?Y.buildTx:Y.createTransaction,{tx:O,inputs:G}=await I({...H,feeRate:_||(await Y.getFeeRates())[$||R.FeeOption.Fast],fetchTxHex:!0,memo:W,recipient:Z,sender:L}),T=G.map(({value:g,index:C,hash:u,txHex:l})=>({addressNList:B.address_n,amount:g.toString(),hex:l||"",scriptType:q,txid:u,vout:C})),f=await U(O,T,W);return Y.broadcastTx(f)},F=async(Z,$,_="")=>{let W=v(X?R.derivationPathToString(X.slice(0,3)):R.DerivationPath[J]),H=[];for(let G=0;G<Z.outputsLength;G++){let T=Z.getOutput(G),f=Z.getOutputAddress(G,N),g=Number(T.amount);if(f===L)H.push({addressNList:B.address_n,addressType:"change",amount:g,isChange:!0,scriptType:q});else if(f){let C=J===R.Chain.BitcoinCash?D.stripToCashAddress(f):f;if(C)H.push({address:C,addressType:"spend",amount:g})}}let I=$.map(({hash:G,index:T,value:f,txHex:g,derivationIndex:C,isChange:u})=>{let l=u?1:0;return{addressNList:[...W,l,C],amount:f.toString(),hex:g||"",scriptType:q,txid:G,vout:T}});return(await Q.utxo.utxoSignTransaction({coin:m[J],inputs:I,opReturnData:_,outputs:H.filter((G)=>G!==null&&typeof G==="object"&&Object.keys(G).length>0)})).serializedTx?.toString()||""},y=async({utxos:Z,recipient:$,assetValue:_,memo:W,feeRate:H,feeOptionKey:I})=>{let O=H||(await Y.getFeeRates())[I||R.FeeOption.Fast],G=J===R.Chain.BitcoinCash?Y.buildTx:Y.createTransaction,{tx:T,inputs:f}=await G({assetValue:_,feeRate:O,fetchTxHex:!0,memo:W,recipient:$,sender:L}),g=f.map((u)=>{let l=Z.find((h)=>h.hash===u.hash&&h.index===u.index);return{...u,derivationIndex:l?.derivationIndex??0,isChange:l?.isChange??!1}}),C=await F(T,g,W);return Y.broadcastTx(C)};async function b({accountIndex:Z}={}){try{let $=D.getUTXOAccountPath({accountIndex:Z,chain:J,derivationPath:X}),_=R.derivationPathToString($),W={address_n:v(_),coin:m[J],script_type:q,showDisplay:!1,symbol:J.toUpperCase()},H=await Q.system.info.getPublicKey(W);return{accountIndex:D.getUTXOAccountIndexFromPath($),path:_,xpub:H.xpub}}catch($){throw new R.SwapKitError("wallet_keepkey_failed_to_get_public_key",{chain:J,error:$ instanceof Error?$.message:"Unknown error"})}}function K(){return b()}async function V({accountIndex:Z,index:$,change:_=!1}){try{D.assertDerivationIndex("index",$);let W=D.getUTXOAddressPath({accountIndex:Z,chain:J,change:_,derivationPath:X,index:$}),H=R.derivationPathToString(W),I=await Q.address.utxoGetAddress({address_n:v(H),coin:m[J],script_type:q}),O=I.address;if(J===R.Chain.BitcoinCash)O=D.stripToCashAddress(I.address);return{accountIndex:D.getUTXOAccountIndexFromPath(W),address:O,change:_,index:$,path:H,pubkey:""}}catch{return}}async function k({accountIndex:Z,count:$,startIndex:_=0,change:W=!1}){return D.assertDerivationIndex("count",$),D.assertDerivationIndex("startIndex",_),(await Promise.all(Array.from({length:$},(I,O)=>V({accountIndex:Z,change:W,index:_+O})))).filter((I)=>!!I)}let P=D.createHDWalletHelpers({chain:J,deriveAddress:V,getBalance:Y.getBalance,getUtxos:(Z)=>D.getUtxoApi(J).getUtxos({address:Z,fetchTxHex:!0})});return{...Y,...P,address:L,deriveAddressAtIndex:V,deriveAddresses:k,getExtendedPublicKey:K,getExtendedPublicKeyInfo:b,signTransaction:U,signTransactionWithMultipleInputs:F,transfer:j,transferFromMultipleAddresses:y}}var i=c.createWallet({connect:({addChain:Q,supportedChains:J,walletType:X})=>async function(Y,q){let M=z.filterSupportedChains({chains:Y,supportedChains:J,walletType:X}),B=z.SKConfig.get("integrations").keepKey;if(!B)throw Error("KeepKey config not found");let L=z.SKConfig.get("apiKeys").keepKey||"1234";await t();let N={apiKey:L,pairingInfo:B},U=await a.KeepKeySdk.create(N);if(N.apiKey&&N.apiKey!==L)z.SKConfig.setApiKey("keepKey",N.apiKey);return await Promise.all(M.map(async(j)=>{let F=await Qz({chain:j,derivationPath:q?.[j]||z.NetworkDerivationPath[j],sdk:U}),y=await F.getAddress()||"";Q({...F,address:y,chain:j,walletType:z.WalletOption.KEEPKEY})})),!0},directSigningSupport:{[z.Chain.Arbitrum]:!0,[z.Chain.Avalanche]:!0,[z.Chain.Base]:!0,[z.Chain.Berachain]:!0,[z.Chain.BinanceSmartChain]:!0,[z.Chain.Ethereum]:!0,[z.Chain.Gnosis]:!0,[z.Chain.Monad]:!0,[z.Chain.Optimism]:!0,[z.Chain.Polygon]:!0,[z.Chain.Ripple]:!0,[z.Chain.XLayer]:!0},name:"connectKeepkey",supportedChains:[z.Chain.Arbitrum,z.Chain.Avalanche,z.Chain.Base,z.Chain.Berachain,z.Chain.BinanceSmartChain,z.Chain.Bitcoin,z.Chain.BitcoinCash,z.Chain.Cosmos,z.Chain.Dogecoin,z.Chain.Dash,z.Chain.Ethereum,z.Chain.Gnosis,z.Chain.Litecoin,z.Chain.Monad,z.Chain.Ripple,z.Chain.Optimism,z.Chain.Polygon,z.Chain.THORChain,z.Chain.Maya,z.Chain.XLayer],walletType:z.WalletOption.KEEPKEY}),Jz=c.getWalletSupportedChains(i);async function Qz({sdk:Q,chain:J,derivationPath:X}){let{getProvider:E,getEvmToolboxAsync:Y}=await import("@swapkit/toolboxes/evm");switch(J){case z.Chain.BinanceSmartChain:case z.Chain.Arbitrum:case z.Chain.Berachain:case z.Chain.Optimism:case z.Chain.Polygon:case z.Chain.Avalanche:case z.Chain.Base:case z.Chain.Ethereum:case z.Chain.Gnosis:case z.Chain.Monad:case z.Chain.XLayer:{let q=await E(J),M=new p({chain:J,derivationPath:X,provider:q,sdk:Q});return await Y(J,{provider:q,signer:M})}case z.Chain.Cosmos:return d({derivationPath:X,sdk:Q});case z.Chain.THORChain:return s({derivationPath:X,sdk:Q});case z.Chain.Maya:return r({derivationPath:X,sdk:Q});case z.Chain.Bitcoin:case z.Chain.BitcoinCash:case z.Chain.Dash:case z.Chain.Dogecoin:case z.Chain.Litecoin:return n({chain:J,derivationPath:X,sdk:Q});case z.Chain.Ripple:{let{rippleWalletMethods:q}=await import("../chunk-8sth2w05.js");return q({derivationPath:X,sdk:Q})}default:throw new z.SwapKitError("wallet_keepkey_chain_not_supported",{chain:J})}}async function t(Q=0){if(Q>=3)alert("KeepKey desktop is required for keepkey-sdk, please go to https://keepkey.com/get-started");if(!await Xz())window.location.assign("keepkey://launch"),await new Promise((X)=>setTimeout(X,30000)),await t(Q+1)}async function Xz(Q="http://localhost:1646/spec/swagger.json"){try{return(await fetch(Q)).status===200}catch{return!1}}
2
2
 
3
- //# debugId=4A54D3522022FD9164756E2164756E21
3
+ //# debugId=7F2AAC7C8609AFB764756E2164756E21
4
4
  //# sourceMappingURL=index.cjs.map