{
  "version": 3,
  "sources": ["../src/keystore.ts", "../src/keystore-helpers.ts"],
  "sourcesContent": [
    "import {\n  type AssetValue,\n  Chain,\n  CosmosChains,\n  type DerivationPathArray,\n  EVMChains,\n  filterSupportedChains,\n  NetworkDerivationPath,\n  type UTXOChain,\n  UTXOChains,\n  updateDerivationPath,\n  WalletOption,\n} from \"@swapkit/helpers\";\nimport type { DerivedAddress, FullWallet } from \"@swapkit/toolboxes\";\nimport { createWallet, getWalletSupportedChains } from \"@swapkit/wallet-core\";\n\nexport {\n  decryptFromKeystore,\n  encryptToKeyStore,\n  generatePhrase,\n  type Keystore,\n  validatePhrase,\n} from \"./keystore-helpers\";\n\ntype UTXOToolboxWithHD = {\n  deriveAddressAtIndex: (params: { index: number; change?: boolean }) => DerivedAddress | undefined;\n  getExtendedPublicKey: () => string | undefined;\n  getBalance: (address: string) => Promise<AssetValue[]>;\n  resolveDerivationIndex?: (params: {\n    address: string;\n    gapLimit?: number;\n  }) => { index: number; change: boolean } | undefined;\n  transferFromMultipleAddresses?: (params: {\n    utxos: Array<{\n      hash: string;\n      index: number;\n      value: number;\n      txHex?: string;\n      derivationIndex: number;\n      isChange: boolean;\n      address: string;\n    }>;\n    recipient: string;\n    assetValue: AssetValue;\n    memo?: string;\n    feeRate?: number;\n  }) => Promise<string>;\n};\n\nfunction isUTXOToolboxWithHD(toolbox: unknown): toolbox is UTXOToolboxWithHD {\n  return (\n    typeof toolbox === \"object\" &&\n    toolbox !== null &&\n    \"deriveAddressAtIndex\" in toolbox &&\n    typeof (toolbox as UTXOToolboxWithHD).deriveAddressAtIndex === \"function\" &&\n    \"getExtendedPublicKey\" in toolbox &&\n    typeof (toolbox as UTXOToolboxWithHD).getExtendedPublicKey === \"function\" &&\n    \"getBalance\" in toolbox &&\n    typeof (toolbox as UTXOToolboxWithHD).getBalance === \"function\"\n  );\n}\n\nasync function createHDWalletMethods(chain: UTXOChain, toolbox: UTXOToolboxWithHD) {\n  const { createHDWalletHelpers, getUtxoApi } = await import(\"@swapkit/toolboxes/utxo\");\n\n  function deriveAddresses(params: { count: number; startIndex?: number; change?: boolean }) {\n    const { count, startIndex = 0, change = false } = params;\n    if (count < 1 || count > 1000) throw new RangeError(`count must be between 1 and 1000, got ${count}`);\n    if (startIndex < 0) throw new RangeError(`startIndex must be non-negative, got ${startIndex}`);\n\n    const addresses: DerivedAddress[] = [];\n    for (let i = 0; i < count; i++) {\n      const derived = toolbox.deriveAddressAtIndex({ change, index: startIndex + i });\n      if (derived) addresses.push(derived);\n    }\n    return addresses;\n  }\n\n  const { scanForAddresses, getAggregatedBalance, getAggregatedUtxos } = createHDWalletHelpers({\n    chain,\n    deriveAddress: (params) => toolbox.deriveAddressAtIndex(params),\n    getBalance: toolbox.getBalance,\n    getUtxos: (address: string) => getUtxoApi(chain).getUtxos({ address, fetchTxHex: true }),\n  });\n\n  return { deriveAddresses, getAggregatedBalance, getAggregatedUtxos, scanForAddresses };\n}\n\nexport const keystoreWallet = createWallet({\n  connect: ({ addChain }) =>\n    async function connectKeystore(\n      chains: Chain[],\n      phrase: string,\n      derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number,\n    ) {\n      const wallets = await createKeystoreWallet({ chains, derivationPathMapOrIndex, phrase });\n\n      for (const wallet of Object.values(wallets)) {\n        addChain({ ...wallet, chain: wallet.chain, walletType: WalletOption.KEYSTORE });\n      }\n\n      return true;\n    },\n  // Keystore holds the private key — direct signing works for every supported chain.\n  directSigningSupport: {\n    ...Object.fromEntries(EVMChains.map((chain) => [chain, true])),\n    ...Object.fromEntries(UTXOChains.map((chain) => [chain, true])),\n    ...Object.fromEntries(CosmosChains.filter((chain) => chain !== Chain.Harbor).map((chain) => [chain, true])),\n    [Chain.Aptos]: true,\n    [Chain.Cardano]: true,\n    [Chain.Near]: true,\n    [Chain.Ripple]: true,\n    [Chain.Solana]: true,\n    [Chain.Stellar]: true,\n    [Chain.Sui]: true,\n    [Chain.Ton]: true,\n    [Chain.Tron]: true,\n  },\n  name: \"connectKeystore\",\n  supportedChains: [\n    ...EVMChains,\n    ...UTXOChains,\n    ...CosmosChains.filter((chain) => chain !== Chain.Harbor),\n    Chain.Aptos,\n    Chain.Cardano,\n    Chain.Ripple,\n    Chain.Solana,\n    Chain.Stellar,\n    Chain.Sui,\n    Chain.Ton,\n    Chain.Tron,\n    Chain.Near,\n  ],\n  walletType: WalletOption.KEYSTORE,\n});\n\nexport const KEYSTORE_SUPPORTED_CHAINS = getWalletSupportedChains(keystoreWallet);\n\nexport async function createKeystoreWallet<T extends Chain[]>({\n  chains,\n  phrase,\n  derivationPathMapOrIndex,\n}: {\n  chains: T;\n  phrase: string;\n  derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number;\n}) {\n  const filteredChains = filterSupportedChains({\n    chains,\n    supportedChains: KEYSTORE_SUPPORTED_CHAINS,\n    walletType: WalletOption.KEYSTORE,\n  });\n\n  const wallets = await Promise.all(\n    filteredChains.map(async (chain) => {\n      const { getToolbox } = await import(\"@swapkit/toolboxes\");\n\n      const derivationPathIndex = typeof derivationPathMapOrIndex === \"number\" ? derivationPathMapOrIndex : 0;\n      const derivationPathFromMap =\n        derivationPathMapOrIndex && typeof derivationPathMapOrIndex === \"object\"\n          ? derivationPathMapOrIndex[chain]\n          : undefined;\n\n      const derivationArrayToUpdate = NetworkDerivationPath[chain].slice(\n        0,\n        chain === Chain.Solana ? 4 : 5,\n      ) as DerivationPathArray;\n\n      const derivationPath: DerivationPathArray =\n        derivationPathFromMap || updateDerivationPath(derivationArrayToUpdate, { index: derivationPathIndex });\n\n      const toolbox = await getToolbox(chain, { derivationPath, phrase });\n      const address = (await toolbox.getAddress()) || \"\";\n\n      const hdWalletMethods =\n        UTXOChains.includes(chain as UTXOChain) && isUTXOToolboxWithHD(toolbox)\n          ? await createHDWalletMethods(chain as UTXOChain, toolbox)\n          : {};\n\n      const wallet = { ...toolbox, ...hdWalletMethods, address, chain };\n\n      return wallet;\n    }),\n  );\n\n  return wallets.reduce(\n    (acc, wallet) => {\n      acc[wallet.chain as T[number]] = wallet as FullWallet[T[number]];\n      return acc;\n    },\n    {} as { [key in T[number]]: FullWallet[key] },\n  );\n}\n",
    "import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes } from \"node:crypto\";\nimport { generateMnemonic, validateMnemonic } from \"@scure/bip39\";\nimport { wordlist } from \"@scure/bip39/wordlists/english.js\";\n\nexport type Keystore = {\n  version: number;\n  meta: string;\n  crypto: {\n    cipher: string;\n    cipherparams: { iv: string };\n    ciphertext: string;\n    kdf: string;\n    kdfparams: { prf: string; dklen: number; salt: string; c: number };\n    mac: string;\n  };\n};\n\nasync function blake256(initData: Buffer | string) {\n  const { blake2b } = await import(\"@noble/hashes/blake2.js\");\n  const data = initData instanceof Buffer ? initData : Buffer.from(initData as string, \"hex\");\n\n  const hash = blake2b(data, { dkLen: 32 });\n\n  return Array.from(hash as Uint8Array)\n    .map((byte) => (byte < 0x10 ? `0${byte.toString(16)}` : byte.toString(16)))\n    .join(\"\");\n}\n\nexport async function encryptToKeyStore(phrase: string, password: string) {\n  const cipher = \"aes-128-ctr\";\n  const iv = randomBytes(16);\n  const salt = randomBytes(32);\n  const kdfParams = { c: 262144, dklen: 32, prf: \"hmac-sha256\", salt: salt.toString(\"hex\") };\n\n  const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, \"sha256\");\n  const cipherIV = createCipheriv(cipher, derivedKey.subarray(0, 16), iv);\n  const ciphertext = Buffer.concat([cipherIV.update(Buffer.from(phrase, \"utf8\")), cipherIV.final()]);\n  const initData = Buffer.concat([derivedKey.subarray(16, 32), Buffer.from(ciphertext)]);\n  const mac = await blake256(initData);\n\n  return {\n    crypto: {\n      cipher,\n      cipherparams: { iv: iv.toString(\"hex\") },\n      ciphertext: ciphertext.toString(\"hex\"),\n      kdf: \"pbkdf2\",\n      kdfparams: kdfParams,\n      mac,\n    },\n    meta: \"xchain-keystore\",\n    version: 1,\n  };\n}\n\nexport function generatePhrase(size: 12 | 24 = 12) {\n  return generateMnemonic(wordlist, size === 12 ? 128 : 256);\n}\n\nexport function validatePhrase(phrase: string) {\n  return validateMnemonic(phrase, wordlist);\n}\n\nexport async function decryptFromKeystore(keystore: Keystore, password: string) {\n  const { SwapKitError } = await import(\"@swapkit/helpers\");\n\n  switch (keystore.version) {\n    case 1: {\n      const kdfParams = keystore.crypto.kdfparams;\n      const salt = Buffer.from(kdfParams.salt, \"hex\");\n      const derivedKey = pbkdf2Sync(password, salt, kdfParams.c, kdfParams.dklen, \"sha256\");\n\n      const ciphertext = Buffer.from(keystore.crypto.ciphertext, \"hex\");\n      const initData = Buffer.concat([derivedKey.subarray(16, 32), ciphertext]);\n      const mac = await blake256(initData);\n\n      if (mac !== keystore.crypto.mac) {\n        throw new SwapKitError(\"wallet_keystore_invalid_password\");\n      }\n\n      const decipher = createDecipheriv(\n        keystore.crypto.cipher,\n        derivedKey.subarray(0, 16),\n        Buffer.from(keystore.crypto.cipherparams.iv, \"hex\"),\n      );\n\n      const phrase = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n      return phrase.toString(\"utf8\");\n    }\n\n    default:\n      throw new SwapKitError(\"wallet_keystore_unsupported_version\");\n  }\n}\n"
  ],
  "mappings": "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",
  "debugId": "95B52BFC4705C8F264756E2164756E21",
  "names": []
}